MyTracks 読み (14)

昨晩の続きをナニ。
ちなみにエントリポイントを sendToGoogle メソドにしてたのは間違いだったようです。
MyTracks#onActivityResult の以下の部分。

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

その前、は一体ドコなのか、と言いつつ MyTracksMap を漁ってたのですが何も出ず。SEND_TO_GOOGLE_DIALOG で find|grep してみたら MyTracksConstant というクラスで以下な static なメソドが定義されているのを発見。

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

まぢッスか、と言いつつ MyTracksMap を確認してみたらありました。

  @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;
  }

上記、コンテキストメニュー関連の callback って思ってて良いのだろうか。ここでも再び盥回しな手法を使っているのか。上記によれば SEND_TO_GOOGLE_DIALOG なリクエストの onActivityResult 呼び出しな訳ですね。
なのでこのエントリ先頭のブロックが実行されて Dialog が表示される、と。

SendToGoogleDialog の send な Button がクリックされたら MyTracks#sendToGoogle メソドが呼び出されます。

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

で、よくよく見てみたらこのあたりの盥回し的部分は以前に読んでエントリに記録してるような気がしてきたぞ。

と思ったら

上記なあたりも掘削済みだった。後天性記憶不全の症状が相当悪化している模様。見てみたらここで手を止めているようです。

とりあえず sendToGoogleDialog.getSendToMyMaps() が false 限定でざくっと先を見渡してみる事にします。

  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 なブロック。AUTHENTICATE_TO_DOCS なリクエストで onActivityResult メソドを呼んでます。盥回し。該当ブロックは以下となります。

      case MyTracksConstants.AUTHENTICATE_TO_DOCS: {
        if (resultCode == RESULT_OK) {
          setProgressValue(0);
          setProgressMessage(
              getString(R.string.progress_message_authenticating_docs));
          authenticate(results,
              MyTracksConstants.AUTHENTICATE_TO_TRIX, "writely");
        } else {
          dismissDialogSafely(DIALOG_PROGRESS);
        }
        break;
      }

ここでリクエストが AUTHENTICATE_TO_IRIX になる。authenticate の中身は略しますが、最終的に doLogin メソドが呼び出されてその中で onActivityResult が呼ばれております。以下か。

      case MyTracksConstants.AUTHENTICATE_TO_TRIX: {
        if (resultCode == RESULT_OK) {
          setProgressValue(30);
          setProgressMessage(
              getString(R.string.progress_message_authenticating_docs));
          authenticate(results, MyTracksConstants.SEND_TO_DOCS, "wise");
        } else {
          dismissDialogSafely(DIALOG_PROGRESS);
        }
        break;
      }

再び authenticate が呼ばれてます。リクエストは SEND_TO_DOCS になる模様。詳細は略で、いきなり onActivityResult に戻ります。

      case MyTracksConstants.SEND_TO_DOCS: {
        if (results != null && resultCode == RESULT_OK) {
          Log.d(MyTracksConstants.TAG, "Sending to Docs....");
          setProgressValue(50);
          setProgressMessage(getString(R.string.progress_message_sending_docs));
          final long trackId = results.getLongExtra("trackid", selectedTrackId);
          final SendToDocs sender = new SendToDocs(this, authMap.get("wise"),
              authMap.get("writely"), trackId);
          Runnable onCompletion = new Runnable() {
            public void run() {
              setProgressValue(100);
              dismissDialogSafely(DIALOG_PROGRESS);
              runOnUiThread(new Runnable() {
                public void run() {
                  sendToDocsMessage = sender.getStatusMessage();
                  sendToDocsSuccess = sender.wasSuccess();
                  handleMapsFinish();
                }
              });
            }
          };
          sender.setOnCompletion(onCompletion);
          sender.run();
        } else {
          dismissDialogSafely(DIALOG_PROGRESS);
        }
        break;
      }
 ||<
なんとなくそろそろが終点に見える。基本的に失敗したら ProgressDialog を閉じて元に戻るみたいですね。処理が成功したとして、最後に呼ばれてるのが handleMapFinish メソドで以下。
>||
  /**
   * Notifies that uploading to maps is finished.
   */
  private void handleMapsFinish() {
    if (shareRequested && sendToMyMapsSuccess) {
      // Just share
      Toast.makeText(this, getMapsResultMessage(), Toast.LENGTH_LONG).show();
      shareLinkToMyMap(sendToMyMapsMapId);
    } else {
      showDialogSafely(DIALOG_SEND_TO_GOOGLE_RESULT);
    }
  }

ちょっと端折りましたが、流れ的にはこんなものなのか。

しかし

この onActivityResult で盥回しちゃう方式とか getActionFromMenuId なヤり方というのは物凄く力任せな感触があります。