Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2690)

Unified Diff: android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java

Issue 2611883002: Prepare to call GMS APIs from WebView (Closed)
Patch Set: fix AwStrictModeTest Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
diff --git a/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java b/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
index 09173a39b45da3a2d45903427ec6c20f4a294cf2..f3a48ba25d882d751e0f349caa22ff5fef7bc7a7 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
@@ -10,12 +10,25 @@ import android.content.pm.PackageManager;
import android.webkit.ValueCallback;
import org.chromium.base.Log;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
/**
- * Java twin of the homonymous C++ class. The Java side is only responsible for
- * switching metrics on and off. Since the setting is a platform feature, it
- * must be obtained through PlatformServiceBridge.
+ * Determines whether metrics should be enabled.
+ *
+ * This requires the following steps:
+ * 1) Check if the app has opted out.
+ * 2) Check the platform's metrics consent setting.
+ * 3) Wait for the native AwMetricsServiceClient to call nativeInitialized.
+ * 4) If enabled, inform the native AwMetricsServiceClient via nativeSetMetricsEnabled.
sgurun-gerrit only 2017/01/13 07:12:15 I think because you start it from Java (AwContents
+ *
+ * Steps 1 and 2 are started on the Java side by calling queryMetricsSetting. This happens in
+ * parallel with native AwMetricsServiceClient initialization. Either nativeInitialized happens
+ * before onReceiveValue comes back with the platform setting, in which case we should set
+ * sIsClientReady and wait for onReceiveValue, or onReceiveValue happens before nativeInitialized,
+ * in which case we should record the setting in sShouldEnable and wait for nativeInitialized.
+ * Whichever fires last should call nativeSetMetricsEnabled.
*/
@JNINamespace("android_webview")
public class AwMetricsServiceClient {
@@ -25,10 +38,13 @@ public class AwMetricsServiceClient {
// reporting. See https://developer.android.com/reference/android/webkit/WebView.html
private static final String OPT_OUT_META_DATA_STR = "android.webkit.WebView.MetricsOptOut";
- private static boolean isAppOptedOut(Context applicationContext) {
+ private static boolean sIsClientReady; // Is the native AwMetricsServiceClient initialized?
+ private static boolean sShouldEnable; // Have steps 1 and 2 passed?
+
+ private static boolean isAppOptedOut(Context appContext) {
try {
- ApplicationInfo info = applicationContext.getPackageManager().getApplicationInfo(
- applicationContext.getPackageName(), PackageManager.GET_META_DATA);
+ ApplicationInfo info = appContext.getPackageManager().getApplicationInfo(
+ appContext.getPackageName(), PackageManager.GET_META_DATA);
if (info.metaData == null) {
// null means no such tag was found.
return false;
@@ -43,19 +59,37 @@ public class AwMetricsServiceClient {
}
}
- public AwMetricsServiceClient(Context applicationContext) {
- if (isAppOptedOut(applicationContext)) {
+ public static void queryMetricsSetting(Context appContext) {
+ ThreadUtils.assertOnUiThread();
+
+ // Metrics defaults to off, so only call nativeSetMetricsEnabled if it's true.
+ if (isAppOptedOut(appContext)) {
return;
}
// Check if the user has consented.
- PlatformServiceBridge.getInstance(applicationContext)
- .setMetricsSettingListener(new ValueCallback<Boolean>() {
+ PlatformServiceBridge.getInstance(appContext)
+ .queryMetricsSetting(new ValueCallback<Boolean>() {
public void onReceiveValue(Boolean enabled) {
- nativeSetMetricsEnabled(enabled);
+ ThreadUtils.assertOnUiThread();
+ if (enabled) {
+ sShouldEnable = true;
+ if (sIsClientReady) {
+ nativeSetMetricsEnabled(true);
+ }
+ }
}
});
}
+ @CalledByNative
+ public static void nativeInitialized() {
+ ThreadUtils.assertOnUiThread();
+ sIsClientReady = true;
+ if (sShouldEnable) {
+ nativeSetMetricsEnabled(true);
+ }
+ }
+
public static native void nativeSetMetricsEnabled(boolean enabled);
}

Powered by Google App Engine
This is Rietveld 408576698