/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.notifications;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import com.socialize.log.SocializeLogger;
import com.socialize.util.StringUtils;
/**
* @author Jason Polites
*
*/
public abstract class BaseC2DMReceiver extends IntentService {
public static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";
public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
public static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";
public static final String EXTRA_UNREGISTERED = "unregistered";
public static final String EXTRA_ERROR = "error";
public static final String EXTRA_REGISTRATION_ID = "registration_id";
public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";
public BaseC2DMReceiver(String name) {
super(name);
}
/**
* Called when a cloud message has been received.
*/
protected abstract void onMessage(Context context, Intent intent);
/**
* Called on registration error. Override to provide better error messages.
*
* This is called in the context of a Service - no dialog or UI.
*/
protected abstract void onError(Context context, String errorId);
/**
* Called when a registration token has been received.
*/
protected abstract void onRegistrered(Context context, String registrationId);
/**
* Called when the device has been unregistered.
*/
protected abstract void onUnregistered(Context context);
public void onHandleIntent(Intent intent) {
Context context = getApplicationContext();
if(intent != null) {
try {
String action = intent.getAction();
if(!StringUtils.isEmpty(action)) {
if (isRegistrationAction(action)) {
onRegistrationResponse(context, intent);
}
else if (isMessageAction(action)) {
onMessage(context, intent);
}
}
}
catch (Exception e) {
// TODO: Handle error
SocializeLogger.e(e.getMessage(), e);
}
finally {
// Release the power lock, so phone can get back to sleep.
// The lock is reference counted by default, so multiple
// messages are ok.
// If the onMessage() needs to spawn a thread or do something else,
// it should use it's own lock.
WakeLock.getInstance().release(context);
}
}
}
protected boolean isRegistrationAction(String action) {
return action.equals(REGISTRATION_CALLBACK_INTENT);
}
protected boolean isMessageAction(String action) {
return action.equals(C2DM_INTENT);
}
protected void onRegistrationResponse(final Context context, Intent intent) {
String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID);
String error = intent.getStringExtra(EXTRA_ERROR);
String removed = intent.getStringExtra(EXTRA_UNREGISTERED);
if (!StringUtils.isEmpty(removed)) {
onUnregistered(context);
}
else if(!StringUtils.isEmpty(error)) {
onError(context, error);
}
else if(!StringUtils.isEmpty(registrationId)){
onRegistrered(context, registrationId);
}
else {
onError(context, "No registration ID in response from GCM");
}
}
}