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

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

Issue 2533523002: Add Geolocation.PermissionState histogram. (Closed)
Patch Set: Remove test that requires high accuracy location. 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..e5cdadee8ec7d86aebbddf5c0aee2122bbd71404 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
@@ -8,9 +8,11 @@ import android.Manifest;
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 +21,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 +46,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_UNKNOWN = 0;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_LOCATION = 1;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_NO_LOCATION = 2;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_LOCATION = 3;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 4;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_BLOCKED = 5;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_YES = 6;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_PROMPT = 7;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_BLOCKED = 8;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_YES = 9;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_PROMPT = 10;
+ public static final int UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_BLOCKED = 11;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_LOCATION = 12;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_NO_LOCATION = 13;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_LOCATION = 14;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 15;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_BLOCKED = 16;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_YES = 17;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_PROMPT = 18;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_BLOCKED = 19;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_YES = 20;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_PROMPT = 21;
+ public static final int UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_BLOCKED = 22;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_LOCATION = 23;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_NO_LOCATION = 24;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_LOCATION = 25;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_NO_LOCATION = 26;
+ public static final int UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_BLOCKED = 27;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_YES = 28;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_PROMPT = 29;
+ public static final int UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_BLOCKED = 30;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_YES = 31;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_PROMPT = 32;
+ public static final int UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_BLOCKED = 33;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_YES = 34;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_PROMPT = 35;
+ public static final int UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_BLOCKED = 36;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_YES = 37;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_PROMPT = 38;
+ public static final int UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_BLOCKED = 39;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_YES = 40;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_PROMPT = 41;
+ public static final int UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_BLOCKED = 42;
+ public static final int UMA_PERM_COUNT = 43;
+ @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,24 +220,41 @@ 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) {
- if (!isGeoHeaderEnabledForUrl(context, url, isIncognito, true)) {
- return null;
+ public static String getGeoHeader(Context context, String url, Tab tab) {
+ boolean isIncognito = tab.isIncognito();
+ boolean locationAttached = true;
+ Location location = null;
+ if (isGeoHeaderEnabledForUrl(context, url, isIncognito, true)) {
+ // Only send X-Geo header if there's a fresh location available.
+ location = GeolocationTracker.getLastKnownLocation(context);
+ if (location == null) {
+ recordHistogram(UMA_LOCATION_NOT_AVAILABLE);
+ locationAttached = false;
+ } else {
+ if (GeolocationTracker.getLocationAge(location) > MAX_LOCATION_AGE) {
+ recordHistogram(UMA_LOCATION_STALE);
+ locationAttached = false;
+ }
+ }
+ } else {
+ 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;
- }
+ @LocationSource 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);
+
+ // Note that strictly speaking "location == null" is not needed here as the
+ // logic above prevents location being null when locationAttached is true.
+ // It is here to prevent problems if the logic above is changed.
+ if (!locationAttached || location == null) return null;
recordHistogram(UMA_HEADER_SENT);
@@ -177,11 +306,33 @@ public class GeolocationHeader {
}
/**
+ * Returns the app level 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;
+ return tab.getWindowAndroid().canRequestPermission(
+ 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 +348,186 @@ 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.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 as either granted, blocked or prompt.
+ * This is based upon 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.
+ */
+ @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) {
+ if (locationSource == LOCATION_SOURCE_HIGH_ACCURACY) {
+ if (appPermission == PERMISSION_GRANTED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return locationAttached ? UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_YES_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return locationAttached
+ ? UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_HIGH_ACCURACY_APP_YES_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_PROMPT) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_HIGH_ACCURACY_APP_PROMPT_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_BLOCKED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_HIGH_ACCURACY_APP_BLOCKED_DOMAIN_BLOCKED;
+ }
+ }
+ } else if (locationSource == LOCATION_SOURCE_BATTERY_SAVING) {
+ if (appPermission == PERMISSION_GRANTED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return locationAttached
+ ? UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_YES_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return locationAttached
+ ? UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_BATTERY_SAVING_APP_YES_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_PROMPT) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_BATTERY_SAVING_APP_PROMPT_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_BLOCKED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_BATTERY_SAVING_APP_BLOCKED_DOMAIN_BLOCKED;
+ }
+ }
+ } else if (locationSource == LOCATION_SOURCE_GPS_ONLY) {
+ if (appPermission == PERMISSION_GRANTED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return locationAttached ? UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_LOCATION
+ : UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_YES_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return locationAttached ? UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_LOCATION
+ : UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_PROMPT_NO_LOCATION;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_GPS_ONLY_APP_YES_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_PROMPT) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_GPS_ONLY_APP_PROMPT_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_BLOCKED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_GPS_ONLY_APP_BLOCKED_DOMAIN_BLOCKED;
+ }
+ }
+ } else if (locationSource == LOCATION_SOURCE_MASTER_OFF) {
+ if (appPermission == PERMISSION_GRANTED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_MASTER_OFF_APP_YES_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_PROMPT) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_MASTER_OFF_APP_PROMPT_DOMAIN_BLOCKED;
+ }
+ } else if (appPermission == PERMISSION_BLOCKED) {
+ if (domainPermission == PERMISSION_GRANTED) {
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_YES;
+ } else if (domainPermission == PERMISSION_PROMPT) {
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_PROMPT;
+ } else if (domainPermission == PERMISSION_BLOCKED) {
+ return UMA_PERM_MASTER_OFF_APP_BLOCKED_DOMAIN_BLOCKED;
+ }
+ }
+ }
+ 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_COUNT);
+ }
}

Powered by Google App Engine
This is Rietveld 408576698