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; |