MyTracks 読み (8)

ログを export しているあたりを確認せねば、という事で掘削。
ログのリスト表示は MyTracksList.java に書いてある模様。onClick の実装が以下。

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.tracklist_btn_delete_all: {
        Handler h = new MyTracksDeleteAllTracks(this, null);
        h.handleMessage(null);
        break;
      }
      case R.id.tracklist_btn_export_all: {
        new ExportAllTracks(this);
        break;
      }
    }
  }

ExportAllTracks はどこで定義されているのやら。

Exlipse 凄い

コンストラクタマウスポインタを持ってったらパケジとかの情報が出ました。com.google.android.apps.mytracks.ExportAllTracks との事。核心は exportAll メソドか。
このあたりかな。

        long id = cursor.getLong(idxTrackId);
        Log.i(MyTracksConstants.TAG, "ExportAllTracks: exporting: " + id);
        TrackWriterFactory.newWriter(context, providerUtils, id, format)
            .writeTrack();

com.google.android.apps.mytracks.io.TrackWriterFactory か。この Factory Method なソレは TrackWrite をナニするんですが、TrackWriter の核心が以下な模様。

  /**
   * Does the actual work of writing the track to the now open file.
   */
  void writeDocument() {
    Log.d(MyTracksConstants.TAG, "Started writing track.");
    writer.writeHeader();
    TrackBuffer buffer = new TrackBuffer(1024);
    Location last = null;
    boolean wroteFirst = false;
    boolean segmentOpen = false;
    int nValidLocations = 0;

    // Fetch small pieces of the track.
    while (buffer.getLastLocationRead() < track.getStopId()) {
      Log.d(MyTracksConstants.TAG,
          "Reading track points starting at: " + buffer.getLastLocationRead());
      providerUtils.getTrackPoints(track, buffer);
      if (!wroteFirst) {
        Location first = buffer.findStartLocation();
        writer.writeBeginTrack(first);
        wroteFirst = true;
      }

      Log.d(MyTracksConstants.TAG,
            "Reading " + buffer.getLocationsLoaded()
            + " Ending at: " + buffer.getLastLocationRead());
      for (int i = 0; i < buffer.getLocationsLoaded(); i++) {
        Location location = buffer.get(i);
        if (MyTracksUtils.isValidLocation(location)) {
          nValidLocations++;
          if (!segmentOpen) {
            writer.writeOpenSegment();
            segmentOpen = true;
          }
          writer.writeLocation(location);
          if (nValidLocations >= 2) {
            last = location;
          }
        } else {
          nValidLocations = 0;
          last = null;
          if (segmentOpen) {
            writer.writeCloseSegment();
            segmentOpen = false;
          }
        }
      }
    }
    if (segmentOpen) {
      writer.writeCloseSegment();
      segmentOpen = false;
    }
    if (wroteFirst) {
      writer.writeEndTrack(last);
    }
    writeWaypoints(track.getId());
    writer.writeFooter();
    writer.close();
    success = true;
    Log.d(MyTracksConstants.TAG, "Done writing track.");
    errorMessage = R.string.io_write_finished;
  }
}

ちょっと限界っぽいのでこのあたりを明日がつっと掘削という事で今日はクタバります。