Merge changes from topic "test-api-preloaded-nanoapps"

* changes:
  Adds a test API to get the list of preloaded nanoapp
  Add queryPreloadedNanoapps Test API to the Context Hub Service
This commit is contained in:
Matthew Sedam
2022-12-02 17:38:04 +00:00
committed by Android (Google) Code Review
6 changed files with 112 additions and 4 deletions

View File

@@ -205,7 +205,7 @@ java_library {
"android.hardware.contexthub-V1.0-java",
"android.hardware.contexthub-V1.1-java",
"android.hardware.contexthub-V1.2-java",
"android.hardware.contexthub-V1-java",
"android.hardware.contexthub-V2-java",
"android.hardware.gnss-V1.0-java",
"android.hardware.gnss-V2.1-java",
"android.hardware.health-V1.0-java-constants",

View File

@@ -1316,6 +1316,14 @@ package android.hardware.lights {
}
package android.hardware.location {
public final class ContextHubManager {
method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public long[] getPreloadedNanoAppIds(@NonNull android.hardware.location.ContextHubInfo);
}
}
package android.hardware.soundtrigger {
public class KeyphraseEnrollmentInfo {

View File

@@ -24,6 +24,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.app.ActivityThread;
import android.app.PendingIntent;
import android.content.Context;
@@ -965,6 +966,34 @@ public final class ContextHubManager {
return createClient(null /* context */, hubInfo, pendingIntent, nanoAppId);
}
/**
* Queries for the list of preloaded nanoapp IDs on the system.
*
* @param hubInfo The Context Hub to query a list of nanoapp IDs from.
*
* @return The list of 64-bit IDs of the preloaded nanoapps.
*
* @throws NullPointerException if hubInfo is null
* @hide
*/
@TestApi
@RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
@NonNull public long[] getPreloadedNanoAppIds(@NonNull ContextHubInfo hubInfo) {
Objects.requireNonNull(hubInfo, "hubInfo cannot be null");
long[] nanoappIds = null;
try {
nanoappIds = mService.getPreloadedNanoAppIds(hubInfo);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
if (nanoappIds == null) {
nanoappIds = new long[0];
}
return nanoappIds;
}
/**
* Unregister a callback for receive messages from the context hub.
*

View File

@@ -109,4 +109,8 @@ interface IContextHubService {
// Queries for a list of nanoapps
@EnforcePermission("ACCESS_CONTEXT_HUB")
void queryNanoApps(int contextHubId, in IContextHubTransactionCallback transactionCallback);
// Queries for a list of preloaded nanoapps
@EnforcePermission("ACCESS_CONTEXT_HUB")
long[] getPreloadedNanoAppIds(in ContextHubInfo hubInfo);
}

View File

@@ -73,6 +73,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -147,7 +148,6 @@ public class ContextHubService extends IContextHubService.Stub {
private final ScheduledThreadPoolExecutor mDailyMetricTimer =
new ScheduledThreadPoolExecutor(1);
// The period of the recurring time
private static final int PERIOD_METRIC_QUERY_DAYS = 1;
@@ -363,11 +363,13 @@ public class ContextHubService extends IContextHubService.Stub {
*/
private void initDefaultClientMap() {
HashMap<Integer, IContextHubClient> defaultClientMap = new HashMap<>();
for (int contextHubId : mContextHubIdToInfoMap.keySet()) {
for (Map.Entry<Integer, ContextHubInfo> entry: mContextHubIdToInfoMap.entrySet()) {
int contextHubId = entry.getKey();
ContextHubInfo contextHubInfo = entry.getValue();
mLastRestartTimestampMap.put(contextHubId,
new AtomicLong(SystemClock.elapsedRealtimeNanos()));
ContextHubInfo contextHubInfo = mContextHubIdToInfoMap.get(contextHubId);
IContextHubClient client = mClientManager.registerClient(
contextHubInfo, createDefaultClientCallback(contextHubId),
/* attributionTag= */ null, mTransactionManager, mContext.getPackageName());
@@ -1133,6 +1135,26 @@ public class ContextHubService extends IContextHubService.Stub {
mTransactionManager.addTransaction(transaction);
}
@android.annotation.EnforcePermission(android.Manifest.permission.ACCESS_CONTEXT_HUB)
/**
* Queries for a list of preloaded nanoapp IDs from the specified Context Hub.
*
* @param hubInfo The Context Hub to query a list of nanoapps from.
* @return The list of 64-bit IDs of the preloaded nanoapps.
* @throws NullPointerException if hubInfo is null
*/
@Override
public long[] getPreloadedNanoAppIds(ContextHubInfo hubInfo) throws RemoteException {
super.getPreloadedNanoAppIds_enforcePermission();
Objects.requireNonNull(hubInfo, "hubInfo cannot be null");
long[] nanoappIds = mContextHubWrapper.getPreloadedNanoappIds();
if (nanoappIds == null) {
return new long[0];
}
return nanoappIds;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
@@ -1159,6 +1181,10 @@ public class ContextHubService extends IContextHubService.Stub {
// Dump nanoAppHash
mNanoAppStateManager.foreachNanoAppInstanceInfo((info) -> pw.println(info));
pw.println("");
pw.println("=================== PRELOADED NANOAPPS ====================");
dumpPreloadedNanoapps(pw);
pw.println("");
pw.println("=================== CLIENTS ====================");
pw.println(mClientManager);
@@ -1201,6 +1227,21 @@ public class ContextHubService extends IContextHubService.Stub {
proto.flush();
}
/**
* Dumps preloaded nanoapps to the console
*/
private void dumpPreloadedNanoapps(PrintWriter pw) {
if (mContextHubWrapper == null) {
return;
}
long[] preloadedNanoappIds = mContextHubWrapper.getPreloadedNanoappIds();
for (long preloadedNanoappId: preloadedNanoappIds) {
pw.print("ID: 0x");
pw.println(Long.toHexString(preloadedNanoappId));
}
}
private void checkPermissions() {
ContextHubServiceUtil.checkPermissions(mContext);
}

View File

@@ -358,6 +358,14 @@ public abstract class IContextHubWrapper {
@ContextHubTransaction.Result
public abstract int queryNanoapps(int contextHubId) throws RemoteException;
/**
* Provides the list of preloaded nanoapp IDs on the system. The output of this API must
* not change.
*
* @return The list of preloaded nanoapp IDs
*/
public abstract long[] getPreloadedNanoappIds();
/**
* Registers a callback with the Context Hub.
*
@@ -683,6 +691,20 @@ public abstract class IContextHubWrapper {
}
}
public long[] getPreloadedNanoappIds() {
android.hardware.contexthub.IContextHub hub = getHub();
if (hub == null) {
return null;
}
try {
return hub.getPreloadedNanoappIds();
} catch (RemoteException e) {
Log.e(TAG, "Exception while getting preloaded nanoapp IDs: " + e.getMessage());
return null;
}
}
public void registerExistingCallback(int contextHubId) {
android.hardware.contexthub.IContextHub hub = getHub();
if (hub == null) {
@@ -863,6 +885,10 @@ public abstract class IContextHubWrapper {
mHub.queryApps(contextHubId));
}
public long[] getPreloadedNanoappIds() {
return new long[0];
}
public void registerCallback(int contextHubId, ICallback callback) throws RemoteException {
mHidlCallbackMap.put(contextHubId,
new ContextHubWrapperHidlCallback(contextHubId, callback));