Index: components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java |
diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fabf769870b774f23030401a7629de9081d8a7e5 |
--- /dev/null |
+++ b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java |
@@ -0,0 +1,146 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.components.gcm_driver.instance_id; |
+ |
+import android.content.Context; |
+import android.os.AsyncTask; |
+import android.os.Bundle; |
+import android.text.TextUtils; |
+ |
+import com.google.android.gms.iid.InstanceID; |
+ |
+import org.chromium.base.annotations.CalledByNative; |
+import org.chromium.base.annotations.JNINamespace; |
+ |
+import java.io.IOException; |
+ |
+/** |
+ * Wraps InstanceID and InstanceIDWithSubtype so they can be used over JNI. |
+ * Performs disk/network operations on a background thread and replies asynchronously. |
+ */ |
+@JNINamespace("instance_id") |
+public class InstanceIDBridge { |
+ /** Underlying InstanceID. May be shared by multiple InstanceIDBridges. */ |
+ private final InstanceID mInstanceID; |
+ private final long mNativeInstanceIDAndroid; |
+ |
+ private InstanceIDBridge(InstanceID instanceID, long nativeInstanceIDAndroid) { |
+ mInstanceID = instanceID; |
+ mNativeInstanceIDAndroid = nativeInstanceIDAndroid; |
+ } |
+ |
+ /** |
+ * Returns a wrapped {@link InstanceIDWithSubtype} or {@link InstanceID}, depending on whether |
+ * subtype is empty. Multiple InstanceIDBridge instances may share an underlying InstanceID. |
+ */ |
+ @CalledByNative |
+ public static InstanceIDBridge getInstance( |
+ long nativeInstanceIDAndroid, Context context, String subtype) { |
+ InstanceID instanceID = TextUtils.isEmpty(subtype) |
Peter Beverloo
2016/04/14 14:30:47
There's a DCHECK in the C++ code to make sure the
johnme
2016/04/14 18:00:15
It would be valid for Chrome components to use an
|
+ ? InstanceID.getInstance(context) |
+ : InstanceIDWithSubtype.getInstance(context, subtype); |
+ return new InstanceIDBridge(instanceID, nativeInstanceIDAndroid); |
+ } |
+ |
+ /** |
+ * Called when our C++ counterpart is destroyed. Clears the handle to our native C++ object, |
+ * ensuring it's not called by pending async tasks. |
+ */ |
+ @CalledByNative |
+ private void destroy() { |
+ mNativeInstanceIDAndroid = 0; |
+ } |
+ |
+ /** Wrapper for {@link InstanceID#getId}. */ |
+ @CalledByNative |
+ public String getId() { |
+ return mInstanceID.getId(); |
Peter Beverloo
2016/04/14 14:30:47
Any reason for not making this asynchronous immedi
johnme
2016/04/14 18:00:15
Convenience (note that create will also need to be
|
+ } |
+ |
+ /** Wrapper for {@link InstanceID#getCreationTime}. */ |
+ @CalledByNative |
+ public long getCreationTime() { |
+ return mInstanceID.getCreationTime(); |
+ } |
+ |
+ /** Async wrapper for {@link InstanceID#getToken(String, String, Bundle)}. */ |
+ @CalledByNative |
+ private void getToken(final int requestId, final String authorizedEntity, final String scope, |
+ String[] extrasStrings) { |
+ final Bundle extras = new Bundle(); |
+ assert extrasStrings.length % 2 == 0; |
+ for (int i = 0; i < extrasStrings.length; i += 2) { |
+ extras.putString(extrasStrings[i], extrasStrings[i + 1]); |
+ } |
+ new AsyncTask<Void, Void, String>() { |
+ @Override |
+ protected String doInBackground(Void... params) { |
+ try { |
+ return mInstanceID.getToken(authorizedEntity, scope, extras); |
+ } catch (IOException ex) { |
+ return ""; |
+ } |
+ } |
+ @Override |
+ protected void onPostExecute(String token) { |
+ if (mNativeInstanceIDAndroid != 0) { |
+ nativeDidGetToken(mNativeInstanceIDAndroid, requestId, token); |
+ } |
+ } |
+ }.execute(); |
+ } |
+ |
+ /** Async wrapper for {@link InstanceID#deleteToken(String, String)}. */ |
+ @CalledByNative |
+ private void deleteToken( |
+ final int requestId, final String authorizedEntity, final String scope) { |
+ new AsyncTask<Void, Void, Boolean>() { |
+ @Override |
+ protected Boolean doInBackground(Void... params) { |
+ try { |
+ mInstanceID.deleteToken(authorizedEntity, scope); |
+ return true; |
+ } catch (IOException ex) { |
+ return false; |
+ } |
+ } |
+ @Override |
+ protected void onPostExecute(Boolean success) { |
+ if (mNativeInstanceIDAndroid != 0) { |
+ nativeDidDeleteToken(mNativeInstanceIDAndroid, requestId, success); |
+ } |
+ } |
+ }.execute(); |
+ } |
+ |
+ /** Async wrapper for {@link InstanceID#deleteInstanceID}. */ |
+ @CalledByNative |
+ private void deleteInstanceID(final int requestId) { |
+ new AsyncTask<Void, Void, Boolean>() { |
+ @Override |
+ protected Boolean doInBackground(Void... params) { |
+ try { |
+ mInstanceID.deleteInstanceID(); |
+ return true; |
+ } catch (IOException ex) { |
+ return false; |
+ } |
+ } |
+ @Override |
+ protected void onPostExecute(Boolean success) { |
+ if (mNativeInstanceIDAndroid != 0) { |
+ nativeDidDeleteID(mNativeInstanceIDAndroid, requestId, success); |
+ } |
+ } |
+ }.execute(); |
+ } |
+ |
+ private native void nativeDidGetToken( |
+ long nativeInstanceIDAndroid, int requestId, String token); |
+ private native void nativeDidDeleteToken( |
+ long nativeInstanceIDAndroid, int requestId, boolean success); |
+ private native void nativeDidDeleteID( |
+ long nativeInstanceIDAndroid, int requestId, boolean success); |
+} |