package com.kakao.widget; import java.io.IOException; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.kakao.APIErrorResult; import com.kakao.PushRegisterHttpResponseHandler; import com.kakao.PushService; import com.kakao.PushToken; import com.kakao.helper.Logger; import com.kakao.helper.Utility; /** * 푸시 토큰 등록/삭제를 도와주는 Activity. * 카카오계정 로그인과 함께 푸시 서비스를 쓰는 앱의 로그인 후 보이는 activity에서 extends한다. * 푸시 토큰 등록/삭제를 대행해준다. * @author MJ */ public abstract class PushActivity extends Activity { private static final String GCM_PROJECT_ID_KEY = "com.kakao.sdk.GcmProjectId"; private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; private GoogleCloudMessaging gcm; private String regId; private int appVer; protected String deviceUUID; /** * GCM으로부터 푸시 토큰을 얻어 카카오 푸시 서버에 등록하고 이를 SharedPreference에 저장한다. * @param savedInstanceState activity 내려갈 때 저장해둔 정보 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(this); regId = PushToken.getRegistrationId(this); appVer = Utility.getAppVersion(this); deviceUUID = getDeviceUUID(); if (regId.isEmpty()) { registerPushToken(null); } } else { Logger.getInstance().w("No valid Google Play Services APK found."); } } /** * GCM을 쓸수 있는 앱인지 판단한다. */ @Override protected void onResume() { super.onResume(); checkPlayServices(); } private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Logger.getInstance().w("This device is not supported."); finish(); } return false; } return true; } /** * kakao_strings.xml에 등록한 gcm_project_number를 이용하여 푸시 토큰을 받고, 로그인 후 알수 있는 사용자 id와 해당 기기의 유일한 device id를 이용하여 푸시 토큰을 등록한다. * @param registerHttpResponseHandler 푸시 토큰 등록에 대한 콜백 처리를 직접하고 싶은 경우 handler를 넘겨준다. 넘겨주지 않는 경우는 기본 handler가 동작한다. */ protected void registerPushToken(final PushRegisterHttpResponseHandler registerHttpResponseHandler) { new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground(Void... params) { try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(PushActivity.this); } String gcmProjectNumber = Utility.getMetadata(PushActivity.this, GCM_PROJECT_ID_KEY); regId = gcm.register(gcmProjectNumber); return Boolean.TRUE; } catch (IOException ex) { Logger.getInstance().w("Error :" + ex.getMessage()); return Boolean.FALSE; } } @Override protected void onPostExecute(final Boolean registerationResult){ if(registerationResult) { if(registerHttpResponseHandler != null) { registerHttpResponseHandler.setRegId(regId, appVer); PushService.registerPushToken(registerHttpResponseHandler, regId, deviceUUID); } else { PushService.registerPushToken(new PushRegisterHttpResponseHandler(regId, appVer){ @Override protected void onHttpSessionClosedFailure(APIErrorResult errorResult) { redirectLoginActivity(); } @Override protected void onHttpFailure(APIErrorResult errorResult) { super.onHttpFailure(errorResult); Toast.makeText(getApplicationContext(), errorResult.toString(), Toast.LENGTH_LONG).show(); } }, regId, deviceUUID); } } } }.execute(null, null, null); } /** * 푸시 서비스 사용중 세션이 닫히면, 즉 다시 로그인이 필요한 상태이면 호출되는 메쏘드로 로그인 페이지로 전환해주도록 구현해야 한다. */ protected abstract void redirectLoginActivity() ; /** * 한 사용자에게 여러 기기를 허용하기 위해 기기별 id가 필요하다. * 최대 64자 지원되므로 생성시 주의한다. * @return 기기의 unique id */ protected abstract String getDeviceUUID(); }