Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(558)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java

Issue 2428563003: Launch Chrome when phone inserted into Daydream headset IFF Chrome was the active app (Closed)
Patch Set: review Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
index 776d2a6b1e75849c281b8c1bd5d42b31e635992f..cdd3403cb3ea8fcb0fd770028c2d277fb009f93c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -5,6 +5,8 @@
package org.chromium.chrome.browser.vr_shell;
import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.StrictMode;
@@ -36,13 +38,18 @@ public class VrShellDelegate {
private Class<? extends VrShell> mVrShellClass;
private Class<? extends NonPresentingGvrContext> mNonPresentingGvrContextClass;
+ private Class<? extends VrDaydreamApi> mVrDaydreamApiClass;
private VrShell mVrShell;
private NonPresentingGvrContext mNonPresentingGvrContext;
+ private VrDaydreamApi mVrDaydreamApi;
private boolean mInVr;
private int mRestoreSystemUiVisibilityFlag = -1;
private String mVrExtra;
private long mNativeVrShellDelegate;
+ private static final String DAYDREAM_DON_AUTO_TRANSITION =
+ "org.chromium.chrome.browser.vr_shell.DAYDREAM_DON_AUTO_TRANSITION";
+
public VrShellDelegate(ChromeTabbedActivity activity) {
mActivity = activity;
@@ -54,6 +61,7 @@ public class VrShellDelegate {
Log.e(TAG, "Unable to read VR_EXTRA field", e);
mVrEnabled = false;
}
+ createVrDaydreamApi();
}
}
@@ -75,10 +83,13 @@ public class VrShellDelegate {
mNonPresentingGvrContextClass =
(Class<? extends NonPresentingGvrContext>) Class.forName(
"org.chromium.chrome.browser.vr_shell.NonPresentingGvrContextImpl");
+ mVrDaydreamApiClass = (Class<? extends VrDaydreamApi>) Class.forName(
+ "org.chromium.chrome.browser.vr_shell.VrDaydreamApiImpl");
return true;
} catch (ClassNotFoundException e) {
mVrShellClass = null;
mNonPresentingGvrContextClass = null;
+ mVrDaydreamApiClass = null;
return false;
}
}
@@ -132,6 +143,10 @@ public class VrShellDelegate {
* Resumes VR Shell.
*/
public void maybeResumeVR() {
+ if (isVrShellEnabled()) {
+ registerDaydreamIntent();
+ }
+
// TODO(bshe): Ideally, we do not need two gvr context exist at the same time. We can
// probably shutdown non presenting gvr when presenting and create a new one after exit
// presenting. See crbug.com/655242
@@ -163,6 +178,10 @@ public class VrShellDelegate {
* Pauses VR Shell.
*/
public void maybePauseVR() {
+ if (isVrShellEnabled()) {
+ unregisterDaydreamIntent();
+ }
+
if (mNonPresentingGvrContext != null) {
mNonPresentingGvrContext.pause();
}
@@ -187,6 +206,40 @@ public class VrShellDelegate {
return true;
}
+ /**
+ * Registers the Intent to fire after phone inserted into a headset.
+ */
+ private void registerDaydreamIntent() {
+ if (mVrDaydreamApi == null) return;
+
+ Intent intent = new Intent();
+ // TODO(bshe): Ideally, this should go through ChromeLauncherActivity. To avoid polluting
+ // metrics, use ChromeTabbedActivity directly for now.
+ intent.setClass(mActivity, ChromeTabbedActivity.class);
+ intent.putExtra(DAYDREAM_DON_AUTO_TRANSITION, true);
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(mActivity, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+ mVrDaydreamApi.registerDaydreamIntent(pendingIntent);
+ }
+
+ /**
+ * Unregisters the Intent which registered by this context if any.
+ */
+ private void unregisterDaydreamIntent() {
+ if (mVrDaydreamApi != null) {
+ mVrDaydreamApi.unregisterDaydreamIntent();
+ }
+ }
+
+ /**
+ * Closes DaydreamApi.
+ */
+ public void close() {
+ if (mVrDaydreamApi != null) {
+ mVrDaydreamApi.close();
+ }
+ }
+
@CalledByNative
private long createNonPresentingNativeContext() {
if (!mVrEnabled) return 0;
@@ -227,6 +280,21 @@ public class VrShellDelegate {
if (tab != null) tab.updateFullscreenEnabledState();
}
+ private boolean createVrDaydreamApi() {
+ if (!mVrEnabled) return false;
+
+ try {
+ Constructor<?> vrPrivateApiConstructor =
+ mVrDaydreamApiClass.getConstructor(Context.class);
+ mVrDaydreamApi = (VrDaydreamApi) vrPrivateApiConstructor.newInstance(mActivity);
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException e) {
+ Log.e(TAG, "Unable to instantiate VrDaydreamApi", e);
+ return false;
+ }
+ return true;
+ }
+
private boolean createVrShell() {
StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
StrictMode.allowThreadDiskWrites();
@@ -294,7 +362,8 @@ public class VrShellDelegate {
*/
public boolean isVrIntent(Intent intent) {
if (intent == null) return false;
- return intent.getBooleanExtra(mVrExtra, false);
+ return intent.getBooleanExtra(DAYDREAM_DON_AUTO_TRANSITION, false)
+ || intent.getBooleanExtra(mVrExtra, false);
}
/**
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrDaydreamApiImpl.java ('k') | chrome/android/java_sources.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698