前回は、チャットアプリケーションの全体像/データフローを示し、その後に「サインアップ(サインイン)」機能について解説しました。
第6回となる今回は、他のユーザを友達リストに追加する「友達追加」機能について解説します。ユーザは友達リストから話したい友達を選び、チャットを開始することになります。
なお前回と同様、今回使用したソースコードについては、GitHubで公開しています。
友達追加機能の実装
実装に入る前に、前回説明した友達追加機能について簡単に確認してみましょう。
友達追加機能は、次の2つのフローにより成り立ちます。
友達候補の取得
サインアップの際、アプリケーションスコープの”chat_users”バケットにユーザ情報を登録しているため、このバケットはアプリケーションに登録している全ユーザの情報を含んでいます。このバケットに対して検索をかけることで、友達候補を取得します。
友達リストへの追加
1で取得した友達候補から、友達リストに追加したいユーザを選択します。選択したユーザはユーザスコープの”chat_friends”バケットに追加され、チャットを開始する際に選択できます。
この2つのフローの実装について、以下で説明していきます。
①友達候補の取得
友達候補の取得処理をもう少し小さい処理に分割すると、以下のようになります。
- ユーザの入力から検索キーワードを取得する
- ユーザネームもしくはEmailが検索キーワードから始まるユーザを、‘chat_users’バケットから取得する
- 取得したユーザのリストを表示する
この中で、Kii Cloudへのアクセスが含まれているのは、2つ目の「ユーザネームもしくはEmailが検索キーワードを含むユーザを取得する」です。この実装について見ていきましょう。
なお、以降では、前回同様、GitHubに掲載しているコードと少しコメントの内容・位置が異なっている場合があります。あらかじめご了承ください。
まず、UserListLoaderクラスを見ていきます。
このクラスではActivity側で入手したユーザ入力を検索キーワードとして、コンストラクタでセットします。セットした検索キーワードを用いて、友達候補を取得する処理をバックグラウンドで実行します。処理終了後、結果を元のActivityに渡します。
UserListLoaderクラス内で、友達候補取得のために実行するメソッドはChatUser#searchByKeyword(String keyword)です。このメソッド内でAndroid Cloud SDKのAPIを実行しています。具体的には、KiiBucket#query(KiiQuery query)を実行して、“chat_users”バケット下にあるオブジェクトの内、条件にマッチしたオブジェクトを取得しています。
クエリ実行時の条件は、KiiClauseクラスにより指定します。
KiiQueryクラスの生成時に与えるKiiClauseクラスのインスタンスにより、「特定のフィールドの値が等しい」「あるフィールドの値が指定した値よりも大きい」などの条件を扱うことができます。KiiClauseクラスは論理演算子(and, or)をサポートしているため、複数の条件を組み合わせることも可能です。
以下の例では、「 "username" もしくは “email” フィールドの値が検索キーワードで始まるオブジェクト」という条件を使っています。
②友達リストへの追加
友達リストへの追加をもう少し小さい処理に分割すると、以下のようになります。
- 「①友達候補の取得」で取得した友達候補から、友達リストに追加したいユーザを選択する
- ユーザの意思を確認するダイアログを表示する
- 上記ダイアログで追加に同意するボタンをクリックした場合、友達リストにユーザを追加/表示する
この中で、Kii Cloudへのアクセスが含まれているのは、3番目の「友達リストにユーザを追加/表示する」です。この実装について見ていきましょう。
AddFriendActivityクラス内で定義するAsyncTask(AddingFriendTaskクラス)により,友達リストへの追加処理がバックグラウンドで実行されます。追加するユーザのインスタンス(ChatUserのインスタンス)は、ユーザ確認のダイアログからのクリックイベントを通して伝えられます。
AddingFriendTaskクラス内で、友達リストに登録されたユーザを表すChatFriendクラスのインスタンスを生成しています。このインスタンスは、“chat_friends”バケットの下にあるオブジェクト(Cloud SDKのKiiObject)をラップしたものです。ChatFriend#getObject()により、KiiObjectのインスタンスを取り出し、KiiObject#save()を呼ぶことでオブジェクトがサーバに保存されます。これにより、友達リストに選択したユーザの情報が登録されます。
上記までに友達リストに登録されたユーザを一覧する処理は、FriendListLoaderクラスに定義しています。“chat_friends”バケット以下のオブジェクトを返すクエリを実行して、友達リストに登録している全ユーザの情報を取得します。取得された情報は、FriendListFragmentクラスに渡され一覧表示されます。
以上で、友達追加機能についての解説を終えます。サーバへのアクセスが数回のメソッド呼び出しに抽象化されており、REST APIにアクセスする処理を自前で実装する必要がないことが見て取れます。
次回の第7回は、今回友達リストに登録したユーザとの間にチャットルームを作成する機能について解説していきます。