Add queryPreloadedNanoapps Test API to the Context Hub Service

Bug: 258074235
Test: adb shell dumpsys contexthub # shows preloaded nanoapps
Change-Id: Id4f3456f5b46daf6b4a194cdddc0b5f179ee4b1a
This commit is contained in:
Matthew Sedam
2022-11-14 18:13:43 +00:00
parent dc0e43ba6b
commit c92cb1ebb4
4 changed files with 75 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

@@ -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));