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

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

Issue 2398103002: Enable magic window mode with new Gvr (Closed)
Patch Set: rebase 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.vr_shell; 5 package org.chromium.chrome.browser.vr_shell;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.content.Intent; 8 import android.content.Intent;
9 import android.content.pm.ActivityInfo; 9 import android.content.pm.ActivityInfo;
10 import android.os.StrictMode; 10 import android.os.StrictMode;
(...skipping 14 matching lines...) Expand all
25 25
26 /** 26 /**
27 * Manages interactions with the VR Shell. 27 * Manages interactions with the VR Shell.
28 */ 28 */
29 @JNINamespace("vr_shell") 29 @JNINamespace("vr_shell")
30 public class VrShellDelegate { 30 public class VrShellDelegate {
31 private static final String TAG = "VrShellDelegate"; 31 private static final String TAG = "VrShellDelegate";
32 32
33 private ChromeTabbedActivity mActivity; 33 private ChromeTabbedActivity mActivity;
34 34
35 private boolean mVrShellEnabled; 35 private boolean mVrEnabled;
36 36
37 private Class<? extends VrShellInterface> mVrShellClass; 37 private Class<? extends VrShellInterface> mVrShellClass;
38 private Class<? extends NonPresentingGvrContextInterface> mNonPresentingGvrC ontextClass;
38 private VrShellInterface mVrShell; 39 private VrShellInterface mVrShell;
40 private NonPresentingGvrContextInterface mNonPresentingGvrContext;
39 private boolean mInVr; 41 private boolean mInVr;
40 private int mRestoreSystemUiVisibilityFlag = -1; 42 private int mRestoreSystemUiVisibilityFlag = -1;
41 private String mVrExtra; 43 private String mVrExtra;
42 private long mNativeVrShellDelegate; 44 private long mNativeVrShellDelegate;
43 45
44 public VrShellDelegate(ChromeTabbedActivity activity) { 46 public VrShellDelegate(ChromeTabbedActivity activity) {
45 mActivity = activity; 47 mActivity = activity;
46 48
47 mVrShellClass = maybeFindVrShell(); 49 mVrEnabled = maybeFindVrClasses();
48 if (mVrShellClass != null) { 50 if (mVrEnabled) {
49 mVrShellEnabled = true;
50 try { 51 try {
51 mVrExtra = (String) mVrShellClass.getField("VR_EXTRA").get(null) ; 52 mVrExtra = (String) mVrShellClass.getField("VR_EXTRA").get(null) ;
52 } catch (IllegalAccessException | IllegalArgumentException | NoSuchF ieldException e) { 53 } catch (IllegalAccessException | IllegalArgumentException | NoSuchF ieldException e) {
53 Log.e(TAG, "Unable to read VR_EXTRA field", e); 54 Log.e(TAG, "Unable to read VR_EXTRA field", e);
54 mVrShellEnabled = false; 55 mVrEnabled = false;
55 } 56 }
56 } 57 }
57 } 58 }
58 59
59 /** 60 /**
60 * Should be called once the native library is loaded so that the native por tion of this 61 * Should be called once the native library is loaded so that the native por tion of this
61 * class can be initialized. 62 * class can be initialized.
62 */ 63 */
63 public void onNativeLibraryReady() { 64 public void onNativeLibraryReady() {
64 if (mVrShellEnabled) { 65 if (mVrEnabled) {
65 mNativeVrShellDelegate = nativeInit(); 66 mNativeVrShellDelegate = nativeInit();
66 } 67 }
67 } 68 }
68 69
69 @SuppressWarnings("unchecked") 70 @SuppressWarnings("unchecked")
70 private Class<? extends VrShellInterface> maybeFindVrShell() { 71 private boolean maybeFindVrClasses() {
71 try { 72 try {
72 return (Class<? extends VrShellInterface>) Class 73 mVrShellClass = (Class<? extends VrShellInterface>) Class.forName(
73 .forName("org.chromium.chrome.browser.vr_shell.VrShell"); 74 "org.chromium.chrome.browser.vr_shell.VrShell");
75 mNonPresentingGvrContextClass =
76 (Class<? extends NonPresentingGvrContextInterface>) Class.fo rName(
77 "org.chromium.chrome.browser.vr_shell.NonPresentingG vrContext");
78 return true;
74 } catch (ClassNotFoundException e) { 79 } catch (ClassNotFoundException e) {
75 return null; 80 mVrShellClass = null;
81 mNonPresentingGvrContextClass = null;
82 return false;
76 } 83 }
77 } 84 }
78 85
79 /** 86 /**
80 * Enters VR Shell, displaying browser UI and tab contents in VR. 87 * Enters VR Shell, displaying browser UI and tab contents in VR.
81 * 88 *
82 * This function performs native initialization, and so must only be called after native 89 * This function performs native initialization, and so must only be called after native
83 * libraries are ready. 90 * libraries are ready.
84 * @param inWebVR If true should begin displaying WebVR content rather than the VrShell UI. 91 * @param inWebVR If true should begin displaying WebVR content rather than the VrShell UI.
85 * @return Whether or not we are in VR when this function returns. 92 * @return Whether or not we are in VR when this function returns.
86 */ 93 */
87 @CalledByNative 94 @CalledByNative
88 public boolean enterVRIfNecessary(boolean inWebVR) { 95 public boolean enterVRIfNecessary(boolean inWebVR) {
89 if (!mVrShellEnabled || mNativeVrShellDelegate == 0) return false; 96 if (!mVrEnabled || mNativeVrShellDelegate == 0) return false;
90 Tab tab = mActivity.getActivityTab(); 97 Tab tab = mActivity.getActivityTab();
91 // TODO(mthiesse): When we have VR UI for opening new tabs, etc., allow VR Shell to be 98 // TODO(mthiesse): When we have VR UI for opening new tabs, etc., allow VR Shell to be
92 // entered without any current tabs. 99 // entered without any current tabs.
93 if (tab == null || tab.getContentViewCore() == null) { 100 if (tab == null || tab.getContentViewCore() == null) {
94 return false; 101 return false;
95 } 102 }
96 if (mInVr) return true; 103 if (mInVr) return true;
97 // VrShell must be initialized in Landscape mode due to a bug in the GVR library. 104 // VrShell must be initialized in Landscape mode due to a bug in the GVR library.
98 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSC APE); 105 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSC APE);
99 if (!createVrShell()) { 106 if (!createVrShell()) {
(...skipping 17 matching lines...) Expand all
117 // TODO(bajones): Once VR Shell can be invoked outside of WebVR this 124 // TODO(bajones): Once VR Shell can be invoked outside of WebVR this
118 // should no longer exit the shell outright. Need a way to determine 125 // should no longer exit the shell outright. Need a way to determine
119 // how VrShell was created. 126 // how VrShell was created.
120 shutdownVR(); 127 shutdownVR();
121 return true; 128 return true;
122 } 129 }
123 130
124 /** 131 /**
125 * Resumes VR Shell. 132 * Resumes VR Shell.
126 */ 133 */
127 public void resumeVR() { 134 public void resumeVR() {
mthiesse 2016/10/11 18:10:44 nit: Rename to maybeResumeVR() and maybePauseVR()
bshe 2016/10/12 19:02:17 Done.
128 setupVrModeWindowFlags(); 135 if (mNonPresentingGvrContext != null) {
mthiesse 2016/10/11 18:10:44 Is there a reason to have both a non-presenting GV
bshe 2016/10/12 19:02:17 I can't think of any reason. And we might want to
129 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites(); 136 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites ();
130 try { 137 try {
131 mVrShell.resume(); 138 mNonPresentingGvrContext.resume();
132 } catch (IllegalArgumentException e) { 139 } catch (IllegalArgumentException e) {
133 Log.e(TAG, "Unable to resume VrShell", e); 140 Log.e(TAG, "Unable to resume mNonPresentingGvrContext", e);
134 } finally { 141 } finally {
135 StrictMode.setThreadPolicy(oldPolicy); 142 StrictMode.setThreadPolicy(oldPolicy);
143 }
144 }
145
146 if (mInVr) {
147 setupVrModeWindowFlags();
148 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites ();
149 try {
150 mVrShell.resume();
151 } catch (IllegalArgumentException e) {
152 Log.e(TAG, "Unable to resume VrShell", e);
153 } finally {
154 StrictMode.setThreadPolicy(oldPolicy);
155 }
136 } 156 }
137 } 157 }
138 158
139 /** 159 /**
140 * Pauses VR Shell. 160 * Pauses VR Shell.
141 */ 161 */
142 public void pauseVR() { 162 public void pauseVR() {
143 mVrShell.pause(); 163 if (mNonPresentingGvrContext != null) {
164 mNonPresentingGvrContext.pause();
165 }
166 if (mInVr) {
167 mVrShell.pause();
168 }
144 } 169 }
145 170
146 /** 171 /**
147 * Exits the current VR mode (WebVR or VRShell) 172 * Exits the current VR mode (WebVR or VRShell)
148 * @return Whether or not we exited VR. 173 * @return Whether or not we exited VR.
149 */ 174 */
150 public boolean exitVRIfNecessary() { 175 public boolean exitVRIfNecessary() {
151 if (!mInVr) return false; 176 if (!mInVr) return false;
152 // If WebVR is presenting instruct it to exit. VR mode should not 177 // If WebVR is presenting instruct it to exit. VR mode should not
153 // exit in this scenario, in case we want to return to the VrShell. 178 // exit in this scenario, in case we want to return to the VrShell.
154 if (!nativeExitWebVRIfNecessary(mNativeVrShellDelegate)) { 179 if (!nativeExitWebVRIfNecessary(mNativeVrShellDelegate)) {
155 // If WebVR was not presenting, shutdown VR mode entirely. 180 // If WebVR was not presenting, shutdown VR mode entirely.
156 shutdownVR(); 181 shutdownVR();
157 } 182 }
158 183
159 return true; 184 return true;
160 } 185 }
161 186
187 @CalledByNative
188 private long createNonPresentingNativeContext() {
189 if (!mVrEnabled) return 0;
190
191 try {
192 Constructor<?> nonPresentingGvrContextConstructor =
193 mNonPresentingGvrContextClass.getConstructor(Activity.class) ;
194 mNonPresentingGvrContext =
195 (NonPresentingGvrContextInterface)
196 nonPresentingGvrContextConstructor.newInstance(mActi vity);
197 } catch (InstantiationException | IllegalAccessException | IllegalArgume ntException
198 | InvocationTargetException | NoSuchMethodException e) {
199 Log.e(TAG, "Unable to instantiate NonPresentingGvrContext", e);
200 return 0;
201 }
202 return mNonPresentingGvrContext.getNativeGvrContext();
203 }
204
205 @CalledByNative
206 private void shutdownNonPresentingNativeContext() {
207 mNonPresentingGvrContext.shutdown();
208 mNonPresentingGvrContext = null;
209 }
210
162 /** 211 /**
163 * Exits VR Shell, performing all necessary cleanup. 212 * Exits VR Shell, performing all necessary cleanup.
164 */ 213 */
165 private void shutdownVR() { 214 private void shutdownVR() {
166 if (!mInVr) return; 215 if (!mInVr) return;
167 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPEC IFIED); 216 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPEC IFIED);
168 mVrShell.setVrModeEnabled(false); 217 mVrShell.setVrModeEnabled(false);
169 mVrShell.pause(); 218 mVrShell.pause();
170 removeVrViews(); 219 removeVrViews();
171 clearVrModeWindowFlags(); 220 clearVrModeWindowFlags();
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 * Whether or not we are currently in VR. 298 * Whether or not we are currently in VR.
250 */ 299 */
251 public boolean isInVR() { 300 public boolean isInVR() {
252 return mInVr; 301 return mInVr;
253 } 302 }
254 303
255 /** 304 /**
256 * @return Whether or not VR Shell is currently enabled. 305 * @return Whether or not VR Shell is currently enabled.
257 */ 306 */
258 public boolean isVrShellEnabled() { 307 public boolean isVrShellEnabled() {
259 return mVrShellEnabled; 308 return mVrEnabled;
260 } 309 }
261 310
262 /** 311 /**
263 * @return Pointer to the native VrShellDelegate object. 312 * @return Pointer to the native VrShellDelegate object.
264 */ 313 */
265 @CalledByNative 314 @CalledByNative
266 private long getNativePointer() { 315 private long getNativePointer() {
267 return mNativeVrShellDelegate; 316 return mNativeVrShellDelegate;
268 } 317 }
269 318
270 private native long nativeInit(); 319 private native long nativeInit();
271 private native boolean nativeExitWebVRIfNecessary(long nativeVrShellDelegate ); 320 private native boolean nativeExitWebVRIfNecessary(long nativeVrShellDelegate );
272 } 321 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698