| Index: chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
|
| index 970d9d8802478786012f617710055e61b855b146..80e99d216127fb858413c9b48057d608e4d20d82 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
|
| @@ -6,6 +6,9 @@
|
|
|
| import android.Manifest;
|
| import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.location.LocationManager;
|
| +import android.provider.Settings;
|
|
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.ThreadUtils;
|
| @@ -13,14 +16,13 @@
|
| import org.chromium.base.annotations.CalledByNative;
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
| import org.chromium.chrome.browser.ChromeApplication;
|
| -import org.chromium.components.location.LocationUtils;
|
| import org.chromium.content.browser.ContentViewCore;
|
| import org.chromium.content_public.browser.WebContents;
|
| import org.chromium.ui.base.WindowAndroid;
|
|
|
| /**
|
| - * Provides methods for querying Chrome's internal location setting and
|
| - * combining that with the system-wide setting and permissions.
|
| + * Provides methods for querying Android system-wide location settings as well as Chrome's internal
|
| + * location setting.
|
| *
|
| * This class should be used only on the UI thread.
|
| */
|
| @@ -54,16 +56,15 @@
|
|
|
| @CalledByNative
|
| private static boolean canSitesRequestLocationPermission(WebContents webContents) {
|
| + if (!LocationSettings.getInstance().isSystemLocationSettingEnabled()) return false;
|
| +
|
| ContentViewCore cvc = ContentViewCore.fromWebContents(webContents);
|
| if (cvc == null) return false;
|
| WindowAndroid windowAndroid = cvc.getWindowAndroid();
|
| if (windowAndroid == null) return false;
|
| - Context context = windowAndroid.getApplicationContext();
|
|
|
| - LocationUtils locationUtils = LocationUtils.getInstance();
|
| - if (!locationUtils.isSystemLocationSettingEnabled(context)) return false;
|
| -
|
| - return locationUtils.hasAndroidLocationPermission(context)
|
| + return windowAndroid.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
|
| + || windowAndroid.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)
|
| || windowAndroid.canRequestPermission(Manifest.permission.ACCESS_FINE_LOCATION);
|
| }
|
|
|
| @@ -71,8 +72,7 @@
|
| * Returns true if location is enabled system-wide and the Chrome location setting is enabled.
|
| */
|
| public boolean areAllLocationSettingsEnabled() {
|
| - return isChromeLocationSettingEnabled()
|
| - && LocationUtils.getInstance().isSystemLocationSettingEnabled(mContext);
|
| + return isChromeLocationSettingEnabled() && isSystemLocationSettingEnabled();
|
| }
|
|
|
| /**
|
| @@ -82,6 +82,26 @@
|
| return PrefServiceBridge.getInstance().isAllowLocationEnabled();
|
| }
|
|
|
| + /**
|
| + * Returns whether location is enabled system-wide, i.e. whether Chrome itself is able to access
|
| + * location.
|
| + */
|
| + public boolean isSystemLocationSettingEnabled() {
|
| + LocationManager locationManager =
|
| + (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
|
| + return (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
|
| + || locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
|
| + }
|
| +
|
| + /**
|
| + * Returns an intent to launch Android Location Settings.
|
| + */
|
| + public Intent getSystemLocationSettingsIntent() {
|
| + Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
|
| + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| + return i;
|
| + }
|
| +
|
| @VisibleForTesting
|
| public static void setInstanceForTesting(LocationSettings instance) {
|
| sInstance = instance;
|
|
|