From 7c30c68cc594e4e4d13dca6343b118f998f4eaff Mon Sep 17 00:00:00 2001 From: Lifu Tang Date: Fri, 26 Jan 2018 14:55:17 -0800 Subject: [PATCH] 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 --- .../android/location/LocationManager.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 9db9d3325dccf..c33dce1777bba 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 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()); } /**