chrometophone (6)

次は com.google.android.apps.chrometophone 方面をナニ。
Manifest によれば HistoryActivity が LAUNCHER なソレになっておりますのでここから見てった方が良いのかな。C2DMReceiver なんてソレがあったり AppEngineClient などというナニがあったりして迷うな。
ただ、C2DMReceiver あたりに結構面白げなカンジなので確認入れてみます。

C2DMReceiver クラス

ええとコンストラクタはデフォルトのみ。

    public C2DMReceiver() {
        super(DeviceRegistrar.SENDER_ID);
    }

SENDER_ID の定義は DeviceRegistrar クラスにて以下。

    static final String SENDER_ID = "stp.chrome@gmail.com";
onRegister メソド

とりあえずここから、という事で定義が以下。

    public void onRegistrered(Context context, String registration) {
        DeviceRegistrar.registerWithServer(context, registration);
    }

DeviceRegistrar さんが色々取り仕切っておられる模様です。ここでは登録が正常だった場合の処理になってるはずなんですが、何をしなきゃいけないかとゆーと

To complete the registration, the application sends the registration ID to the application server. The application server typically stores the registration ID in a database.

とゆー事で AP サーバに対して registration ID を送信して向こうで登録してもらわなきゃいけない、と。ざっくりベースでそんな事をしてるんだろな、とゆーのは理解できるんですが詳細について微妙な部分が多々ございますので以下にて確認。

DeviceRegister.registerWithServer メソド

static なメソドなのか。registration ID の送信、というあたりが以下か。

    public static void registerWithServer(final Context context,
          final String deviceRegistrationID) {
        new Thread(new Runnable() {
            public void run() {
                Intent updateUIIntent = new Intent("com.google.ctp.UPDATE_UI");
                try {
                    HttpResponse res = makeRequest(context, deviceRegistrationID, REGISTER_PATH);

以降で HTTP ステイタスのチェックとかをしていくのですが、上記の部分について掘削開始。あ、ちなみに Thread を new しておりますが、末端で start メソドを呼び出す形になっておりますので念の為。あと Service の callback もレスポンス悪いと ANR って言われるのだろうか。
まず Intent を生成して makeRequest メソド呼び出してます。この com.google.ctp.UPDATE_UI なインテントですが、SetupActivity の中で定義されている BroadcastReceiver で受信している事が find|xargs grep にて判明。
例外が catch されなければこの Intent を sendBroadcast しております。
次の makeRequest メソドですが、なかなかイカしてます。ってか、こーゆーの作ろうと思って github に (以下ry
とりあえずここで送付するのは AP サーバへのソレなので実装は参考まで、なんでしょうけど、registration ID は送付して向こうでは覚えておかなきゃいけない、というのまでは決まり。
手続き定義を全部引用しときます。

    private static HttpResponse makeRequest(Context context, String deviceRegistrationID,
            String urlPath) throws Exception {
        SharedPreferences settings = Prefs.get(context);
        String accountName = settings.getString("accountName", null);

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("devregid", deviceRegistrationID));

        String deviceId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
        if (deviceId != null) {
            params.add(new BasicNameValuePair("deviceId", deviceId));
        }

        AppEngineClient client = new AppEngineClient(context, accountName);
        return client.makeRequest(urlPath, params);
    }
  • Prefs というクラスもなかなか良いです (別途引用します)。
  • Secure.ANDRID_ID って端末の固有識別情報なのか
  • AppEngineClient の中身は一体

という事でとりあえず Prefs の中身を確認して AppEngineClient 方面を掘削。

package com.google.android.apps.chrometophone;

import android.content.Context;
import android.content.SharedPreferences;

public final class Prefs {
    public static SharedPreferences get(Context context) {
        return context.getSharedPreferences("CTP_PREFS", 0);
    }
}

これ、パクって使いたいですね。

AppEngineClient クラス

定義されてるメソドは以下三点。

  • makeReqeuest
  • makeRequestNoRetry
  • getAuthToken

なんですが、ここでタイムアップな模様。おそらく明日は違う方面を掘削しているものと思われます。