Merge "Send VR mode notification to AR app on context hub" into nyc-dev

This commit is contained in:
TreeHugger Robot
2016-06-15 21:09:31 +00:00
committed by Android (Google) Code Review

View File

@@ -21,12 +21,15 @@ import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.RemoteCallbackList; import android.os.RemoteCallbackList;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.Log; import android.util.Log;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* @hide * @hide
@@ -57,8 +60,11 @@ public class ContextHubService extends IContextHubService.Stub {
private static final int OS_APP_INSTANCE = -1; private static final int OS_APP_INSTANCE = -1;
private static final long APP_ID_ACTIVITY_RECOGNITION = 0x476f6f676c001000L;
private final Context mContext; private final Context mContext;
private final HashMap<Integer, NanoAppInstanceInfo> mNanoAppHash = new HashMap<>(); private final ConcurrentHashMap<Integer, NanoAppInstanceInfo> mNanoAppHash =
new ConcurrentHashMap<>();
private final ContextHubInfo[] mContextHubInfo; private final ContextHubInfo[] mContextHubInfo;
private final RemoteCallbackList<IContextHubCallback> mCallbacksList = private final RemoteCallbackList<IContextHubCallback> mCallbacksList =
new RemoteCallbackList<>(); new RemoteCallbackList<>();
@@ -66,6 +72,18 @@ public class ContextHubService extends IContextHubService.Stub {
private native int nativeSendMessage(int[] header, byte[] data); private native int nativeSendMessage(int[] header, byte[] data);
private native ContextHubInfo[] nativeInitialize(); private native ContextHubInfo[] nativeInitialize();
private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
@Override
public void onVrStateChanged(boolean enabled) {
for (NanoAppInstanceInfo app : mNanoAppHash.values()) {
if (app.getAppId() == APP_ID_ACTIVITY_RECOGNITION) {
sendVrStateChangeMessageToApp(app, enabled);
break;
}
}
}
};
public ContextHubService(Context context) { public ContextHubService(Context context) {
mContext = context; mContext = context;
mContextHubInfo = nativeInitialize(); mContextHubInfo = nativeInitialize();
@@ -74,6 +92,18 @@ public class ContextHubService extends IContextHubService.Stub {
Log.d(TAG, "ContextHub[" + i + "] id: " + mContextHubInfo[i].getId() Log.d(TAG, "ContextHub[" + i + "] id: " + mContextHubInfo[i].getId()
+ ", name: " + mContextHubInfo[i].getName()); + ", name: " + mContextHubInfo[i].getName());
} }
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_VR_MODE)) {
IVrManager vrManager =
IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager"));
if (vrManager != null) {
try {
vrManager.registerListener(mVrStateCallbacks);
} catch (RemoteException e) {
Log.e(TAG, "VR state listener registration failed", e);
}
}
}
} }
@Override @Override
@@ -277,4 +307,19 @@ public class ContextHubService extends IContextHubService.Stub {
return 0; return 0;
} }
private void sendVrStateChangeMessageToApp(NanoAppInstanceInfo app, boolean vrModeEnabled) {
int[] msgHeader = new int[MSG_HEADER_SIZE];
msgHeader[MSG_FIELD_TYPE] = 0;
msgHeader[MSG_FIELD_VERSION] = 0;
msgHeader[MSG_FIELD_HUB_HANDLE] = ANY_HUB;
msgHeader[MSG_FIELD_APP_INSTANCE] = app.getHandle();
byte[] data = new byte[1];
data[0] = (byte) ((vrModeEnabled) ? 1 : 0);
int ret = nativeSendMessage(msgHeader, data);
if (ret != 0) {
Log.e(TAG, "Couldn't send VR state change notification (" + ret + ")!");
}
}
} }