구글 로그인하면 바로 캘린더 리스트를 받아오는 샘플코드로 공부하고 있습니다.
최종 하고 싶은게 구글 로그인을 하면 제가 만든 캘린더로 액티비티가 전환되면서
구글 캘린더의 정보를 얻어오는 것 입니다.
계속 샘플코드만 고치려고 했는데 이 방법이 아닌거 같아서요..
그리고 API 참조하면 REST 방식이랑 클라이언트를 직접 사용하는 방식이 있다고 하는데
샘플 코드는 어느 것을 이용한 것인지 궁금합니다.
public final class CalendarSample extends ListActivity {
/** Logging level for HTTP requests/responses. */
private static final Level LOGGING_LEVEL = Level.OFF;
private static final String TAG = "CalendarSample";
private static final String AUTH_TOKEN_TYPE = "cl";
private static final int MENU_ACCOUNTS = 0;
private static final int MENU_ADD = 1;
private static final int CONTEXT_EDIT = 0;
private static final int CONTEXT_DELETE = 1;
private static final int REQUEST_AUTHENTICATE = 0;
final HttpTransport transport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = new GsonFactory();
static final String PREF_ACCOUNT_NAME = "accountName";
static final String PREF_AUTH_TOKEN = "authToken";
GoogleAccountManager accountManager;
SharedPreferences settings;
String accountName;
String authToken;
com.google.api.services.calendar.Calendar client;
List<CalendarInfo> calendars = Lists.newArrayList();
private boolean received401;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HttpRequestInitializer requestInitializer = new HttpRequestInitializer() {
public void initialize(HttpRequest request) throws IOException {
request.getHeaders().setAuthorization(GoogleHeaders.getGoogleLoginValue(authToken));
}
};
client = new com.google.api.services.calendar.
Calendar.Builder(transport, jsonFactory, requestInitializer)
.setApplicationName("Google-CalendarAndroidSample/1.0")
.setJsonHttpRequestInitializer(new GoogleKeyInitializer(ClientCredentials.KEY))
.build();
settings = getPreferences(MODE_PRIVATE);
accountName = settings.getString(PREF_ACCOUNT_NAME, null);
authToken = settings.getString(PREF_AUTH_TOKEN, null);
Logger.getLogger("com.google.api.client").setLevel(LOGGING_LEVEL);
accountManager = new GoogleAccountManager(this);
registerForContextMenu(getListView());
gotAccount();
}
void gotAccount() {
Account account = accountManager.getAccountByName(accountName);
if (account == null) {
chooseAccount();
return;
}
if (authToken != null) {
onAuthToken();
return;
}
accountManager.getAccountManager()
.getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
if (bundle.containsKey(AccountManager.KEY_INTENT)) {
Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_AUTHENTICATE);
} else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
setAuthToken(bundle.getString(AccountManager.KEY_AUTHTOKEN));
onAuthToken();
}
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}, null);
}
private void chooseAccount() {
accountManager.getAccountManager().getAuthTokenByFeatures(GoogleAccountManager.ACCOUNT_TYPE,
AUTH_TOKEN_TYPE,
null,
CalendarSample.this,
null,
null,
new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
Bundle bundle;
try {
bundle = future.getResult();
setAccountName(bundle.getString(AccountManager.KEY_ACCOUNT_NAME));
setAuthToken(bundle.getString(AccountManager.KEY_AUTHTOKEN));
onAuthToken();
} catch (OperationCanceledException e) {
// user canceled
} catch (AuthenticatorException e) {
Log.e(TAG, e.getMessage(), e);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
},
null);
}
void setAccountName(String accountName) {
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
this.accountName = accountName;
}
void setAuthToken(String authToken) {
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_AUTH_TOKEN, authToken);
editor.commit();
this.authToken = authToken;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_AUTHENTICATE:
if (resultCode == RESULT_OK) {
gotAccount();
} else {
chooseAccount();
}
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_ADD, 0, "New Calendar");
if (accountManager.getAccounts().length >= 2) {
menu.add(0, MENU_ACCOUNTS, 0, "Switch Account");
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
Calendar entry = new Calendar();
entry.setSummary("Calendar " + new DateTime(new Date()));
new AsyncInsertCalendar(this, entry).execute();
return true;
case MENU_ACCOUNTS:
chooseAccount();
return true;
}
return false;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CONTEXT_EDIT, 0, "Update Title");
menu.add(0, CONTEXT_DELETE, 0, "Delete");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int calendarIndex = (int) info.id;
CalendarInfo calendarInfo = calendars.get(calendarIndex);
switch (item.getItemId()) {
case CONTEXT_EDIT:
Calendar entry = new Calendar();
entry.setSummary(calendarInfo.summary + " UPDATED " + new DateTime(new Date()));
new AsyncUpdateCalendar(this, calendarIndex, entry).execute();
return true;
case CONTEXT_DELETE:
new AsyncDeleteCalendar(this, calendarIndex).execute();
return true;
default:
return super.onContextItemSelected(item);
}
}
void onAuthToken() {
new AsyncLoadCalendars(this).execute();
}
void onRequestCompleted() {
received401 = false;
}
void handleGoogleException(final IOException e) {
if (e instanceof GoogleJsonResponseException) {
GoogleJsonResponseException exception = (GoogleJsonResponseException) e;
if (exception.getStatusCode() == 401 && !received401) {
received401 = true;
accountManager.invalidateAuthToken(authToken);
authToken = null;
SharedPreferences.Editor editor2 = settings.edit();
editor2.remove(PREF_AUTH_TOKEN);
editor2.commit();
gotAccount();
}
}
Log.e(TAG, e.getMessage(), e);
runOnUiThread(new Runnable() {
public void run() {
new AlertDialog.Builder(CalendarSample.this).setTitle("Exception").setMessage(
e.getMessage()).setNeutralButton("ok", null).create().show();
}
});
}
void refresh() {
Collections.sort(calendars);
setListAdapter(
new ArrayAdapter<CalendarInfo>(this, android.R.layout.simple_list_item_1, calendars));
}
}