/* * Copyright (C) 2014 Divide.io * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.divide.client.android.push; import android.content.Context; import android.content.Intent; import android.os.Bundle; import com.google.android.gcm.GCMBaseIntentService; import com.google.android.gcm.GCMRegistrar; import com.google.inject.Inject; import io.divide.client.BackendUser; import io.divide.client.android.AndroidConfig; import io.divide.client.auth.AuthManager; import io.divide.client.auth.LoginListener; import io.divide.client.web.AbstractWebManager; import io.divide.shared.event.EventManager; import io.divide.shared.logging.Logger; import io.divide.shared.transitory.EncryptedEntity; import retrofit.RetrofitError; import java.util.Set; public class PushManager extends AbstractWebManager<PushWebService> { private static Logger logger = Logger.getLogger(PushManager.class); private static PushManager pushManager; private static EventManager eventManager = EventManager.get(); private String senderId; @Inject private AndroidConfig config; @Inject private AuthManager authManager; @Inject public PushManager(AndroidConfig config) { super(config); pushManager = this; } @Override protected Class<PushWebService> getType() { return PushWebService.class; } public void setEnablePush(boolean enable, String senderId){ if(enable){ this.senderId = senderId; authManager.addLoginListener(loginListener); } else { if(loginListener != null) loginListener.unsubscribe(); this.senderId = null; if(isRegistered(config.app)){ unregister(); GCMRegistrar.unregister(config.app); } } this.senderId = senderId; } public boolean isRegistered(){ return isRegistered(config.app); } private LoginListener loginListener = new LoginListener() { @Override public void onNext(BackendUser user) { logger.debug("onLogin: " + user); register4Push(); } }; boolean register(String token){ try { EncryptedEntity.Writter entity = new EncryptedEntity.Writter(authManager.getServerKey()); entity.put("token",token); // entity.setCipherText(token,config.getAuthManager().getServerKey() ); getWebService().register(entity); return true; } catch (Exception e) { logger.error("register failed",e); return false; } } boolean unregister(){ try{ getWebService().unregister(); return true; }catch (RetrofitError error){ logger.error("Failed to unregister",error); return false; } } private void register4Push(){ Context context = config.app; GCMRegistrar.checkDevice(context); GCMRegistrar.checkManifest(context); final String regId = GCMRegistrar.getRegistrationId(context); if (regId.equals("")) { logger.info("Registering"); GCMRegistrar.setRegisteredOnServer(context, true); GCMRegistrar.register(context, senderId); } else { logger.info("Push already registered: " + regId); } } private boolean isRegistered(Context context){ final String regId = GCMRegistrar.getRegistrationId(context); return !regId.equals(""); } public static class PushReceiver extends GCMBaseIntentService { Logger logger = Logger.getLogger(PushReceiver.class); public PushReceiver() { super(PushReceiver.class.getSimpleName()); } @Override protected void onMessage(Context context, Intent intent) { logger.debug("onMessage(): " + intent); Bundle extras = intent.getExtras(); Set<String> keys = extras.keySet(); for (String key : keys){ logger.info(key + ": " + extras.get(key)); } String data = extras.getString("body"); if(data!=null && data.length()>0 && pushManager!=null){ logger.info("Firing PushEvent"); eventManager.fire(new PushEvent(data)); } } @Override protected void onError(Context context, String s) { logger.debug("onError(): " + s); } @Override protected void onRegistered(Context context, String s) { logger.debug("onRegistered(): " + s); if(pushManager!=null) pushManager.register(s); } @Override protected void onUnregistered(Context context, String s) { logger.debug("onUnregistered(): " + s); if(pushManager!=null) pushManager.unregister(); } } public void addPushListener(PushListener listener){ EventManager.get().register(listener); } public void removePushListener(PushListener listener){ EventManager.get().unregister(listener); } }