Index: components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java |
diff --git a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java |
index d5bbaf3dbceb34ea82b6ce7389ccf2f8c17fde69..67c5af612d43ecb1b274b3d534cc59bf248c9155 100644 |
--- a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java |
+++ b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationClientService.java |
@@ -7,9 +7,12 @@ package org.chromium.components.invalidation; |
import android.accounts.Account; |
import android.app.PendingIntent; |
import android.content.ContentResolver; |
+import android.content.Context; |
import android.content.Intent; |
+import android.content.pm.ApplicationInfo; |
+import android.content.pm.PackageManager; |
+import android.content.pm.PackageManager.NameNotFoundException; |
import android.os.Bundle; |
-import android.util.Log; |
import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState; |
import com.google.ipc.invalidation.external.client.contrib.AndroidListener; |
@@ -20,6 +23,8 @@ import com.google.protos.ipc.invalidation.Types.ClientType; |
import org.chromium.base.ApplicationStatus; |
import org.chromium.base.CollectionUtil; |
+import org.chromium.base.ContextUtils; |
+import org.chromium.base.Log; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.components.sync.AndroidSyncSettings; |
import org.chromium.components.sync.ModelTypeHelper; |
@@ -35,6 +40,7 @@ import java.util.Collections; |
import java.util.HashSet; |
import java.util.List; |
import java.util.Set; |
+import java.util.concurrent.atomic.AtomicReference; |
import javax.annotation.Nullable; |
@@ -61,7 +67,8 @@ public class InvalidationClientService extends AndroidListener { |
@VisibleForTesting |
static final int CLIENT_TYPE = ClientType.CHROME_SYNC_ANDROID; |
- private static final String TAG = "cr.invalidation"; |
+ private static final String TAG = "cr_invalidation"; |
+ private static final String CLIENT_SERVICE_KEY = "ipc.invalidation.ticl.listener_service_class"; |
/** |
* Whether the underlying notification client has been started. This boolean is updated when a |
@@ -76,6 +83,43 @@ public class InvalidationClientService extends AndroidListener { |
*/ |
@Nullable private static byte[] sClientId; |
+ private static AtomicReference<Class<? extends InvalidationClientService>> sServiceClass = |
+ new AtomicReference<>(); |
+ |
+ private static Class<? extends InvalidationClientService> |
+ findRegisteredInvalidationClientService() { |
+ Context context = ContextUtils.getApplicationContext(); |
+ PackageManager packageManager = context.getPackageManager(); |
+ ApplicationInfo appInfo; |
+ try { |
+ appInfo = packageManager.getApplicationInfo(context.getPackageName(), |
+ PackageManager.GET_META_DATA); |
+ if (appInfo.metaData != null) { |
+ String serviceMetadata = appInfo.metaData.getString(CLIENT_SERVICE_KEY, null); |
+ if (serviceMetadata == null) return InvalidationClientService.class; |
+ |
+ Class<?> foundClass = Class.forName(serviceMetadata); |
+ Class<? extends InvalidationClientService> serviceClass = |
+ foundClass.asSubclass(InvalidationClientService.class); |
+ return serviceClass; |
+ } |
+ } catch (NameNotFoundException | ClassNotFoundException | ClassCastException e) { |
+ Log.e(TAG, "Unable to find registered client service", e); |
+ } |
+ return InvalidationClientService.class; |
+ } |
+ |
+ /** |
+ * @return The registered {@link InvalidationClientService} class reference to use for |
+ * interacting with the service. |
+ */ |
+ public static Class<? extends InvalidationClientService> getRegisteredClass() { |
+ if (sServiceClass.get() == null) { |
+ sServiceClass.compareAndSet(null, findRegisteredInvalidationClientService()); |
+ } |
+ return sServiceClass.get(); |
+ } |
+ |
@Override |
public void onHandleIntent(Intent intent) { |
if (intent == null) { |