Chromium Code Reviews| Index: components/devtools_bridge/android/java/src/org/chromium/components/devtools_bridge/DevToolsBridgeServiceBase.java |
| diff --git a/components/devtools_bridge/android/java/src/org/chromium/components/devtools_bridge/DevToolsBridgeServiceBase.java b/components/devtools_bridge/android/java/src/org/chromium/components/devtools_bridge/DevToolsBridgeServiceBase.java |
| index 741e59c75f210413dd022676a95f0b03df48deb1..ca8b567541ec1a8d1eaaba0065cd4a9620e4cb90 100644 |
| --- a/components/devtools_bridge/android/java/src/org/chromium/components/devtools_bridge/DevToolsBridgeServiceBase.java |
| +++ b/components/devtools_bridge/android/java/src/org/chromium/components/devtools_bridge/DevToolsBridgeServiceBase.java |
| @@ -8,9 +8,10 @@ import android.app.Service; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.os.IBinder; |
| +import android.os.Looper; |
| import android.support.v4.content.WakefulBroadcastReceiver; |
| -import org.chromium.components.devtools_bridge.ui.ServiceUIFactory; |
| +import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener; |
| /** |
| * Base class for a service which hosts DevToolsBridgeServer. It relies on Cloud Messages |
| @@ -22,6 +23,8 @@ import org.chromium.components.devtools_bridge.ui.ServiceUIFactory; |
| * TODO(serya): Service lifetime management code should be moved here from DevToolsBridgeServer. |
| */ |
| public abstract class DevToolsBridgeServiceBase extends Service { |
| + private static final String WAKELOCK_KEY = "DevToolsBridgeService.WAKELOCK"; |
| + |
| /** |
| * Delivers intents from MultiplexingGcmListener to the service making sure |
| * wakelock is kept during the process. |
| @@ -44,6 +47,9 @@ public abstract class DevToolsBridgeServiceBase extends Service { |
| } |
| private DevToolsBridgeServer mServer; |
| + private ServiceLifetimeManager mLifetimeManager; |
| + |
| + private Runnable mSessionHandlingTask; |
| @Override |
| public IBinder onBind(Intent intent) { |
| @@ -53,8 +59,8 @@ public abstract class DevToolsBridgeServiceBase extends Service { |
| @Override |
| public void onCreate() { |
| super.onCreate(); |
| - |
| - mServer = new DevToolsBridgeServer(this, socketName(), newUIFactory()); |
| + mServer = new DevToolsBridgeServer(new ServerDelegate()); |
| + mLifetimeManager = new ServiceLifetimeManager(this, WAKELOCK_KEY); |
| } |
| @Override |
| @@ -66,13 +72,80 @@ public abstract class DevToolsBridgeServiceBase extends Service { |
| @Override |
| public final int onStartCommand(Intent intent, int flags, int startId) { |
| - Runnable intentHandlingTask = mServer.startSticky(); |
| - mServer.onStartCommand(intent); |
| + Runnable intentHandlingTask = mLifetimeManager.startTask(startId); |
| + if (MultiplexingGcmListener.Intents.ACTION.equals(intent.getAction())) { |
| + handleGCMIntent(intent); |
| + } else { |
| + onHandleIntent(intent); |
| + } |
| ReceiverBase.completeWakefulIntent(intent); |
| intentHandlingTask.run(); // Stops self if no other task started. |
| return START_NOT_STICKY; |
| } |
| - protected abstract String socketName(); |
| - protected abstract ServiceUIFactory newUIFactory(); |
| + private void handleGCMIntent(Intent intent) { |
| + if (intent.getBooleanExtra(MultiplexingGcmListener.Intents.EXTRA_OP_MESSAGE, false)) { |
| + mServer.handleCloudMessage(intent, mLifetimeManager.startTask()); |
| + } else if (intent.getBooleanExtra( |
| + MultiplexingGcmListener.Intents.EXTRA_OP_REGISTERED, false)) { |
| + mServer.updateCloudMessagesId( |
| + intent.getStringExtra(MultiplexingGcmListener.Intents.EXTRA_DATA_REG_ID), |
| + startTask()); |
| + } else if (intent.getBooleanExtra( |
| + MultiplexingGcmListener.Intents.EXTRA_OP_UNREGISTERED, false)) { |
| + mServer.updateCloudMessagesId("", startTask()); |
| + } |
| + } |
| + |
| + /** |
| + * Unkike similar method in IntentService this one runs on service thread. |
|
mnaganov (inactive)
2014/12/17 15:56:43
typo: unlike
SeRya
2014/12/17 16:03:55
Done.
|
| + * Cloud Messages intents are handled separately. |
| + */ |
| + protected void onHandleIntent(Intent intent) { |
| + assert calledOnServiceThread(); |
| + } |
| + |
| + protected abstract void querySocketName(DevToolsBridgeServer.QuerySocketCallback callback); |
| + protected abstract void onFirstSessionStarted(); |
| + protected abstract void onLastSessionStopped(); |
| + protected void onSessionCountChange(int sessionCount) {} |
| + |
| + protected DevToolsBridgeServer server() { |
| + return mServer; |
| + } |
| + |
| + protected Runnable startTask() { |
| + return mLifetimeManager.startTask(); |
| + } |
| + |
| + protected boolean calledOnServiceThread() { |
| + return Looper.myLooper() == getMainLooper(); |
| + } |
| + |
| + private class ServerDelegate implements DevToolsBridgeServer.Delegate { |
| + @Override |
| + public Context getContext() { |
| + return DevToolsBridgeServiceBase.this; |
| + } |
| + |
| + @Override |
| + public void onSessionCountChange(int sessionCount) { |
| + assert calledOnServiceThread(); |
| + if (sessionCount > 0 && mSessionHandlingTask == null) { |
| + mSessionHandlingTask = startTask(); |
| + DevToolsBridgeServiceBase.this.onFirstSessionStarted(); |
| + } else if (sessionCount == 0 && mSessionHandlingTask != null) { |
| + mSessionHandlingTask.run(); |
| + mSessionHandlingTask = null; |
| + DevToolsBridgeServiceBase.this.onLastSessionStopped(); |
| + } else { |
| + DevToolsBridgeServiceBase.this.onSessionCountChange(sessionCount); |
| + } |
| + } |
| + |
| + @Override |
| + public void querySocketName(DevToolsBridgeServer.QuerySocketCallback callback) { |
| + DevToolsBridgeServiceBase.this.querySocketName(callback); |
| + } |
| + } |
| } |