From 1575a04e7bc830a8fc15de34dea6362b10c563eb Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Wed, 24 Oct 2018 17:54:54 -0700 Subject: Refactor how location providers are managed Put enabled/disabled state under location provider control, and use it to represent whether a location provider may be used, not whether the user has enabled or disabled a location provider. Bug: 118885128 Test: manually Change-Id: I1209c49c13ca8995b223f383ad332322fffc7a96 --- .../java/android/location/ILocationManager.aidl | 8 +---- .../java/android/location/LocationManager.java | 20 +++++-------- .../internal/location/ILocationProvider.aidl | 21 ++++++------- .../location/ILocationProviderManager.aidl | 34 ++++++++++++++++++++++ .../android/internal/location/ProviderRequest.java | 13 +++++++-- 5 files changed, 62 insertions(+), 34 deletions(-) create mode 100644 location/java/com/android/internal/location/ILocationProviderManager.aidl (limited to 'location/java') diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index ae87998a1615..32c752064a69 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -96,9 +96,7 @@ interface ILocationManager void addTestProvider(String name, in ProviderProperties properties, String opPackageName); void removeTestProvider(String provider, String opPackageName); void setTestProviderLocation(String provider, in Location loc, String opPackageName); - void clearTestProviderLocation(String provider, String opPackageName); void setTestProviderEnabled(String provider, boolean enabled, String opPackageName); - void clearTestProviderEnabled(String provider, String opPackageName); // --- deprecated --- void setTestProviderStatus(String provider, int status, in Bundle extras, long updateTime, @@ -108,12 +106,8 @@ interface ILocationManager // --- internal --- - // Used by location providers to tell the location manager when it has a new location. - // Passive is true if the location is coming from the passive provider, in which case - // it need not be shared with other providers. + // --- deprecated --- void reportLocation(in Location location, boolean passive); - - // Used when a (initially Gnss) Location batch arrives void reportLocationBatch(in List locations); // for reporting callback completion diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 3bf98b352b40..334170e5ce03 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1537,14 +1537,11 @@ public class LocationManager { * mock location app op} is not set to {@link android.app.AppOpsManager#MODE_ALLOWED * allowed} for your app. * @throws IllegalArgumentException if no provider with the given name exists + * + * @deprecated This function has always been a no-op, and may be removed in the future. */ - public void clearTestProviderLocation(String provider) { - try { - mService.clearTestProviderLocation(provider, mContext.getOpPackageName()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + @Deprecated + public void clearTestProviderLocation(String provider) {} /** * Sets a mock enabled value for the given provider. This value will be used in place @@ -1575,13 +1572,12 @@ public class LocationManager { * mock location app op} is not set to {@link android.app.AppOpsManager#MODE_ALLOWED * allowed} for your app. * @throws IllegalArgumentException if no provider with the given name exists + * + * @deprecated Use {@link #setTestProviderEnabled(String, boolean)} instead. */ + @Deprecated public void clearTestProviderEnabled(String provider) { - try { - mService.clearTestProviderEnabled(provider, mContext.getOpPackageName()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + setTestProviderEnabled(provider, true); } /** diff --git a/location/java/com/android/internal/location/ILocationProvider.aidl b/location/java/com/android/internal/location/ILocationProvider.aidl index 39c2d92bf278..71b54fb65ae5 100644 --- a/location/java/com/android/internal/location/ILocationProvider.aidl +++ b/location/java/com/android/internal/location/ILocationProvider.aidl @@ -16,29 +16,26 @@ package com.android.internal.location; -import android.location.Location; -import android.net.NetworkInfo; import android.os.Bundle; import android.os.WorkSource; -import com.android.internal.location.ProviderProperties; +import com.android.internal.location.ILocationProviderManager; import com.android.internal.location.ProviderRequest; /** - * Binder interface for services that implement location providers. - *

Use {@link LocationProviderBase} as a helper to implement this - * interface. + * Binder interface for services that implement location providers. Do not implement this directly, + * extend {@link LocationProviderBase} instead. * @hide */ interface ILocationProvider { - void enable(); - void disable(); - void setRequest(in ProviderRequest request, in WorkSource ws); + oneway void setLocationProviderManager(in ILocationProviderManager manager); - // --- deprecated (but still supported) --- - ProviderProperties getProperties(); + oneway void setRequest(in ProviderRequest request, in WorkSource ws); + + oneway void sendExtraCommand(String command, in Bundle extras); + + // --- deprecated and will be removed the future --- int getStatus(out Bundle extras); long getStatusUpdateTime(); - boolean sendExtraCommand(String command, inout Bundle extras); } diff --git a/location/java/com/android/internal/location/ILocationProviderManager.aidl b/location/java/com/android/internal/location/ILocationProviderManager.aidl new file mode 100644 index 000000000000..b1b8f0c7c3f7 --- /dev/null +++ b/location/java/com/android/internal/location/ILocationProviderManager.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.location; + +import android.location.Location; + +import com.android.internal.location.ProviderProperties; + +/** + * Binder interface for manager of all location providers. + * @hide + */ +interface ILocationProviderManager { + + void onSetEnabled(boolean enabled); + + void onSetProperties(in ProviderProperties properties); + + void onReportLocation(in Location location); +} diff --git a/location/java/com/android/internal/location/ProviderRequest.java b/location/java/com/android/internal/location/ProviderRequest.java index 88919f628638..a45c20d9d09d 100644 --- a/location/java/com/android/internal/location/ProviderRequest.java +++ b/location/java/com/android/internal/location/ProviderRequest.java @@ -16,15 +16,15 @@ package com.android.internal.location; -import java.util.ArrayList; -import java.util.List; - import android.annotation.UnsupportedAppUsage; import android.location.LocationRequest; import android.os.Parcel; import android.os.Parcelable; import android.util.TimeUtils; +import java.util.ArrayList; +import java.util.List; + /** @hide */ public final class ProviderRequest implements Parcelable { /** Location reporting is requested (true) */ @@ -35,6 +35,13 @@ public final class ProviderRequest implements Parcelable { @UnsupportedAppUsage public long interval = Long.MAX_VALUE; + /** + * When this flag is true, providers should ignore all location settings, user consents, power + * restrictions or any other restricting factors and always satisfy this request to the best of + * their ability. This flag should only be used in event of an emergency. + */ + public boolean forceLocation = false; + /** * Whether provider shall make stronger than normal tradeoffs to substantially restrict power * use. -- cgit v1.2.3-59-g8ed1b