diff options
| author | 2018-01-26 14:55:17 -0800 | |
|---|---|---|
| committer | 2018-01-26 16:42:05 -0800 | |
| commit | 7c30c68cc594e4e4d13dca6343b118f998f4eaff (patch) | |
| tree | 0ce32334b25535b1d159ff62701412f9646bae5b | |
| parent | b62c31cdb3525979a4d36daf053b5bc5a56aa5df (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.java | 62 |
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()); } /** |