summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorArthur Ishiguro <arthuri@google.com>2020-01-15 09:54:23 -0800
committerArthur Ishiguro <arthuri@google.com>2020-01-21 14:39:51 -0800
commit40428978557d2c2efd79d14d120df6669f9aefcc (patch)
tree6002f8537a36f194a999cb7d7be2a951a2398d6e /core/java
parent78bfd35ae1b0266cff5325a751880b9e1f0f72c0 (diff)
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
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/hardware/location/ContextHubClient.java5
-rw-r--r--core/java/android/hardware/location/ContextHubManager.java87
2 files changed, 74 insertions, 18 deletions
diff --git a/core/java/android/hardware/location/ContextHubClient.java b/core/java/android/hardware/location/ContextHubClient.java
index c6a5dd0d048d..43480ab9cc44 100644
--- a/core/java/android/hardware/location/ContextHubClient.java
+++ b/core/java/android/hardware/location/ContextHubClient.java
@@ -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");
diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java
index a51d2c929a2c..1001f800df3c 100644
--- a/core/java/android/hardware/location/ContextHubManager.java
+++ b/core/java/android/hardware/location/ContextHubManager.java
@@ -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);