package com.example.android.recipe098; import java.io.IOException; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerFuture; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import com.google.api.client.apache.ApacheHttpTransport; import com.google.api.client.googleapis.GoogleHeaders; import com.google.api.client.googleapis.GoogleTransport; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponseException; import com.google.api.client.http.HttpTransport; import com.google.api.client.xml.atom.AtomParser; public class Recipe098 extends Activity { private static final String GOOGLE_DOCS_API_URL = "https://docs.google.com/feeds/"; private static final String DOCS_AUTH_TOKEN_TYPE = "writely"; private static final String TAG = "Recipe098"; private static HttpTransport mTransport; private String mAuthToken; public static HttpTransport getTransport() { return mTransport; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // GoogleTransportを作る mTransport = GoogleTransport.create(); GoogleHeaders headers = (GoogleHeaders) mTransport.defaultHeaders; // "[company-id]-[app-name]-[app-version]"という形式で // アプリケーション名をセット headers.setApplicationName("gabu-recipe-98"); // バージョンをセット headers.gdataVersion = "3"; // AtomParserを作る AtomParser parser = new AtomParser(); // GoogleDocumentsListのネームスペースをセット parser.namespaceDictionary = Namespace.DICTIONARY; // GoogleTransportにAtomParserをセット mTransport.addParser(parser); // HttpTransportにApacheHttpTransportのインスタンスをセット // これをやっておかないとExceptionが発生します。 HttpTransport.setLowLevelHttpTransport( ApacheHttpTransport.INSTANCE); // AccountManagerを取得 AccountManager manager = AccountManager.get(this); // Googleアカウントの一覧を取得 Account[] accounts = manager.getAccountsByType("com.google"); // サンプルなので暫定的に1つ目を取得 Account acount = accounts[0]; // 認証のためのauth tokenを取得 AccountManagerFuture<Bundle> f = manager.getAuthToken(acount, DOCS_AUTH_TOKEN_TYPE, null, this, null, null); try { Bundle b = f.getResult(); mAuthToken = b.getString(AccountManager.KEY_AUTHTOKEN); // Log.d(TAG, "authToken=" + mAuthToken); } catch (OperationCanceledException e) { e.printStackTrace(); } catch (AuthenticatorException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // GoogleTransportにauth tokenをセット // これで認証ヘッダを自動的に付けてくれます。 ((GoogleHeaders) mTransport.defaultHeaders).setGoogleLogin(mAuthToken); // Googleドキュメントの一覧を取得するURLを作成 String url = GOOGLE_DOCS_API_URL + "default/private/full/-/document"; // GoogleTransportからGETリクエストを生成 HttpRequest request = mTransport.buildGetRequest(); // URLをセット request.setUrl(url); try { // HTTPリクエストを実行してレスポンスをパース DocumentListFeed feed = request.execute().parseAs(DocumentListFeed.class); // DocsAdapterを生成 DocsAdapter adapter = new DocsAdapter( getApplicationContext(), 0, feed.entries); // ListViewにDocsAdapterをセット ListView listView = (ListView)findViewById(R.id.list_view); listView.setAdapter(adapter); listView.setOnItemClickListener(mOnItemClickListener); } catch (IOException e) { handleException(e); } } private OnItemClickListener mOnItemClickListener = new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListView listView = (ListView) parent; DocumentListEntry entry; entry = (DocumentListEntry)listView .getItemAtPosition(position); Log.d(TAG, "onItemClick id=" + entry.id); Intent intent = new Intent(getApplicationContext(), EditActivity.class); intent.putExtra("docId", entry.getDocId()); startActivity(intent); } }; private void handleException(IOException e) { if (e instanceof HttpResponseException) { int statusCode = ((HttpResponseException) e).response.statusCode; if (statusCode == 401 || statusCode == 403) { AccountManager manager = AccountManager.get(this); // キャッシュを削除 manager.invalidateAuthToken("com.google", mAuthToken); Toast.makeText(getApplicationContext(), "キャッシュを削除しました。アプリを再起動してください。", Toast.LENGTH_LONG).show(); } return; } else { e.printStackTrace(); } } }