OLD | NEW |
---|---|
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; |
11 import android.view.View; | 11 import android.view.View; |
12 import android.view.ViewGroup; | 12 import android.view.ViewGroup; |
13 import android.view.ViewGroup.LayoutParams; | 13 import android.view.ViewGroup.LayoutParams; |
14 import android.view.WindowManager; | 14 import android.view.WindowManager; |
15 | 15 |
16 import org.chromium.base.Log; | 16 import org.chromium.base.Log; |
17 import org.chromium.base.annotations.CalledByNative; | |
18 import org.chromium.base.annotations.JNINamespace; | |
17 import org.chromium.chrome.browser.ChromeTabbedActivity; | 19 import org.chromium.chrome.browser.ChromeTabbedActivity; |
18 | 20 |
19 import java.lang.reflect.Constructor; | 21 import java.lang.reflect.Constructor; |
20 import java.lang.reflect.InvocationTargetException; | 22 import java.lang.reflect.InvocationTargetException; |
21 | 23 |
22 /** | 24 /** |
23 * Manages interactions with the VR Shell. | 25 * Manages interactions with the VR Shell. |
24 */ | 26 */ |
27 @JNINamespace("vr_shell") | |
25 public class VrShellDelegate { | 28 public class VrShellDelegate { |
26 private static final String TAG = "VrShellDelegate"; | 29 private static final String TAG = "VrShellDelegate"; |
27 | 30 |
28 private ChromeTabbedActivity mActivity; | 31 private ChromeTabbedActivity mActivity; |
29 | 32 |
30 private boolean mVrShellEnabled; | 33 private boolean mVrShellEnabled; |
31 | 34 |
32 private Class<? extends VrShellInterface> mVrShellClass; | 35 private Class<? extends VrShellInterface> mVrShellClass; |
33 private VrShellInterface mVrShellView; | 36 private VrShellInterface mVrShellView; |
34 private boolean mInVr; | 37 private boolean mInVr; |
35 private int mRestoreSystemUiVisibilityFlag = -1; | 38 private int mRestoreSystemUiVisibilityFlag = -1; |
36 private ViewGroup mParentView; | 39 private ViewGroup mParentView; |
37 private String mVrExtra; | 40 private String mVrExtra; |
41 private long mNativeVrShellDelegate; | |
38 | 42 |
39 public VrShellDelegate(ChromeTabbedActivity activity, ViewGroup parentView) { | 43 public VrShellDelegate(ChromeTabbedActivity activity, ViewGroup parentView) { |
40 mActivity = activity; | 44 mActivity = activity; |
41 mParentView = parentView; | 45 mParentView = parentView; |
42 | 46 |
43 mVrShellClass = maybeFindVrShell(); | 47 mVrShellClass = maybeFindVrShell(); |
44 if (mVrShellClass != null) { | 48 if (mVrShellClass != null) { |
45 mVrShellEnabled = true; | 49 mVrShellEnabled = true; |
46 try { | 50 try { |
47 mVrExtra = (String) mVrShellClass.getField("VR_EXTRA").get(null) ; | 51 mVrExtra = (String) mVrShellClass.getField("VR_EXTRA").get(null) ; |
48 } catch (IllegalAccessException | IllegalArgumentException | NoSuchF ieldException e) { | 52 } catch (IllegalAccessException | IllegalArgumentException | NoSuchF ieldException e) { |
49 Log.e(TAG, "Unable to read VR_EXTRA field", e); | 53 Log.e(TAG, "Unable to read VR_EXTRA field", e); |
50 mVrShellEnabled = false; | 54 mVrShellEnabled = false; |
51 } | 55 } |
52 } | 56 } |
53 } | 57 } |
54 | 58 |
59 public void onNativeLibraryReady() { | |
Ted C
2016/09/20 20:31:11
all public methods should have some sort of docume
| |
60 mNativeVrShellDelegate = nativeInit(); | |
61 } | |
62 | |
55 @SuppressWarnings("unchecked") | 63 @SuppressWarnings("unchecked") |
56 private Class<? extends VrShellInterface> maybeFindVrShell() { | 64 private Class<? extends VrShellInterface> maybeFindVrShell() { |
57 try { | 65 try { |
58 return (Class<? extends VrShellInterface>) Class | 66 return (Class<? extends VrShellInterface>) Class |
59 .forName("org.chromium.chrome.browser.vr_shell.VrShell"); | 67 .forName("org.chromium.chrome.browser.vr_shell.VrShell"); |
60 } catch (ClassNotFoundException e) { | 68 } catch (ClassNotFoundException e) { |
61 return null; | 69 return null; |
62 } | 70 } |
63 } | 71 } |
64 | 72 |
65 /** | 73 /** |
66 * Enters VR Shell, displaying browser UI and tab contents in VR. | 74 * Enters VR Shell, displaying browser UI and tab contents in VR. |
67 * | 75 * |
68 * This function performs native initialization, and so must only be called after native | 76 * This function performs native initialization, and so must only be called after native |
69 * libraries are ready. | 77 * libraries are ready. |
70 * @Returns Whether or not we are in VR when this function returns. | 78 * @Returns Whether or not we are in VR when this function returns. |
71 */ | 79 */ |
72 public boolean enterVRIfNecessary() { | 80 public boolean enterVRIfNecessary() { |
Ted C
2016/09/20 20:31:11
could this just take a boolean param isWebVR? sam
| |
73 if (!mVrShellEnabled) return false; | 81 if (!mVrShellEnabled || mNativeVrShellDelegate == 0) return false; |
74 if (mInVr) return true; | 82 if (mInVr) return true; |
75 // VrShell must be initialized in Landscape mode due to a bug in the GVR library. | 83 // VrShell must be initialized in Landscape mode due to a bug in the GVR library. |
76 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSC APE); | 84 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSC APE); |
77 if (!createVrShell()) { | 85 if (!createVrShell()) { |
78 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UN SPECIFIED); | 86 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UN SPECIFIED); |
79 return false; | 87 return false; |
80 } | 88 } |
81 addVrViews(); | 89 addVrViews(); |
82 setupVrModeWindowFlags(); | 90 setupVrModeWindowFlags(); |
83 mVrShellView.onNativeLibraryReady(); | 91 mVrShellView.onNativeLibraryReady(mNativeVrShellDelegate); |
84 mVrShellView.setVrModeEnabled(true); | 92 mVrShellView.setVrModeEnabled(true); |
85 mInVr = true; | 93 mInVr = true; |
86 return true; | 94 return true; |
87 } | 95 } |
88 | 96 |
97 @CalledByNative | |
98 public boolean enterWebVRIfNecessary() { | |
99 if (enterVRIfNecessary()) { | |
100 mVrShellView.setWebVrModeEnabled(true); | |
101 return true; | |
102 } | |
103 return false; | |
104 } | |
105 | |
106 @CalledByNative | |
107 public boolean exitWebVRIfNecessary() { | |
108 if (!mInVr) return false; | |
109 mVrShellView.setWebVrModeEnabled(false); | |
110 // TODO(bajones): Once VR Shell can be invoked outside of WebVR this | |
111 // should no longer exit the shell outright. Need a way to determine | |
112 // how VrShell was created. | |
113 return exitVRIfNecessary(); | |
114 } | |
115 | |
89 /** | 116 /** |
90 * Resumes VR Shell. | 117 * Resumes VR Shell. |
91 */ | 118 */ |
92 public void resumeVR() { | 119 public void resumeVR() { |
93 setupVrModeWindowFlags(); | 120 setupVrModeWindowFlags(); |
94 mVrShellView.resume(); | 121 mVrShellView.resume(); |
95 } | 122 } |
96 | 123 |
97 /** | 124 /** |
98 * Pauses VR Shell. | 125 * Pauses VR Shell. |
99 */ | 126 */ |
100 public void pauseVR() { | 127 public void pauseVR() { |
101 mVrShellView.pause(); | 128 mVrShellView.pause(); |
102 } | 129 } |
103 | 130 |
104 /** | 131 /** |
105 * Exits VR Shell, performing all necessary cleanup. | 132 * Exits VR Shell, performing all necessary cleanup. |
106 * @Returns Whether or not we exited VR. | 133 * @Returns Whether or not we exited VR. |
107 */ | 134 */ |
108 public boolean exitVRIfNecessary() { | 135 public boolean exitVRIfNecessary() { |
109 if (!mInVr) return false; | 136 if (!mInVr) return false; |
137 if (nativeExitVRIfNecessary(mNativeVrShellDelegate)) { | |
138 // In this scenario we need to wait for WebVR to shut down before | |
139 // removing the VrShell. exitVRIfNecessary will be called again (by | |
140 // exitWebVRIfNecessary) when it's safe to destroy the VrShell. | |
Ted C
2016/09/20 20:31:11
that is an odd semantics. should we pull out a di
| |
141 return true; | |
142 } | |
110 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPEC IFIED); | 143 mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPEC IFIED); |
111 mVrShellView.setVrModeEnabled(false); | 144 mVrShellView.setVrModeEnabled(false); |
112 mVrShellView.pause(); | 145 mVrShellView.pause(); |
113 removeVrViews(); | 146 removeVrViews(); |
114 clearVrModeWindowFlags(); | 147 clearVrModeWindowFlags(); |
115 destroyVrShell(); | 148 destroyVrShell(); |
116 mInVr = false; | 149 mInVr = false; |
117 return true; | 150 return true; |
118 } | 151 } |
119 | 152 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
188 public boolean isInVR() { | 221 public boolean isInVR() { |
189 return mInVr; | 222 return mInVr; |
190 } | 223 } |
191 | 224 |
192 /** | 225 /** |
193 * @return Whether or not VR Shell is currently enabled. | 226 * @return Whether or not VR Shell is currently enabled. |
194 */ | 227 */ |
195 public boolean isVrShellEnabled() { | 228 public boolean isVrShellEnabled() { |
196 return mVrShellEnabled; | 229 return mVrShellEnabled; |
197 } | 230 } |
231 | |
232 private native long nativeInit(); | |
233 | |
234 private native boolean nativeExitVRIfNecessary(long nativeVrShellDelegate); | |
198 } | 235 } |
OLD | NEW |