MyTracks 読み (11)

へろへろです。足をケガしている模様。午後、行きつけの整形外科に久々に行って見て頂いた結果、とりあえず骨には異常は見られないとの事。
何故かは内緒です。ってそれは良いとして保存されているソレを読み込んで云々なあたりを確認。
MyTracks な Activity で OptionMenu から Tracks 選択したらリストビューが出てきます。そのあたりが以下かな。MyTracks#onOptionItemSelected メソドにて以下な部分。

      case MyTracksConstants.MENU_LIST_TRACKS: {
        Intent startIntent = new Intent(this, MyTracksList.class);
        startActivityForResult(startIntent, MyTracksConstants.SHOW_TRACK);
        return true;
      }

MyTracksList が次ッスか。で、MyTracksList#onListItemClick が以下となっておりまして

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    Intent result = new Intent();
    result.putExtra("trackid", id);
    setResult(MyTracksConstants.SHOW_TRACK, result);
    finish();
  }

setResult して finish しておりますな。ええと MyTracks#onActivityResult が上記 setResult なソレを受けるはずなんですが、以下かな。

      case MyTracksConstants.SHOW_TRACK: {
        if (results != null) {
          final long trackId = results.getLongExtra("trackid", -1);
          if (trackId >= 0) {
            setSelectedTrack(trackId);
            // The track list passed the requested action as result code. Hand
            // it off to the onAcitivtyResult for further processing:
            if (resultCode != MyTracksConstants.SHOW_TRACK) {
              onActivityResult(resultCode, Activity.RESULT_OK, results);
            }
          }
        }
        break;
      }

ええと、とりあえず MyTracks#setSelectedTrack の定義が以下。

  /**
   * Writes the selected track id to the shared preferences.
   * Executed on the UI thread.
   *
   * @param trackId the id of the track
   */
  private void setSelectedTrack(final long trackId) {
    runOnUiThread(new Runnable() {
      public void run() {
        SharedPreferences prefs =
            getSharedPreferences(MyTracksSettings.SETTINGS_NAME, 0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putLong(MyTracksSettings.SELECTED_TRACK, trackId);
        editor.commit();
      }
    });
  }

う。何故に UI thread で SharedPreferences を更新しているのか。あ、タブが関係してるんだな。てーコトは MapView の更新については MyTracksMap#onSharedPreferenceChanged か。
このあたりかな。

      } else if (key.equals(MyTracksSettings.SELECTED_TRACK)) {
        long selectedTrackId =
            sharedPreferences.getLong(MyTracksSettings.SELECTED_TRACK, -1);
        setSelectedTrack(selectedTrackId);

という事は MyTracksMap#setSelectedTrack が核心?

  /**
   * Sets the selected track and zoom and pan the map so that it is visible.
   *
   * @param trackId a given track id
   */
  public void setSelectedTrack(final long trackId) {
    if (selectedTrack != null && selectedTrack.getId() == trackId) {
      // Selected track did not change, nothing to do.
      mapOverlay.setSelectedTrack(selectedTrack);
      mapView.invalidate();
      updateOptionsButton();
      return;
    }
    if (trackId < 0) {
      // Remove selection.
      selectedTrack = null;
      mapOverlay.setSelectedTrack(null);
      mapOverlay.clearWaypoints();
      updateOptionsButton();
      mapView.invalidate();
      return;
    }
    busyPane.setVisibility(View.VISIBLE);
    selectedTrack = providerUtils.getTrack(trackId);
    updateTrackHandler.post(restoreTrackRunnable);
    updateTrackHandler.post(restoreWaypointsRunnable);
    updateTrackHandler.post(setSelectedTrackRunnable);
  }

あ、Handler#post してるのって、以前も確認した記憶があるような気が。てか、remove というのはポイント高いな。ちょっと想定外だったけど、消すってのもアリだわな。
てか、MapOverlay とか楽で良いな。でも上記の通り

  • 選択したのが今表示してるのと同じソレ
  • 選択解除
  • 選択したものを表示するナニ

という分岐になっているあたりはポイント高い。ちょっと限界気味なのでそろそろ休みます。