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.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
8 import android.graphics.Canvas; | 8 import android.graphics.Canvas; |
9 import android.graphics.Point; | 9 import android.graphics.Point; |
10 import android.os.StrictMode; | 10 import android.os.StrictMode; |
(...skipping 11 matching lines...) Expand all Loading... |
22 | 22 |
23 import org.chromium.base.CommandLine; | 23 import org.chromium.base.CommandLine; |
24 import org.chromium.base.ThreadUtils; | 24 import org.chromium.base.ThreadUtils; |
25 import org.chromium.base.VisibleForTesting; | 25 import org.chromium.base.VisibleForTesting; |
26 import org.chromium.base.annotations.CalledByNative; | 26 import org.chromium.base.annotations.CalledByNative; |
27 import org.chromium.base.annotations.JNINamespace; | 27 import org.chromium.base.annotations.JNINamespace; |
28 import org.chromium.chrome.browser.ChromeActivity; | 28 import org.chromium.chrome.browser.ChromeActivity; |
29 import org.chromium.chrome.browser.ChromeSwitches; | 29 import org.chromium.chrome.browser.ChromeSwitches; |
30 import org.chromium.chrome.browser.NativePage; | 30 import org.chromium.chrome.browser.NativePage; |
31 import org.chromium.chrome.browser.UrlConstants; | 31 import org.chromium.chrome.browser.UrlConstants; |
| 32 import org.chromium.chrome.browser.ntp.NewTabPage; |
32 import org.chromium.chrome.browser.tab.EmptyTabObserver; | 33 import org.chromium.chrome.browser.tab.EmptyTabObserver; |
33 import org.chromium.chrome.browser.tab.Tab; | 34 import org.chromium.chrome.browser.tab.Tab; |
34 import org.chromium.chrome.browser.tab.TabObserver; | 35 import org.chromium.chrome.browser.tab.TabObserver; |
35 import org.chromium.chrome.browser.tab.TabRedirectHandler; | 36 import org.chromium.chrome.browser.tab.TabRedirectHandler; |
36 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; | 37 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; |
37 import org.chromium.chrome.browser.tabmodel.TabModel; | 38 import org.chromium.chrome.browser.tabmodel.TabModel; |
38 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; | 39 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; |
39 import org.chromium.chrome.browser.tabmodel.TabModelSelector; | 40 import org.chromium.chrome.browser.tabmodel.TabModelSelector; |
40 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; | 41 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; |
41 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; | 42 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 // Restore proper focus on the old CVC. | 158 // Restore proper focus on the old CVC. |
158 if (mContentViewCore != null) mContentViewCore.onWindowFocusChan
ged(false); | 159 if (mContentViewCore != null) mContentViewCore.onWindowFocusChan
ged(false); |
159 mContentViewCore = null; | 160 mContentViewCore = null; |
160 if (mNativeVrShell == 0) return; | 161 if (mNativeVrShell == 0) return; |
161 if (tab.isShowingSadTab()) { | 162 if (tab.isShowingSadTab()) { |
162 // For now we don't support the sad tab page. crbug.com/6616
09. | 163 // For now we don't support the sad tab page. crbug.com/6616
09. |
163 forceExitVr(); | 164 forceExitVr(); |
164 return; | 165 return; |
165 } | 166 } |
166 if (mNativePage != null) { | 167 if (mNativePage != null) { |
167 UiUtils.removeViewFromParent(mNativePage.getView()); | 168 restoreNativePageFromVR(); |
168 mNativePage = null; | 169 mNativePage = null; |
169 mMotionEventSynthesizer = null; | |
170 if (tab.getNativePage() == null) { | 170 if (tab.getNativePage() == null) { |
171 nativeRestoreContentSurface(mNativeVrShell); | 171 nativeRestoreContentSurface(mNativeVrShell); |
172 mRenderToSurfaceLayoutParent.setVisibility(View.INVISIBL
E); | 172 mRenderToSurfaceLayoutParent.setVisibility(View.INVISIBL
E); |
173 mSurface = null; | 173 mSurface = null; |
174 } | 174 } |
175 } | 175 } |
176 if (tab.getNativePage() != null) { | 176 if (tab.getNativePage() != null) { |
177 mRenderToSurfaceLayoutParent.setVisibility(View.VISIBLE); | 177 mRenderToSurfaceLayoutParent.setVisibility(View.VISIBLE); |
178 mNativePage = tab.getNativePage(); | 178 mNativePage = tab.getNativePage(); |
| 179 initializeNativePageForVR(); |
179 if (mSurface == null) mSurface = nativeTakeContentSurface(mN
ativeVrShell); | 180 if (mSurface == null) mSurface = nativeTakeContentSurface(mN
ativeVrShell); |
180 mRenderToSurfaceLayout.addView(mNativePage.getView(), | |
181 new FrameLayout.LayoutParams( | |
182 LayoutParams.MATCH_PARENT, LayoutParams.MATC
H_PARENT)); | |
183 mNativePage.getView().invalidate(); | |
184 mMotionEventSynthesizer = | |
185 new MotionEventSynthesizer(mRenderToSurfaceLayout, V
rShellImpl.this); | |
186 } | 181 } |
187 setContentCssSize(mLastContentWidth, mLastContentHeight, mLastCo
ntentDpr); | 182 setContentCssSize(mLastContentWidth, mLastContentHeight, mLastCo
ntentDpr); |
188 if (tab.getNativePage() == null && tab.getContentViewCore() != n
ull) { | 183 if (tab.getNativePage() == null && tab.getContentViewCore() != n
ull) { |
189 mContentViewCore = tab.getContentViewCore(); | 184 mContentViewCore = tab.getContentViewCore(); |
190 mContentViewCore.onAttachedToWindow(); | 185 mContentViewCore.onAttachedToWindow(); |
191 mContentViewCore.getContainerView().requestFocus(); | 186 mContentViewCore.getContainerView().requestFocus(); |
192 // We need the CVC to think it has Window Focus so it doesn'
t blur the page, | 187 // We need the CVC to think it has Window Focus so it doesn'
t blur the page, |
193 // even though we're drawing VR layouts over top of it. | 188 // even though we're drawing VR layouts over top of it. |
194 mContentViewCore.onWindowFocusChanged(true); | 189 mContentViewCore.onWindowFocusChanged(true); |
195 nativeSwapContents(mNativeVrShell, mContentViewCore.getWebCo
ntents(), null); | 190 nativeSwapContents(mNativeVrShell, mContentViewCore.getWebCo
ntents(), null); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 public boolean onPreDraw() { | 262 public boolean onPreDraw() { |
268 if (mRenderToSurfaceLayout.isDirty()) { | 263 if (mRenderToSurfaceLayout.isDirty()) { |
269 mRenderToSurfaceLayout.invalidate(); | 264 mRenderToSurfaceLayout.invalidate(); |
270 if (mNativePage != null) mNativePage.getView().invalidate(); | 265 if (mNativePage != null) mNativePage.getView().invalidate(); |
271 } | 266 } |
272 return true; | 267 return true; |
273 } | 268 } |
274 }); | 269 }); |
275 mRenderToSurfaceLayoutParent.addView(mRenderToSurfaceLayout); | 270 mRenderToSurfaceLayoutParent.addView(mRenderToSurfaceLayout); |
276 addView(mRenderToSurfaceLayoutParent); | 271 addView(mRenderToSurfaceLayoutParent); |
| 272 mMotionEventSynthesizer = |
| 273 new MotionEventSynthesizer(mRenderToSurfaceLayout, VrShellImpl.t
his); |
277 } | 274 } |
278 | 275 |
279 @Override | 276 @Override |
280 public void initializeNative(Tab currentTab, boolean forWebVr, boolean inCct
) { | 277 public void initializeNative(Tab currentTab, boolean forWebVr, boolean inCct
) { |
281 mContentVrWindowAndroid = new VrWindowAndroid(mActivity, mContentVirtual
Display); | 278 mContentVrWindowAndroid = new VrWindowAndroid(mActivity, mContentVirtual
Display); |
282 mNativeVrShell = nativeInit(mDelegate, mContentVrWindowAndroid.getNative
Pointer(), forWebVr, | 279 mNativeVrShell = nativeInit(mDelegate, mContentVrWindowAndroid.getNative
Pointer(), forWebVr, |
283 inCct, getGvrApi().getNativeGvrContext(), mReprojectedRendering)
; | 280 inCct, getGvrApi().getNativeGvrContext(), mReprojectedRendering)
; |
284 | 281 |
285 // Set the UI and content sizes before we load the UI. | 282 // Set the UI and content sizes before we load the UI. |
286 if (forWebVr) { | 283 if (forWebVr) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 mTab.setTabRedirectHandler(mTabRedirectHandler); | 342 mTab.setTabRedirectHandler(mTabRedirectHandler); |
346 } | 343 } |
347 | 344 |
348 private void restoreTabFromVR() { | 345 private void restoreTabFromVR() { |
349 mTab.setTabRedirectHandler(mNonVrTabRedirectHandler); | 346 mTab.setTabRedirectHandler(mNonVrTabRedirectHandler); |
350 mTab.updateWindowAndroid(mOriginalWindowAndroid); | 347 mTab.updateWindowAndroid(mOriginalWindowAndroid); |
351 mOriginalWindowAndroid = null; | 348 mOriginalWindowAndroid = null; |
352 mNonVrTabRedirectHandler = null; | 349 mNonVrTabRedirectHandler = null; |
353 } | 350 } |
354 | 351 |
| 352 private void initializeNativePageForVR() { |
| 353 if (mNativePage instanceof NewTabPage) { |
| 354 ((NewTabPage) mNativePage).setUrlBarInputEnabled(false); |
| 355 } |
| 356 mRenderToSurfaceLayout.addView(mNativePage.getView(), |
| 357 new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutPa
rams.MATCH_PARENT)); |
| 358 mNativePage.getView().invalidate(); |
| 359 mRenderToSurfaceLayout.invalidate(); |
| 360 } |
| 361 |
| 362 private void restoreNativePageFromVR() { |
| 363 if (mNativePage instanceof NewTabPage) { |
| 364 ((NewTabPage) mNativePage).setUrlBarInputEnabled(true); |
| 365 } |
| 366 UiUtils.removeViewFromParent(mNativePage.getView()); |
| 367 } |
| 368 |
355 // Exits VR, telling the user to remove their headset, and returning to Chro
mium. | 369 // Exits VR, telling the user to remove their headset, and returning to Chro
mium. |
356 @CalledByNative | 370 @CalledByNative |
357 public void forceExitVr() { | 371 public void forceExitVr() { |
358 mDelegate.shutdownVr(false /* isPausing */, true /* showTransition */); | 372 mDelegate.shutdownVr(false /* isPausing */, true /* showTransition */); |
359 } | 373 } |
360 | 374 |
361 @CalledByNative | 375 @CalledByNative |
362 public void setContentCssSize(float width, float height, float dpr) { | 376 public void setContentCssSize(float width, float height, float dpr) { |
363 ThreadUtils.assertOnUiThread(); | 377 ThreadUtils.assertOnUiThread(); |
364 mLastContentWidth = width; | 378 mLastContentWidth = width; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 nativeOnPause(mNativeVrShell); | 461 nativeOnPause(mNativeVrShell); |
448 } | 462 } |
449 } | 463 } |
450 | 464 |
451 @Override | 465 @Override |
452 public void shutdown() { | 466 public void shutdown() { |
453 if (mNativeVrShell != 0) { | 467 if (mNativeVrShell != 0) { |
454 nativeDestroy(mNativeVrShell); | 468 nativeDestroy(mNativeVrShell); |
455 mNativeVrShell = 0; | 469 mNativeVrShell = 0; |
456 } | 470 } |
457 if (mNativePage != null) UiUtils.removeViewFromParent(mNativePage.getVie
w()); | 471 if (mNativePage != null) restoreNativePageFromVR(); |
458 mTabModelSelector.removeObserver(mTabModelSelectorObserver); | 472 mTabModelSelector.removeObserver(mTabModelSelectorObserver); |
459 mTabModelSelectorTabObserver.destroy(); | 473 mTabModelSelectorTabObserver.destroy(); |
460 mTab.removeObserver(mTabObserver); | 474 mTab.removeObserver(mTabObserver); |
461 restoreTabFromVR(); | 475 restoreTabFromVR(); |
462 mContentVirtualDisplay.destroy(); | 476 mContentVirtualDisplay.destroy(); |
463 super.shutdown(); | 477 super.shutdown(); |
464 } | 478 } |
465 | 479 |
466 @Override | 480 @Override |
467 public void pause() { | 481 public void pause() { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 private native void nativeOnTabListCreated(long nativeVrShell, Tab[] mainTab
s, | 642 private native void nativeOnTabListCreated(long nativeVrShell, Tab[] mainTab
s, |
629 Tab[] incognitoTabs); | 643 Tab[] incognitoTabs); |
630 private native void nativeOnTabUpdated(long nativeVrShell, boolean incognito
, int id, | 644 private native void nativeOnTabUpdated(long nativeVrShell, boolean incognito
, int id, |
631 String title); | 645 String title); |
632 private native void nativeOnTabRemoved(long nativeVrShell, boolean incognito
, int id); | 646 private native void nativeOnTabRemoved(long nativeVrShell, boolean incognito
, int id); |
633 private native Surface nativeTakeContentSurface(long nativeVrShell); | 647 private native Surface nativeTakeContentSurface(long nativeVrShell); |
634 private native void nativeRestoreContentSurface(long nativeVrShell); | 648 private native void nativeRestoreContentSurface(long nativeVrShell); |
635 private native void nativeSetHistoryButtonsEnabled( | 649 private native void nativeSetHistoryButtonsEnabled( |
636 long nativeVrShell, boolean canGoBack, boolean canGoForward); | 650 long nativeVrShell, boolean canGoBack, boolean canGoForward); |
637 } | 651 } |
OLD | NEW |