A Day In The Life

とあるプログラマの備忘録

IGTalkSessionをもっと便利に簡単に使えるクラス

GTalkSessionというGTalkを簡単に使えるクラスを作成しました。
GTalkSessionクラスはIGTalkSessionオブジェクトを生成して管理してくれます。
通常IGTalkSessionを使うとこんな感じの実装になると思います。

public class SampleActivity extends Activity
    implements View.OnClickListener {
  private IGTalkSession gtalkSession;
  ServiceConnection conn = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
      try {
        gtalkSession = IGTalkService.Stub.asInterface(service).getDefaultSession();
      } catch (DeadObjectException ex) { 
        //
      }
    }
    public void onServiceDisconnected(ComponentName className) {
      gtalkSession = null;
    }
  }
  public void onCreate(Bundle icicle) {
    setContentView(R.layout.sample);
    Button button = (Button)findViewById(R.id.button);
    button.setOnClickListener(this);
    bindService(new Intent().setComponent(
        GTalkServiceConstants.GTALK_SERVICE_COMPONE­NT), conn, 0); 
  }
  public void onClick(View v) {
    try {
      gtalkSession.sendDataMessage("xxx@gmail.com", new Intent().putExtra("message", "Hello!"));
    } catch (DeadObjectException ex) { 
        //
    }
  }
}

ServiceConnectionのオブジェクトをいちいち作ってさらにIGTalkSessionオブジェクトのメソッドを呼ぶときはtry〜catchしなきゃいけないしなんとなく使い勝手悪いですね。
GTalkSessionクラスを使うと少し楽になります。
こんな感じです。

public class SampleActivity extends Activity 
    implements View.OnClickListener {
  private GTalkSession gtalkSession;
  public void onCreate(Bundle icicle) {
    setContentView(R.layout.sample);
    Button button = (Button)findViewById(R.id.button);
    button.setOnClickListener(this);
    gtalkSession = new GTalkSession(this);
    gtalkSession.bindService(); 
  }
  public void onClick(View v) {
    gtalkSession.sendDataMessage("xxx@gmail.com", new Intent().putExtra("message", "Hello!"));
  }
}

ちなみにGTalkSessionクラスの実装はこんな感じになってます。

public class GTalkSession implements ServiceConnection {
  :
  public GTalkSession(Context context) {
    :
  } 
  private IGTalkSession gtalkSession;
  public void onServiceConnected(ComponentName className, IBinder service) {
    try {
      gtalkSession = IGTalkService.Stub.asInterface(service).getDefaultSession();
      gtalkSession.requestRoster();
      gtalkSession.setPresence(new Presence(5, ""));
    } catch (DeadObjectException ex) { 
      //
    }
  }
  public void onServiceDisconnected(ComponentName className) {
    gtalkSession = null;
  }
  public void sendDataMessage(String userName, Intent intent) {
    try {
      gtalkSession.sendDataMessage(userName, intent);
    } catch (DeadObjectException ex) {
      //
    }
  }
  public String getUserName() {
    try {
      return gtalkSession.getUserName();
    } catch (DeadObjectException ex) {
      //
    }
    return null;
  }
  :
  その他IGTalkSessionのメソッドをラップ
  :
}

GTalkSessionクラスは他にもイベントリスナーを登録できるようになっています。
イベントリスナーはサービス接続の完了を通知したりグループチャットの招待がきたら通知してくれたりします。
ソースはhttp://code.google.com/p/perfume/で公開しています。
GTalkSessionクラスはMame TalkCommunication Mapでも使用しています。