Chromium Code Reviews| 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.
|
| + } |
| } |