Merge "Update ContextHubManager's System APIs." into nyc-dev

This commit is contained in:
Daniel Estrada Alva
2016-03-16 21:49:10 +00:00
committed by Android (Google) Code Review
3 changed files with 73 additions and 93 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

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