summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lifu Tang <lifu@google.com> 2018-01-26 14:55:17 -0800
committer Lifu Tang <lifu@google.com> 2018-01-26 16:42:05 -0800
commit7c30c68cc594e4e4d13dca6343b118f998f4eaff (patch)
tree0ce32334b25535b1d159ff62701412f9646bae5b
parentb62c31cdb3525979a4d36daf053b5bc5a56aa5df (diff)
Move location-related code into client library
These first-party only methods can only be called by privileged packages, and Settings.Secure already applies strict permission check to them. Therefore moving the code into client library can save us from unnecessary binder calls, and can also make checking the caller package name much easier. Test: Manual Change-Id: I76a939a660357f87b01ff4ac07ec3f17093d3c41
-rw-r--r--location/java/android/location/LocationManager.java62
1 files changed, 34 insertions, 28 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 9db9d3325dcc..c33dce1777bb 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -38,9 +38,12 @@ import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
import android.util.Log;
import com.android.internal.location.ProviderProperties;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -1191,10 +1194,11 @@ public class LocationManager {
@SystemApi
@RequiresPermission(WRITE_SECURE_SETTINGS)
public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
- try {
- mService.setLocationEnabledForUser(enabled, userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ for (String provider : getAllProviders()) {
+ if (provider.equals(PASSIVE_PROVIDER)) {
+ continue;
+ }
+ setProviderEnabledForUser(provider, enabled, userHandle);
}
}
@@ -1208,11 +1212,19 @@ public class LocationManager {
*/
@SystemApi
public boolean isLocationEnabledForUser(UserHandle userHandle) {
- try {
- return mService.isLocationEnabledForUser(userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ final String allowedProviders = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+ userHandle.getIdentifier());
+ final List<String> providerList = Arrays.asList(allowedProviders.split(","));
+ for(String provider : getAllProviders()) {
+ if (provider.equals(PASSIVE_PROVIDER)) {
+ continue;
+ }
+ if (providerList.contains(provider)) {
+ return true;
+ }
}
+ return false;
}
/**
@@ -1236,13 +1248,7 @@ public class LocationManager {
* @throws IllegalArgumentException if provider is null
*/
public boolean isProviderEnabled(String provider) {
- checkProvider(provider);
-
- try {
- return mService.isProviderEnabled(provider);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return isProviderEnabledForUser(provider, Process.myUserHandle());
}
/**
@@ -1270,12 +1276,9 @@ public class LocationManager {
@SystemApi
public boolean isProviderEnabledForUser(String provider, UserHandle userHandle) {
checkProvider(provider);
-
- try {
- return mService.isProviderEnabledForUser(provider, userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ String allowedProviders = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED, userHandle.getIdentifier());
+ return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
}
/**
@@ -1294,13 +1297,16 @@ public class LocationManager {
public boolean setProviderEnabledForUser(
String provider, boolean enabled, UserHandle userHandle) {
checkProvider(provider);
-
- try {
- return mService.setProviderEnabledForUser(
- provider, enabled, userHandle.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ // to ensure thread safety, we write the provider name with a '+' or '-'
+ // and let the SettingsProvider handle it rather than reading and modifying
+ // the list of enabled providers.
+ if (enabled) {
+ provider = "+" + provider;
+ } else {
+ provider = "-" + provider;
+ }
+ return Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider, userHandle.getIdentifier());
}
/**