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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java

Issue 2533523002: Add Geolocation.PermissionState histogram. (Closed)
Patch Set: Address comments. Return to listed enums. Created 4 years 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: chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
index ab4f5fae4fcd7b55113ee16a98dd6a737527df97..b45f7f823e276e610b3ff6353ff2a7b31536f16b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -5,12 +5,15 @@
package org.chromium.chrome.browser.omnibox.geo;
import android.Manifest;
+import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
+import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Process;
+import android.support.annotation.IntDef;
import android.util.Base64;
import org.chromium.base.ApiCompatibilityUtils;
@@ -19,8 +22,12 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.browser.preferences.website.ContentSetting;
import org.chromium.chrome.browser.preferences.website.GeolocationInfo;
+import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.UrlUtilities;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.List;
import java.util.Locale;
/**
@@ -40,6 +47,112 @@ public class GeolocationHeader {
public static final int UMA_LOCATION_DISABLED_FOR_CHROME_APP = 5;
public static final int UMA_MAX = 8;
+ // Values for the histogram Geolocation.Header.PermissionState.
+ // These are used to back an UMA histogram and so should be treated as append-only.
+ //
+ // In order to keep the names of these constants from being too long, the following were used:
+ // UMA_PERM to indicate UMA location permission related metrics,
+ // APP_YES (instead of APP_GRANTED) to indicate App permission granted,
+ // DOMAIN_YES (instead of DOMAIN_GRANTED) to indicate Domain permission granted.
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_LOCATION = 0;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_NO_LOCATION = 1;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_LOCATION = 2;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 3;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_BLOCKED = 4;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_YES = 5;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_PROMPT = 6;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_BLOCKED = 7;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_YES = 8;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_PROMPT = 9;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_BLOCKED = 10;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_LOCATION = 11;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_NO_LOCATION = 12;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_LOCATION = 13;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 14;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_BLOCKED = 15;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_YES = 16;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_PROMPT = 17;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_BLOCKED = 18;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_YES = 19;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_PROMPT = 20;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_BLOCKED = 21;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_LOCATION = 22;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_NO_LOCATION = 23;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_LOCATION = 24;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 25;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_BLOCKED = 26;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_YES = 27;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_PROMPT = 28;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_BLOCKED = 29;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_YES = 30;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_PROMPT = 31;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_BLOCKED = 32;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_YES = 33;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_PROMPT = 34;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_BLOCKED = 35;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_YES = 36;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_PROMPT = 37;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_BLOCKED = 38;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_YES = 39;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_PROMPT = 40;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_BLOCKED = 41;
+ public static final int UMA_PERM_UNKNOWN = 42;
+ public static final int UMA_PERM_MAX = 42;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_LOCATION,
+ UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_NO_LOCATION,
+ UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_LOCATION,
+ UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_NO_LOCATION,
+ UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_BLOCKED,
+ UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_YES,
+ UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_PROMPT,
+ UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_BLOCKED,
+ UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_YES,
+ UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_PROMPT,
+ UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_BLOCKED,
+ UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_LOCATION,
+ UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_NO_LOCATION,
+ UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_LOCATION,
+ UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_NO_LOCATION,
+ UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_BLOCKED,
+ UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_YES,
+ UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_PROMPT,
+ UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_BLOCKED,
+ UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_YES,
+ UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_PROMPT,
+ UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_BLOCKED,
+ UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_LOCATION,
+ UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_NO_LOCATION,
+ UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_LOCATION,
+ UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_NO_LOCATION,
+ UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_BLOCKED, UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_YES,
+ UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_PROMPT, UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_BLOCKED,
+ UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_YES, UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_PROMPT,
+ UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_BLOCKED, UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_YES,
+ UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_PROMPT, UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_BLOCKED,
+ UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_YES, UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_PROMPT,
+ UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_BLOCKED,
+ UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_YES,
+ UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_PROMPT,
+ UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_BLOCKED, UMA_PERM_UNKNOWN})
+ public @interface UmaPermission {}
+
+ private static final int LOCATION_SOURCE_HIGH_ACCURACY = 0;
+ private static final int LOCATION_SOURCE_BATTERY_SAVING = 1;
+ private static final int LOCATION_SOURCE_GPS_ONLY = 2;
+ private static final int LOCATION_SOURCE_MASTER_OFF = 3;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({LOCATION_SOURCE_HIGH_ACCURACY, LOCATION_SOURCE_BATTERY_SAVING,
+ LOCATION_SOURCE_GPS_ONLY, LOCATION_SOURCE_MASTER_OFF})
+ private @interface LocationSource {}
+
+ private static final int PERMISSION_GRANTED = 0;
+ private static final int PERMISSION_PROMPT = 1;
+ private static final int PERMISSION_BLOCKED = 2;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({PERMISSION_GRANTED, PERMISSION_PROMPT, PERMISSION_BLOCKED})
+ private @interface Permission {}
+
/** The maximum age in milliseconds of a location that we'll send in an X-Geo header. */
private static final int MAX_LOCATION_AGE = 24 * 60 * 60 * 1000; // 24 hours
@@ -108,25 +221,42 @@ public class GeolocationHeader {
*
* @param context The Context used to get the device location.
* @param url The URL of the request with which this header will be sent.
- * @param isIncognito Whether the request will happen in an incognito tab.
+ * @param tab The Tab currently being accessed.
* @return The X-Geo header string or null.
*/
- public static String getGeoHeader(Context context, String url, boolean isIncognito) {
+ public static String getGeoHeader(Context context, String url, Tab tab) {
+ boolean isIncognito = tab.isIncognito();
+ boolean locationAttached = true;
if (!isGeoHeaderEnabledForUrl(context, url, isIncognito, true)) {
dominickn 2016/12/01 00:30:26 Nit: reverse this conditional and move lines 234 -
pdyson 2016/12/05 03:48:32 Done. I've added a comment above the changed line
- return null;
+ locationAttached = false;
}
// Only send X-Geo header if there's a fresh location available.
Location location = GeolocationTracker.getLastKnownLocation(context);
if (location == null) {
recordHistogram(UMA_LOCATION_NOT_AVAILABLE);
- return null;
- }
- if (GeolocationTracker.getLocationAge(location) > MAX_LOCATION_AGE) {
- recordHistogram(UMA_LOCATION_STALE);
- return null;
+ locationAttached = false;
+ } else {
+ long locationAge = GeolocationTracker.getLocationAge(location);
+ if (locationAge > MAX_LOCATION_AGE) {
dominickn 2016/12/01 00:30:26 Nit: this can be an else if, and you can probably
pdyson 2016/12/05 03:48:32 Done. For some reason I was under the impression t
+ recordHistogram(UMA_LOCATION_STALE);
+ locationAttached = false;
+ }
}
+ @LocationSource
dominickn 2016/12/01 00:30:26 Nit: the @annotation is usually inlined with the v
pdyson 2016/12/05 03:48:31 I had it that way, but "git cl format" moved the a
+ int locationSource = getLocationSource(context);
+ @Permission
+ int appPermission = getGeolocationPermission(context, tab);
+ @Permission
+ int domainPermission = getDomainPermission(url, isIncognito);
+
+ // Record the permission state with a histogram.
+ recordPermissionHistogram(
+ locationSource, appPermission, domainPermission, locationAttached);
+
+ if (!locationAttached) return null;
+
recordHistogram(UMA_HEADER_SENT);
// Timestamp in microseconds since the UNIX epoch.
@@ -177,11 +307,39 @@ public class GeolocationHeader {
}
/**
+ * Returns the geolocation permission.
+ * This permission can be either granted, blocked or prompt.
+ */
+ @Permission
+ static int getGeolocationPermission(Context context, Tab tab) {
+ if (hasGeolocationPermission(context)) return PERMISSION_GRANTED;
+ Activity activity = tab.getWindowAndroid().getActivity().get();
+ if (activity == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ // Can't check for prompt when activity is null, so default to blocked.
+ // No prompt before version M.
+ return PERMISSION_BLOCKED;
+ }
+ return activity.shouldShowRequestPermissionRationale(
+ Manifest.permission.ACCESS_COARSE_LOCATION)
+ ? PERMISSION_PROMPT
+ : PERMISSION_BLOCKED;
+ }
+
+ /**
* Returns true if the user has disabled sharing their location with url (e.g. via the
* geolocation infobar). If the user has not chosen a preference for url and url uses the https
* scheme, this considers the user's preference for url with the http scheme instead.
*/
static boolean isLocationDisabledForUrl(Uri uri, boolean isIncognito) {
+ return locationContentSettingForUrl(uri, isIncognito) == ContentSetting.BLOCK;
+ }
+
+ /**
+ * Returns the location permission for sharing their location with url (e.g. via the
+ * geolocation infobar). If the user has not chosen a preference for url and url uses the https
+ * scheme, this returns the user's preference for url with the http scheme instead.
+ */
+ static ContentSetting locationContentSettingForUrl(Uri uri, boolean isIncognito) {
GeolocationInfo locationSettings = new GeolocationInfo(uri.toString(), null, isIncognito);
ContentSetting locationPermission = locationSettings.getContentSetting();
@@ -197,11 +355,250 @@ public class GeolocationHeader {
}
}
- return locationPermission == ContentSetting.BLOCK;
+ return locationPermission;
}
/** Records a data point for the Geolocation.HeaderSentOrNot histogram. */
private static void recordHistogram(int result) {
RecordHistogram.recordEnumeratedHistogram("Geolocation.HeaderSentOrNot", result, UMA_MAX);
}
+
+ /** Returns the location source. */
+ @LocationSource
+ private static int getLocationSource(Context context) {
+ LocationManager locationManager =
+ (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
+ List<String> providers = locationManager.getProviders(true);
+ boolean hasNetworkProvider = false;
+ boolean hasGpsProvider = false;
+ for (String provider : providers) {
+ if (!LocationManager.PASSIVE_PROVIDER.equals(provider)) {
+ if (LocationManager.NETWORK_PROVIDER.equals(provider)) {
+ hasNetworkProvider = true;
+ } else if (LocationManager.GPS_PROVIDER.equals(provider)) {
+ hasGpsProvider = true;
+ }
+ }
+ }
+ return hasNetworkProvider
+ ? (hasGpsProvider ? LOCATION_SOURCE_HIGH_ACCURACY : LOCATION_SOURCE_BATTERY_SAVING)
+ : (hasGpsProvider ? LOCATION_SOURCE_GPS_ONLY : LOCATION_SOURCE_MASTER_OFF);
+ }
+
+ /**
+ * Returns the domain permission.
+ * This permission can be either granted, blocked or prompt.
+ */
+ @Permission
+ private static int getDomainPermission(String url, boolean isIncognito) {
+ ContentSetting domainPermission = locationContentSettingForUrl(Uri.parse(url), isIncognito);
+ switch (domainPermission) {
+ case ALLOW:
+ return PERMISSION_GRANTED;
+ case ASK:
+ return PERMISSION_PROMPT;
+ default:
+ return PERMISSION_BLOCKED;
+ }
+ }
+
+ /**
+ * Returns the enum to use in the Geolocation.Header.PermissionState histogram.
+ * Unexpected input values return UMA_PERM_UNKNOWN.
+ */
+ @UmaPermission
+ private static int getPermissionHistogramEnum(@LocationSource int locationSource,
+ @Permission int appPermission, @Permission int domainPermission,
+ boolean locationAttached) {
+ switch (locationSource) {
dominickn 2016/12/01 00:30:26 This will be much more compact if you use conditio
pdyson 2016/12/05 03:48:32 Done. I'm new to Java so it's surprising that if/t
+ case LOCATION_SOURCE_HIGH_ACCURACY:
+ switch (appPermission) {
+ case PERMISSION_GRANTED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return locationAttached
+ ? UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_NO_LOCATION;
+ case PERMISSION_PROMPT:
+ return locationAttached
+ ? UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_PROMPT:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_BLOCKED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case LOCATION_SOURCE_BATTERY_SAVING:
+ switch (appPermission) {
+ case PERMISSION_GRANTED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return locationAttached
+ ? UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_NO_LOCATION;
+ case PERMISSION_PROMPT:
+ return locationAttached
+ ? UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_PROMPT:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_BLOCKED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case LOCATION_SOURCE_GPS_ONLY:
+ switch (appPermission) {
+ case PERMISSION_GRANTED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return locationAttached
+ ? UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_NO_LOCATION;
+ case PERMISSION_PROMPT:
+ return locationAttached
+ ? UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_PROMPT:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_BLOCKED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case LOCATION_SOURCE_MASTER_OFF:
+ switch (appPermission) {
+ case PERMISSION_GRANTED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_PROMPT:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+
+ case PERMISSION_BLOCKED:
+ switch (domainPermission) {
+ case PERMISSION_GRANTED:
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_YES;
+ case PERMISSION_PROMPT:
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_PROMPT;
+ case PERMISSION_BLOCKED:
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_BLOCKED;
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ default:
+ return UMA_PERM_UNKNOWN;
+ }
+ }
+
+ /** Records a data point for the Geolocation.Header.PermissionState histogram. */
+ private static void recordPermissionHistogram(@LocationSource int locationSource,
+ @Permission int appPermission, @Permission int domainPermission,
+ boolean locationAttached) {
+ @UmaPermission
+ int result = getPermissionHistogramEnum(
+ locationSource, appPermission, domainPermission, locationAttached);
+ RecordHistogram.recordEnumeratedHistogram(
+ "Geolocation.Header.PermissionState", result, UMA_PERM_MAX);
Ilya Sherman 2016/12/01 00:36:18 Instead of UMA_PERM_MAX, you want UMA_PERM_MAX + 1
pdyson 2016/12/05 03:48:31 Done.
+ }
}

Powered by Google App Engine
This is Rietveld 408576698