Merge "Update ContextHubManager's System APIs." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
5e19f91585
@@ -15284,7 +15284,7 @@ package android.hardware.location {
|
||||
}
|
||||
|
||||
public final class ContextHubManager {
|
||||
method public java.lang.Integer[] findNanoAppOnHub(int, android.hardware.location.NanoAppFilter);
|
||||
method public int[] findNanoAppOnHub(int, android.hardware.location.NanoAppFilter);
|
||||
method public int[] getContextHubHandles();
|
||||
method public android.hardware.location.ContextHubInfo getContextHubInfo(int);
|
||||
method public android.hardware.location.NanoAppInstanceInfo getNanoAppInstanceInfo(int);
|
||||
@@ -15300,8 +15300,9 @@ package android.hardware.location {
|
||||
field public static final int MSG_UNLOAD_NANO_APP = 2; // 0x2
|
||||
}
|
||||
|
||||
public abstract class ContextHubManager.ContextHubCallback {
|
||||
ctor public ContextHubManager.ContextHubCallback();
|
||||
public static abstract class ContextHubManager.ContextHubCallback {
|
||||
ctor protected ContextHubManager.ContextHubCallback();
|
||||
method public abstract void onMessageReceipt(int, int, android.hardware.location.ContextHubMessage);
|
||||
}
|
||||
|
||||
public class ContextHubMessage {
|
||||
|
||||
@@ -15,13 +15,8 @@
|
||||
*/
|
||||
package android.hardware.location;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SystemApi;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.ServiceConnection;
|
||||
import android.hardware.location.ContextHubService;
|
||||
import android.hardware.location.NanoAppInstanceInfo;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Looper;
|
||||
@@ -29,19 +24,11 @@ import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* A class that exposes the Context hubs on a device to
|
||||
* applicaions.
|
||||
* A class that exposes the Context hubs on a device to applications.
|
||||
*
|
||||
* Please not that this class is not expected to be used by
|
||||
* unbundled applications. Also, calling applications are
|
||||
* expected to have LOCTION_HARDWARE premissions to use this
|
||||
* class.
|
||||
* 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.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@@ -49,21 +36,14 @@ import java.util.concurrent.TimeUnit;
|
||||
public final class ContextHubManager {
|
||||
|
||||
private static final String TAG = "ContextHubManager";
|
||||
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
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 final Context mContext;
|
||||
private final Looper mMainLooper;
|
||||
private IContextHubService mContextHubService;
|
||||
private boolean mContextHubConnected;
|
||||
private ContextHubCallback mCallback;
|
||||
private Handler mCallbackHandler;
|
||||
|
||||
/**
|
||||
* A special context hub identifer meaning any possible hub on
|
||||
* the system.
|
||||
* A special context hub identifier meaning any possible hub on the system.
|
||||
*/
|
||||
public static final int ANY_HUB = -1;
|
||||
/**
|
||||
@@ -80,19 +60,24 @@ public final class ContextHubManager {
|
||||
public static final int MSG_DATA_SEND = 3;
|
||||
|
||||
/**
|
||||
* an interface to receive asynchronous communication from the context hub
|
||||
* An interface to receive asynchronous communication from the context hub.
|
||||
*/
|
||||
public abstract class ContextHubCallback {
|
||||
public abstract static class ContextHubCallback {
|
||||
protected ContextHubCallback() {}
|
||||
|
||||
/**
|
||||
* callback function called on message receipt from context hub
|
||||
* Callback function called on message receipt from context hub.
|
||||
*
|
||||
* @param hubId id of the hub of the message
|
||||
* @param nanoAppId identifier for the app that sent the message
|
||||
* @param msg the context hub message
|
||||
* @param hubHandle Handle (system-wide unique identifier) of the hub of the message.
|
||||
* @param nanoAppHandle Handle (unique identifier) for the app that sent the message.
|
||||
* @param message The context hub message.
|
||||
*
|
||||
* @see ContextHubMessage
|
||||
*/
|
||||
abstract void onMessageReceipt(int hubId, int nanoAppId, ContextHubMessage msg);
|
||||
public abstract void onMessageReceipt(
|
||||
int hubHandle,
|
||||
int nanoAppHandle,
|
||||
ContextHubMessage message);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,7 +89,7 @@ public final class ContextHubManager {
|
||||
try {
|
||||
retVal = getBinder().getContextHubHandles();
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not fetch context hub handles :" + e.toString());
|
||||
Log.e(TAG, "Could not fetch context hub handles : " + e);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
@@ -112,25 +97,24 @@ public final class ContextHubManager {
|
||||
/**
|
||||
* Get more information about a specific hub.
|
||||
*
|
||||
* @param contexthubHandle Handle of context hub
|
||||
*
|
||||
* @return ContextHubInfo returned information about the hub
|
||||
* @param hubHandle Handle (system-wide unique identifier) of a context hub.
|
||||
* @return ContextHubInfo Information about the requested context hub.
|
||||
*
|
||||
* @see ContextHubInfo
|
||||
*/
|
||||
public ContextHubInfo getContextHubInfo(int contexthubHandle) {
|
||||
public ContextHubInfo getContextHubInfo(int hubHandle) {
|
||||
ContextHubInfo retVal = null;
|
||||
try {
|
||||
retVal = getBinder().getContextHubInfo(contexthubHandle);
|
||||
retVal = getBinder().getContextHubInfo(hubHandle);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not fetch context hub info :" + e.toString());
|
||||
Log.e(TAG, "Could not fetch context hub info :" + e);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a nanoapp on a specified context hub
|
||||
* Load a nano app on a specified context hub.
|
||||
*
|
||||
* @param hubHandle handle of context hub to load the app on.
|
||||
* @param app the nanoApp to load on the hub
|
||||
@@ -149,7 +133,7 @@ public final class ContextHubManager {
|
||||
try {
|
||||
retVal = getBinder().loadNanoApp(hubHandle, app);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not fetch load nanoApp :" + e.toString());
|
||||
Log.e(TAG, "Could not fetch load nanoApp :" + e);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
@@ -158,17 +142,17 @@ public final class ContextHubManager {
|
||||
/**
|
||||
* Unload a specified nanoApp
|
||||
*
|
||||
* @param nanoAppInstanceHandle handle of the nanoApp to load
|
||||
* @param nanoAppHandle handle of the nanoApp to load
|
||||
*
|
||||
* @return int 0 on success, -1 otherewise
|
||||
* @return int 0 on success, -1 otherwise
|
||||
*/
|
||||
public int unloadNanoApp(int nanoAppInstanceHandle) {
|
||||
public int unloadNanoApp(int nanoAppHandle) {
|
||||
int retVal = -1;
|
||||
|
||||
try {
|
||||
retVal = getBinder().unloadNanoApp(nanoAppInstanceHandle);
|
||||
retVal = getBinder().unloadNanoApp(nanoAppHandle);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not fetch unload nanoApp :" + e.toString());
|
||||
Log.e(TAG, "Could not fetch unload nanoApp :" + e);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
@@ -177,20 +161,18 @@ public final class ContextHubManager {
|
||||
/**
|
||||
* get information about the nano app instance
|
||||
*
|
||||
* @param nanoAppInstanceHandle handle of the nanoAppInstance
|
||||
*
|
||||
* @return NanoAppInstanceInfo Inforamtion about the nano app
|
||||
* instance.
|
||||
* @param nanoAppHandle handle of the nanoAppInstance
|
||||
* @return NanoAppInstanceInfo Information about the nano app instance.
|
||||
*
|
||||
* @see NanoAppInstanceInfo
|
||||
*/
|
||||
public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle) {
|
||||
public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppHandle) {
|
||||
NanoAppInstanceInfo retVal = null;
|
||||
|
||||
try {
|
||||
retVal = getBinder().getNanoAppInstanceInfo(nanoAppInstanceHandle);
|
||||
retVal = getBinder().getNanoAppInstanceInfo(nanoAppHandle);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not fetch nanoApp info :" + e.toString());
|
||||
Log.e(TAG, "Could not fetch nanoApp info :" + e);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
@@ -204,33 +186,24 @@ public final class ContextHubManager {
|
||||
*
|
||||
* @see NanoAppFilter
|
||||
*
|
||||
* @return Integer[] Array of handles to any found nano apps
|
||||
* @return int[] Array of handles to any found nano apps
|
||||
*/
|
||||
public Integer[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) {
|
||||
int[] temp;
|
||||
Integer[] retVal = null;
|
||||
|
||||
public int[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) {
|
||||
int[] retVal = null;
|
||||
try {
|
||||
temp = getBinder().findNanoAppOnHub(hubHandle, filter);
|
||||
retVal = new Integer[temp.length];
|
||||
for (int i = 0; i < temp.length; i++) {
|
||||
retVal[i] = temp[i];
|
||||
}
|
||||
retVal = getBinder().findNanoAppOnHub(hubHandle, filter);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not query nanoApp instance :" + e.toString());
|
||||
Log.e(TAG, "Could not query nanoApp instance :" + e);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a spcific nano app instance on a context
|
||||
* hub
|
||||
*
|
||||
* Send a message to a specific nano app instance on a context hub.
|
||||
*
|
||||
* @param hubHandle handle of the hub to send the message to
|
||||
* @param nanoAppHandle handle of the nano app to send to
|
||||
* @param msg Message to be sent
|
||||
* @param message Message to be sent
|
||||
*
|
||||
* @see ContextHubMessage
|
||||
*
|
||||
@@ -251,7 +224,6 @@ public final class ContextHubManager {
|
||||
/**
|
||||
* Set a callback to receive messages from the context hub
|
||||
*
|
||||
*
|
||||
* @param callback Callback object
|
||||
*
|
||||
* @see ContextHubCallback
|
||||
@@ -265,9 +237,8 @@ public final class ContextHubManager {
|
||||
/**
|
||||
* Set a callback to receive messages from the context hub
|
||||
*
|
||||
*
|
||||
* @param callback Callback object
|
||||
* @param hander Hander object
|
||||
* @param handler Handler object
|
||||
*
|
||||
* @see ContextHubCallback
|
||||
*
|
||||
@@ -286,8 +257,7 @@ public final class ContextHubManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a callback for receive messages from the context
|
||||
* hub
|
||||
* Unregister a callback for receive messages from the context hub.
|
||||
*
|
||||
* @see ContextHubCallback
|
||||
*
|
||||
@@ -308,14 +278,10 @@ public final class ContextHubManager {
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void checkPermissions() {
|
||||
mContext.enforceCallingPermission(HARDWARE_PERMISSION, ENFORCE_HW_PERMISSION_MESSAGE);
|
||||
}
|
||||
|
||||
private IContextHubCallback.Stub mClientCallback = new IContextHubCallback.Stub() {
|
||||
@Override
|
||||
public void onMessageReceipt(final int hubId, final int nanoAppId,
|
||||
final ContextHubMessage message) throws RemoteException {
|
||||
final ContextHubMessage message) {
|
||||
if (mCallback != null) {
|
||||
synchronized(this) {
|
||||
final ContextHubCallback callback = mCallback;
|
||||
@@ -336,8 +302,6 @@ public final class ContextHubManager {
|
||||
|
||||
/** @hide */
|
||||
public ContextHubManager(Context context, Looper mainLooper) {
|
||||
checkPermissions();
|
||||
mContext = context;
|
||||
mMainLooper = mainLooper;
|
||||
|
||||
IBinder b = ServiceManager.getService(ContextHubService.CONTEXTHUB_SERVICE);
|
||||
@@ -347,7 +311,7 @@ public final class ContextHubManager {
|
||||
try {
|
||||
getBinder().registerCallback(mClientCallback);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Could not register callback:" + e.toString());
|
||||
Log.e(TAG, "Could not register callback:" + e);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@@ -16,10 +16,8 @@
|
||||
|
||||
package android.hardware.location;
|
||||
|
||||
import android.app.Service;
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
|
||||
@@ -32,6 +30,9 @@ import java.util.HashMap;
|
||||
public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
private static final String TAG = "ContextHubService";
|
||||
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";
|
||||
|
||||
public static final String CONTEXTHUB_SERVICE = "contexthub_service";
|
||||
|
||||
@@ -56,6 +57,7 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
@Override
|
||||
public int registerCallback(IContextHubCallback callback) throws RemoteException{
|
||||
checkPermissions();
|
||||
mCallback = callback;
|
||||
return 0;
|
||||
}
|
||||
@@ -83,6 +85,7 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
@Override
|
||||
public int[] getContextHubHandles() throws RemoteException {
|
||||
checkPermissions();
|
||||
int [] returnArray = new int[mContextHubInfo.length];
|
||||
|
||||
for (int i = 0; i < returnArray.length; ++i) {
|
||||
@@ -96,6 +99,7 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
@Override
|
||||
public ContextHubInfo getContextHubInfo(int contextHubHandle) throws RemoteException {
|
||||
checkPermissions();
|
||||
contextHubHandle -= 1;
|
||||
if (!(contextHubHandle >= 0 && contextHubHandle < mContextHubInfo.length)) {
|
||||
return null; // null means fail
|
||||
@@ -106,6 +110,7 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
@Override
|
||||
public int loadNanoApp(int contextHubHandle, NanoApp app) throws RemoteException {
|
||||
checkPermissions();
|
||||
contextHubHandle -= 1;
|
||||
|
||||
if (!(contextHubHandle >= 0 && contextHubHandle < mContextHubInfo.length)) {
|
||||
@@ -123,11 +128,12 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
return nativeSendMessage(msgHeader, app.getAppBinary());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int unloadNanoApp(int nanoAppInstanceHandle) throws RemoteException {
|
||||
@Override
|
||||
public int unloadNanoApp(int nanoAppInstanceHandle) throws RemoteException {
|
||||
checkPermissions();
|
||||
NanoAppInstanceInfo info = mNanoAppHash.get(nanoAppInstanceHandle);
|
||||
if (info == null) {
|
||||
return -1; //means failed
|
||||
return -1; //means failed
|
||||
}
|
||||
|
||||
// Call Native interface here
|
||||
@@ -137,10 +143,12 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
msgHeader[2] = info.getHandle();
|
||||
|
||||
return nativeSendMessage(msgHeader, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle) throws RemoteException {
|
||||
public NanoAppInstanceInfo getNanoAppInstanceInfo(int nanoAppInstanceHandle)
|
||||
throws RemoteException {
|
||||
checkPermissions();
|
||||
// This assumes that all the nanoAppInfo is current. This is reasonable
|
||||
// for the use cases for tightly controlled nanoApps.
|
||||
if (mNanoAppHash.containsKey(nanoAppInstanceHandle)) {
|
||||
@@ -152,6 +160,7 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
@Override
|
||||
public int[] findNanoAppOnHub(int hubHandle, NanoAppFilter filter) throws RemoteException {
|
||||
checkPermissions();
|
||||
ArrayList<Integer> foundInstances = new ArrayList<Integer>();
|
||||
|
||||
for(Integer nanoAppInstance : mNanoAppHash.keySet()) {
|
||||
@@ -171,7 +180,9 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage msg) throws RemoteException {
|
||||
public int sendMessage(int hubHandle, int nanoAppHandle, ContextHubMessage msg)
|
||||
throws RemoteException {
|
||||
checkPermissions();
|
||||
int[] msgHeader = new int[8];
|
||||
msgHeader[0] = ContextHubManager.MSG_DATA_SEND;
|
||||
msgHeader[1] = hubHandle;
|
||||
@@ -181,5 +192,9 @@ public class ContextHubService extends IContextHubService.Stub {
|
||||
|
||||
return nativeSendMessage(msgHeader, msg.getData());
|
||||
}
|
||||
|
||||
private void checkPermissions() {
|
||||
mContext.enforceCallingPermission(HARDWARE_PERMISSION, ENFORCE_HW_PERMISSION_MESSAGE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user