Adds a new ACCESS_CONTEXT_HUB permission
Since not all Context Hub applications are location-related, the use of the LOCATION_HARDWARE permission to control access to the Context Hub System APIs can be misleading. Create a new permission to access it, and adds the logic to enforce the permission. Also clarifies usage of PendingIntent ContextHubClient. Bug: 135951924 Test: Compile and flash Change-Id: I5f22db7e57ef4a6c3718acb38c4f313d6a04839f
This commit is contained in:
@@ -5,6 +5,7 @@ package android {
|
||||
field public static final String ACCESS_AMBIENT_LIGHT_STATS = "android.permission.ACCESS_AMBIENT_LIGHT_STATS";
|
||||
field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO";
|
||||
field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM";
|
||||
field public static final String ACCESS_CONTEXT_HUB = "android.permission.ACCESS_CONTEXT_HUB";
|
||||
field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES";
|
||||
field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
|
||||
field public static final String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS";
|
||||
@@ -2860,7 +2861,7 @@ package android.hardware.location {
|
||||
public class ContextHubClient implements java.io.Closeable {
|
||||
method public void close();
|
||||
method @NonNull public android.hardware.location.ContextHubInfo getAttachedHub();
|
||||
method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int sendMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage);
|
||||
method @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int sendMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage);
|
||||
}
|
||||
|
||||
public class ContextHubClientCallback {
|
||||
@@ -2909,24 +2910,24 @@ package android.hardware.location {
|
||||
}
|
||||
|
||||
public final class ContextHubManager {
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int[] getContextHubHandles();
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
|
||||
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback, @NonNull java.util.concurrent.Executor);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.ContextHubClientCallback);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubClient createClient(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.app.PendingIntent, long);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @Deprecated @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
|
||||
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int[] getContextHubHandles();
|
||||
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public java.util.List<android.hardware.location.ContextHubInfo> getContextHubs();
|
||||
method @Deprecated @Nullable @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
|
||||
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
|
||||
method @Deprecated public int registerCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
|
||||
method @Deprecated public int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int sendMessage(int, int, @NonNull android.hardware.location.ContextHubMessage);
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public int unloadNanoApp(int);
|
||||
method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int sendMessage(int, int, @NonNull android.hardware.location.ContextHubMessage);
|
||||
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public int unloadNanoApp(int);
|
||||
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_CONTEXT_HUB}) public android.hardware.location.ContextHubTransaction<java.lang.Void> unloadNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
|
||||
method @Deprecated public int unregisterCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
|
||||
field public static final int EVENT_HUB_RESET = 6; // 0x6
|
||||
field public static final int EVENT_NANOAPP_ABORTED = 4; // 0x4
|
||||
|
||||
@@ -136,7 +136,10 @@ public class ContextHubClient implements Closeable {
|
||||
* @see NanoAppMessage
|
||||
* @see ContextHubTransaction.Result
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@ContextHubTransaction.Result
|
||||
public int sendMessageToNanoApp(@NonNull NanoAppMessage message) {
|
||||
Objects.requireNonNull(message, "NanoAppMessage cannot be null");
|
||||
|
||||
@@ -44,7 +44,9 @@ import java.util.concurrent.Executor;
|
||||
* A class that exposes the Context hubs on a device to applications.
|
||||
*
|
||||
* Please note that this class is not expected to be used by unbundled applications. Also, calling
|
||||
* applications are expected to have LOCATION_HARDWARE permissions to use this class.
|
||||
* applications are expected to have LOCATION_HARDWARE or ACCESS_CONTEXT_HUB permissions to use this
|
||||
* class. Use of LOCATION_HARDWARE to enable access to these APIs is deprecated and may be removed
|
||||
* in the future - all applications are recommended to move to the ACCESS_CONTEXT_HUB permission.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@@ -196,7 +198,10 @@ public final class ContextHubManager {
|
||||
* new APIs.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
public int[] getContextHubHandles() {
|
||||
try {
|
||||
return mService.getContextHubHandles();
|
||||
@@ -217,7 +222,10 @@ public final class ContextHubManager {
|
||||
* new APIs.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
public ContextHubInfo getContextHubInfo(int hubHandle) {
|
||||
try {
|
||||
return mService.getContextHubInfo(hubHandle);
|
||||
@@ -248,7 +256,10 @@ public final class ContextHubManager {
|
||||
* @deprecated Use {@link #loadNanoApp(ContextHubInfo, NanoAppBinary)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
public int loadNanoApp(int hubHandle, @NonNull NanoApp app) {
|
||||
try {
|
||||
return mService.loadNanoApp(hubHandle, app);
|
||||
@@ -275,7 +286,10 @@ public final class ContextHubManager {
|
||||
* @deprecated Use {@link #unloadNanoApp(ContextHubInfo, long)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
public int unloadNanoApp(int nanoAppHandle) {
|
||||
try {
|
||||
return mService.unloadNanoApp(nanoAppHandle);
|
||||
@@ -315,7 +329,10 @@ public final class ContextHubManager {
|
||||
* for loaded nanoapps.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@Nullable public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppHandle) {
|
||||
try {
|
||||
return mService.getNanoAppInstanceInfo(nanoAppHandle);
|
||||
@@ -338,7 +355,10 @@ public final class ContextHubManager {
|
||||
* for loaded nanoapps.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public int[] findNanoAppOnHub(int hubHandle, @NonNull NanoAppFilter filter) {
|
||||
try {
|
||||
return mService.findNanoAppOnHub(hubHandle, filter);
|
||||
@@ -373,7 +393,10 @@ public final class ContextHubManager {
|
||||
* or {@link #createClient(ContextHubInfo, ContextHubClientCallback)}.
|
||||
*/
|
||||
@Deprecated
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
public int sendMessage(int hubHandle, int nanoAppHandle, @NonNull ContextHubMessage message) {
|
||||
try {
|
||||
return mService.sendMessage(hubHandle, nanoAppHandle, message);
|
||||
@@ -389,7 +412,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @see ContextHubInfo
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public List<ContextHubInfo> getContextHubs() {
|
||||
try {
|
||||
return mService.getContextHubs();
|
||||
@@ -466,7 +492,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @see NanoAppBinary
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubTransaction<Void> loadNanoApp(
|
||||
@NonNull ContextHubInfo hubInfo, @NonNull NanoAppBinary appBinary) {
|
||||
Objects.requireNonNull(hubInfo, "ContextHubInfo cannot be null");
|
||||
@@ -495,7 +524,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @throws NullPointerException if hubInfo is null
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubTransaction<Void> unloadNanoApp(
|
||||
@NonNull ContextHubInfo hubInfo, long nanoAppId) {
|
||||
Objects.requireNonNull(hubInfo, "ContextHubInfo cannot be null");
|
||||
@@ -523,7 +555,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @throws NullPointerException if hubInfo is null
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubTransaction<Void> enableNanoApp(
|
||||
@NonNull ContextHubInfo hubInfo, long nanoAppId) {
|
||||
Objects.requireNonNull(hubInfo, "ContextHubInfo cannot be null");
|
||||
@@ -551,7 +586,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @throws NullPointerException if hubInfo is null
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubTransaction<Void> disableNanoApp(
|
||||
@NonNull ContextHubInfo hubInfo, long nanoAppId) {
|
||||
Objects.requireNonNull(hubInfo, "ContextHubInfo cannot be null");
|
||||
@@ -578,7 +616,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @throws NullPointerException if hubInfo is null
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubTransaction<List<NanoAppState>> queryNanoApps(
|
||||
@NonNull ContextHubInfo hubInfo) {
|
||||
Objects.requireNonNull(hubInfo, "ContextHubInfo cannot be null");
|
||||
@@ -724,7 +765,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @see ContextHubClientCallback
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubClient createClient(
|
||||
@NonNull ContextHubInfo hubInfo, @NonNull ContextHubClientCallback callback,
|
||||
@NonNull @CallbackExecutor Executor executor) {
|
||||
@@ -761,7 +805,10 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @see ContextHubClientCallback
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubClient createClient(
|
||||
@NonNull ContextHubInfo hubInfo, @NonNull ContextHubClientCallback callback) {
|
||||
return createClient(hubInfo, callback, new HandlerExecutor(Handler.getMain()));
|
||||
@@ -780,6 +827,9 @@ public final class ContextHubManager {
|
||||
* If a client is regenerated, the host endpoint identifier attached to messages sent to the
|
||||
* nanoapp remains consistent, even if the original process has exited.
|
||||
*
|
||||
* To avoid unintentionally spreading data from the Context Hub to external applications, it is
|
||||
* strongly recommended that the PendingIntent supplied to this API is an explicit intent.
|
||||
*
|
||||
* If registered successfully, intents will be delivered regarding events or messages from the
|
||||
* specified nanoapp from the attached Context Hub. The intent will have an extra
|
||||
* {@link ContextHubManager.EXTRA_CONTEXT_HUB_INFO} of type {@link ContextHubInfo}, which
|
||||
@@ -804,7 +854,10 @@ public final class ContextHubManager {
|
||||
* @throws IllegalStateException if there were too many registered clients at the service
|
||||
* @throws NullPointerException if pendingIntent or hubInfo is null
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
|
||||
@RequiresPermission(anyOf = {
|
||||
android.Manifest.permission.LOCATION_HARDWARE,
|
||||
android.Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
})
|
||||
@NonNull public ContextHubClient createClient(
|
||||
@NonNull ContextHubInfo hubInfo, @NonNull PendingIntent pendingIntent, long nanoAppId) {
|
||||
Objects.requireNonNull(pendingIntent);
|
||||
|
||||
@@ -1527,6 +1527,14 @@
|
||||
android:protectionLevel="signature|privileged" />
|
||||
<uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
|
||||
|
||||
<!-- @SystemApi Allows an application to use the Context Hub.
|
||||
<p>Not for use by third-party applications.
|
||||
@hide
|
||||
-->
|
||||
<permission android:name="android.permission.ACCESS_CONTEXT_HUB"
|
||||
android:protectionLevel="signature|privileged" />
|
||||
<uses-permission android:name="android.permission.ACCESS_CONTEXT_HUB"/>
|
||||
|
||||
<!-- @SystemApi Allows an application to create mock location providers for testing.
|
||||
<p>Protection level: signature
|
||||
@hide
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.server.location;
|
||||
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
@@ -108,6 +110,11 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
|
||||
*/
|
||||
private AtomicBoolean mIsPendingIntentCancelled = new AtomicBoolean(false);
|
||||
|
||||
/*
|
||||
* True if the application creating the client has the ACCESS_CONTEXT_HUB permission.
|
||||
*/
|
||||
private final boolean mHasAccessContextHubPermission;
|
||||
|
||||
/*
|
||||
* Helper class to manage registered PendingIntent requests from the client.
|
||||
*/
|
||||
@@ -165,6 +172,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
|
||||
mCallbackInterface = callback;
|
||||
mPendingIntentRequest = new PendingIntentRequest();
|
||||
mPackage = mContext.getPackageManager().getNameForUid(Binder.getCallingUid());
|
||||
|
||||
mHasAccessContextHubPermission = context.checkCallingPermission(
|
||||
Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/* package */ ContextHubClientBroker(
|
||||
@@ -178,6 +188,9 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
|
||||
mHostEndPointId = hostEndPointId;
|
||||
mPendingIntentRequest = new PendingIntentRequest(pendingIntent, nanoAppId);
|
||||
mPackage = pendingIntent.getCreatorPackage();
|
||||
|
||||
mHasAccessContextHubPermission = context.checkCallingPermission(
|
||||
Manifest.permission.ACCESS_CONTEXT_HUB) == PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -415,10 +428,12 @@ public class ContextHubClientBroker extends IContextHubClient.Stub
|
||||
*/
|
||||
private void doSendPendingIntent(PendingIntent pendingIntent, Intent intent) {
|
||||
try {
|
||||
String requiredPermission = mHasAccessContextHubPermission
|
||||
? Manifest.permission.ACCESS_CONTEXT_HUB
|
||||
: Manifest.permission.LOCATION_HARDWARE;
|
||||
pendingIntent.send(
|
||||
mContext, 0 /* code */, intent, null /* onFinished */, null /* Handler */,
|
||||
Manifest.permission.LOCATION_HARDWARE /* requiredPermission */,
|
||||
null /* options */);
|
||||
requiredPermission, null /* options */);
|
||||
} catch (PendingIntent.CanceledException e) {
|
||||
mIsPendingIntentCancelled.set(true);
|
||||
// The PendingIntent is no longer valid
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.server.location;
|
||||
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.hardware.contexthub.V1_0.ContextHub;
|
||||
@@ -30,11 +32,10 @@ import android.hardware.location.NanoAppMessage;
|
||||
import android.hardware.location.NanoAppState;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* A class encapsulating helper functions used by the ContextHubService class
|
||||
@@ -42,8 +43,7 @@ import java.util.ArrayList;
|
||||
/* package */ class ContextHubServiceUtil {
|
||||
private static final String TAG = "ContextHubServiceUtil";
|
||||
private static final String HARDWARE_PERMISSION = Manifest.permission.LOCATION_HARDWARE;
|
||||
private static final String ENFORCE_HW_PERMISSION_MESSAGE = "Permission '"
|
||||
+ HARDWARE_PERMISSION + "' not granted to access ContextHub Hardware";
|
||||
private static final String CONTEXT_HUB_PERMISSION = Manifest.permission.ACCESS_CONTEXT_HUB;
|
||||
|
||||
/**
|
||||
* Creates a ConcurrentHashMap of the Context Hub ID to the ContextHubInfo object given an
|
||||
@@ -200,7 +200,11 @@ import java.util.ArrayList;
|
||||
*/
|
||||
/* package */
|
||||
static void checkPermissions(Context context) {
|
||||
context.enforceCallingPermission(HARDWARE_PERMISSION, ENFORCE_HW_PERMISSION_MESSAGE);
|
||||
if (context.checkCallingPermission(HARDWARE_PERMISSION) != PERMISSION_GRANTED
|
||||
&& context.checkCallingPermission(CONTEXT_HUB_PERMISSION) != PERMISSION_GRANTED) {
|
||||
throw new SecurityException(
|
||||
"LOCATION_HARDWARE or ACCESS_CONTEXT_HUB permission required to use Context Hub");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user