MyTracks 読み (10)

本日第二弾。
id:ttmmrr さんから TrackWriterFactory クラスの enum 云々についてフォロー頂きました。確認した所ではこれは enum 使って template method をナニする方法との事ッス。

なんか凄いなぁ。

send to google を順に確認

MyTracksMap#onMenuItemSelected で

  @Override
  public boolean onMenuItemSelected(int featureId, MenuItem item) {
    if (!super.onMenuItemSelected(featureId, item)) {
      if (selectedTrack != null) {
        MyTracks.getInstance().onActivityResult(
            MyTracksConstants.getActionFromMenuId(item.getItemId()), RESULT_OK,
            new Intent());
        return true;
      }
    }
    return false;
  }

な事してるんですが、itemID は MyTracksConstants.MENU_SEND_TO_GOOGLE のはずなので、MyTracksConstants.getActionFromMenuID は

  public static int getActionFromMenuId(int menuId) {
    switch (menuId) {
      case MyTracksConstants.MENU_SEND_TO_GOOGLE:
        return MyTracksConstants.SEND_TO_GOOGLE_DIALOG;

MyTracksConstants.SEND_TO_GOOGLE_DIALOG を戻します。で、MyTracks#onActivityResult メソドにて以下の分岐に入る。

      case MyTracksConstants.SEND_TO_GOOGLE_DIALOG: {
        shareRequested = false;
        showDialogSafely(DIALOG_SEND_TO_GOOGLE);
        break;
      }

ここで SendToGoogleDialog が表示される。SendToGoogleDialog で send なボタンがクリックされて起動される手続きは以下な部分な模様。

    Button send = (Button) findViewById(R.id.sendtogoogle_send_now);
    send.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        dismiss();
        MyTracks.getInstance().sendToGoogle();
      }
    });

MyTracks#sendToGoogle が呼び出されるのか。これ追い掛けるの気合い必要だな。一旦離脱。

復帰

MyTracks#sendToGoogle の定義が以下。

  /**
   * Initiates the process to send tracks to google.
   * This is called once the user has selected sending options via the
   * SendToGoogleDialog.
   */
  public void sendToGoogle() {
    if (sendToGoogleDialog == null) {
      return;
    }
    setProgressValue(0);
    setProgressMessage("");
    showDialogSafely(DIALOG_PROGRESS);
    if (sendToGoogleDialog.getSendToMyMaps()) {
      if (!sendToGoogleDialog.getCreateNewMap()) {
        Intent listIntent = new Intent(this, MyMapsList.class);
        startActivityForResult(listIntent, MyTracksConstants.GET_MAP);
      } else {
        setProgressValue(0);
        setProgressMessage(getString(
            R.string.progress_message_authenticating_mymaps));
        authenticate(new Intent(), MyTracksConstants.SEND_TO_GOOGLE,
            MyMapsConstants.MAPSHOP_SERVICE);
      }
    } else {
      onActivityResult(MyTracksConstants.AUTHENTICATE_TO_DOCS, RESULT_OK,
          new Intent());
    }
  }

ええとコードが頭に入ってこねぇ。なんとなく雰囲気てきに最後の else 節だけ相手にすりゃ良いのかな、と思ってたりするんですが駄目かなぁ。本当になんとなく、ですがこのメソドが何度も呼ばれてるのではないかと思っていたりしてます。

そもそも

SendToGoogleDialog クラスのソレが全然理解できてないのかな。多分そうだな。
中身を確認してみたら SEND_TO_GOOGLE の次に AUTHENTICATE_TO_DOCS な onActivityResult を呼び出している模様。
しかしこれをパクれ、ってのも相当にハードル高いな (わら