From ef34ee36334912ed445b727df365ceed0fb4de52 Mon Sep 17 00:00:00 2001 From: haanhvu Date: Sat, 8 Feb 2025 18:03:20 +0700 Subject: [PATCH] Revert "Introduce OverlayWidget & Use it by PaymentHandler" This reverts commit e04e5a26ab6e150c63cc099ea504396a8aab7e2c. --- .../wolvic/browser/api/impl/SessionImpl.java | 25 +- .../wolvic/browser/api/impl/TabImpl.java | 29 +-- .../api/impl/TabWebContentsObserver.java | 64 +---- .../browser/api/impl/TextInputImpl.java | 4 +- .../com/igalia/wolvic/VRBrowserActivity.java | 3 - .../igalia/wolvic/browser/api/WSession.java | 23 -- .../igalia/wolvic/browser/engine/Session.java | 14 -- .../ui/widgets/OverlayContentWidget.java | 228 ------------------ .../wolvic/ui/widgets/WindowWidget.java | 22 -- 9 files changed, 10 insertions(+), 402 deletions(-) delete mode 100644 app/src/common/shared/com/igalia/wolvic/ui/widgets/OverlayContentWidget.java diff --git a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/SessionImpl.java b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/SessionImpl.java index 55434d19e6..f27890bda6 100644 --- a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/SessionImpl.java +++ b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/SessionImpl.java @@ -25,7 +25,6 @@ import org.chromium.wolvic.DownloadManagerBridge; import org.chromium.wolvic.PasswordForm; import org.chromium.wolvic.PermissionManagerBridge; -import org.chromium.wolvic.TabCompositorView; import org.chromium.wolvic.UserDialogManagerBridge; import java.io.InputStream; @@ -115,8 +114,8 @@ public void setActive(boolean active) { if (mTab == null) return; - assert mTab.getActiveWebContents() != null; - WebContents webContents = mTab.getActiveWebContents(); + assert mTab.getContentView() != null; + WebContents webContents = mTab.getContentView().getWebContents(); if (active) { webContents.onShow(); } else { @@ -130,8 +129,8 @@ public void setActive(boolean active) { public void setFocused(boolean focused) { if (mTab == null) return; - assert mTab.getActiveWebContents() != null; - mTab.getActiveWebContents().setFocus(focused); + assert mTab.getContentView() != null; + mTab.getContentView().getWebContents().setFocus(focused); } @Override @@ -216,20 +215,6 @@ public void releaseDisplay(@NonNull WDisplay display) { getTextInput().setView(null); } - public WDisplay acquireOverlayDisplay(TabCompositorView compositorView) { - SettingsStore settings = SettingsStore.getInstance(mRuntime.getContext()); - WDisplay display = new DisplayImpl(this, compositorView); - mRuntime.getContainerView().addView(compositorView, - new ViewGroup.LayoutParams(settings.getWindowWidth() / 2, settings.getWindowHeight() / 2)); - getTextInput().setView(getContentView()); - return display; - } - - public void releaseOverlayDisplay(TabCompositorView compositorView) { - mRuntime.getContainerView().removeView(compositorView); - getTextInput().setView(null); - } - @Override public void restoreState(@NonNull WSessionState state) { @@ -472,7 +457,7 @@ public TabImpl getTab() { } public ViewGroup getContentView() { - return mTab != null ? mTab.getActiveContentView() : null; + return mTab != null ? mTab.getContentView() : null; } // The onReadyCallback() mechanism is really limited because it heavily depends on renderers diff --git a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabImpl.java b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabImpl.java index c116ac7a1d..b5f2fe8f34 100644 --- a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabImpl.java +++ b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabImpl.java @@ -4,25 +4,18 @@ import androidx.annotation.NonNull; -import org.chromium.components.embedder_support.view.ContentView; import org.chromium.content_public.browser.MediaSessionObserver; import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.WebContents; import org.chromium.wolvic.Tab; -import org.chromium.wolvic.TabCompositorView; /** - * Controls a single tab content in a browser for chromium backend. + * Controlls a single tab content in a browser for chromium backend. */ public class TabImpl extends Tab { private TabMediaSessionObserver mTabMediaSessionObserver; private TabWebContentsDelegate mTabWebContentsDelegate; private TabWebContentsObserver mWebContentsObserver; - private WebContents mPaymentHandlerWebContents; - // TODO: Need to Payment's mediator - private ContentView mPaymentHandlerContentView; - private TabCompositorView mPaymentHandlerCompositorView; - public TabImpl(@NonNull Context context, @NonNull SessionImpl session, WebContents webContents) { super(context, session.getSettings().getUsePrivateMode(), webContents); @@ -34,7 +27,7 @@ private void registerCallbacks(@NonNull SessionImpl session) { mTabWebContentsDelegate = new TabWebContentsDelegate(session, mWebContents); setWebContentsDelegate(mWebContents, mTabWebContentsDelegate); - mWebContentsObserver = new TabWebContentsObserver(this, session); + mWebContentsObserver = new TabWebContentsObserver(mWebContents, session); SelectionPopupController controller = SelectionPopupController.fromWebContents(mWebContents); @@ -54,22 +47,4 @@ public void onMediaFullscreen(boolean isFullscreen) { public void purgeHistory() { mWebContents.getNavigationController().clearHistory(); } - - public void setPaymentWebContents(WebContents webContents, ContentView contentView, TabCompositorView compositorView) { - mPaymentHandlerWebContents = webContents; - mPaymentHandlerContentView = contentView; - mPaymentHandlerCompositorView = compositorView; - } - - public WebContents getActiveWebContents() { - return mPaymentHandlerWebContents != null ? mPaymentHandlerWebContents : mWebContents; - } - - public ContentView getActiveContentView() { - return mPaymentHandlerContentView != null ? mPaymentHandlerContentView : getContentView(); - } - - public TabCompositorView getActiveCompositorView() { - return mPaymentHandlerCompositorView != null ? mPaymentHandlerCompositorView : getCompositorView(); - } } diff --git a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabWebContentsObserver.java b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabWebContentsObserver.java index 721fd4098d..ce77dc15af 100644 --- a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabWebContentsObserver.java +++ b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TabWebContentsObserver.java @@ -1,39 +1,24 @@ package com.igalia.wolvic.browser.api.impl; -import android.content.Context; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.igalia.wolvic.browser.api.WDisplay; import com.igalia.wolvic.browser.api.WSession; import com.igalia.wolvic.browser.api.WWebRequestError; -import org.chromium.base.ContextUtils; -import org.chromium.components.embedder_support.view.ContentView; import org.chromium.content_public.browser.LifecycleState; -import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; -import org.chromium.ui.base.ActivityWindowAndroid; -import org.chromium.ui.base.IntentRequestTracker; -import org.chromium.ui.base.ViewAndroidDelegate; -import org.chromium.ui.base.WindowAndroid; import org.chromium.url.GURL; -import org.chromium.wolvic.TabCompositorView; -import org.chromium.wolvic.WolvicWebContentsFactory; import java.security.cert.X509Certificate; public class TabWebContentsObserver extends WebContentsObserver { private @NonNull SessionImpl mSession; - private @NonNull TabImpl mTab; - private WebContentsObserver mPaymentWebContentsObserver; - public TabWebContentsObserver(TabImpl tab, @NonNull SessionImpl session) { - super(tab.getActiveWebContents()); - mTab = tab; + public TabWebContentsObserver(WebContents webContents, @NonNull SessionImpl session) { + super(webContents); mSession = session; } @@ -121,51 +106,6 @@ public void didStopLoading(GURL url, boolean isKnownValid) { dispatchCanGoBackOrForward(); } - @Override - public void onCreateNewPaymentHandler(final WebContents newWebContents) { - WSession.ContentDelegate contentDelegate = mSession.getContentDelegate(); - if (contentDelegate == null) { - return; - } - - assert newWebContents.getViewAndroidDelegate() != null - : "WebContents should be initialized."; - WindowAndroid windowAndroid = newWebContents.getTopLevelNativeWindow(); - Context context = mWebContents.get().getTopLevelNativeWindow().getContext().get(); - final TabCompositorView compositorView = new TabCompositorView(context); - compositorView.onNativeLibraryLoaded(windowAndroid); - windowAndroid.setAnimationPlaceholderView(compositorView); - - ViewAndroidDelegate viewDelegate = newWebContents.getViewAndroidDelegate(); - assert viewDelegate.getContainerView() instanceof ContentView - : "WebContents should not set container views other than ContentView."; - - mTab.setPaymentWebContents(newWebContents, (ContentView) viewDelegate.getContainerView(), compositorView); - - WDisplay display = mSession.acquireOverlayDisplay(compositorView); - contentDelegate.onShowPaymentHandler(mSession, display, () -> { - if (newWebContents.isDestroyed()) { - return; - } - mTab.setPaymentWebContents(null, null, null); - newWebContents.destroy(); - }); - - // Show Compositor View after attaching to the parent view. - compositorView.setCurrentWebContents(newWebContents); - - mPaymentWebContentsObserver = new WebContentsObserver(newWebContents) { - @Override - public void destroy() { - mSession.releaseOverlayDisplay(compositorView); - mTab.setPaymentWebContents(null, null, null); - - contentDelegate.onHidePaymentHandler(mSession); - newWebContents.removeObserver(this); - } - }; - } - @Override public void didFailLoad(boolean isInPrimaryMainFrame, int errorCode, GURL failingUrl, @LifecycleState int rfhLifecycleState) { @Nullable WSession.ProgressDelegate delegate = mSession.getProgressDelegate(); diff --git a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TextInputImpl.java b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TextInputImpl.java index f6470aa11c..66ff7bedff 100644 --- a/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TextInputImpl.java +++ b/app/src/common/chromium/com/igalia/wolvic/browser/api/impl/TextInputImpl.java @@ -19,7 +19,6 @@ import org.chromium.content_public.browser.ImeAdapter; import org.chromium.content_public.browser.InputMethodManagerWrapper; -import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; public class TextInputImpl implements WTextInput { @@ -181,7 +180,6 @@ public WSession.TextInputDelegate getDelegate() { } private ImeAdapter getImeAdapter() { - WebContents webContents = mSession.getTab() != null ? mSession.getTab().getActiveWebContents() : null; - return webContents != null ? ImeAdapter.fromWebContents(webContents) : null; + return mSession.getTab() != null ? mSession.getTab().getImeAdapter() : null; } } diff --git a/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java b/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java index 9bfc20c8f6..2829f3a763 100644 --- a/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java +++ b/app/src/common/shared/com/igalia/wolvic/VRBrowserActivity.java @@ -73,7 +73,6 @@ import com.igalia.wolvic.ui.widgets.HorizontalTabsBar; import com.igalia.wolvic.ui.widgets.KeyboardWidget; import com.igalia.wolvic.ui.widgets.NavigationBarWidget; -import com.igalia.wolvic.ui.widgets.OverlayContentWidget; import com.igalia.wolvic.ui.widgets.RootWidget; import com.igalia.wolvic.ui.widgets.TrayWidget; import com.igalia.wolvic.ui.widgets.UISurfaceTextureRenderer; @@ -1153,8 +1152,6 @@ void handleMotionEvent(final int aHandle, final int aDevice, final boolean aFocu if (!windowWidget.isNativeContentVisible()) { scale = 1.0f; } - } else if (widget instanceof OverlayContentWidget) { - scale = 1.0f; } final float x = aX / scale; final float y = aY / scale; diff --git a/app/src/common/shared/com/igalia/wolvic/browser/api/WSession.java b/app/src/common/shared/com/igalia/wolvic/browser/api/WSession.java index 3b0c704fbb..021355b5b3 100644 --- a/app/src/common/shared/com/igalia/wolvic/browser/api/WSession.java +++ b/app/src/common/shared/com/igalia/wolvic/browser/api/WSession.java @@ -317,29 +317,6 @@ WResult onSlowScript( */ @UiThread default void onShowDynamicToolbar(@NonNull final WSession aSession) {} - - public interface OnPaymentHandlerCallback { - void onDismiss(); - } - - /** - * The view should display its payment handler, overlayed on the active tab. - * - * @param aSession ISession that initiated the callback. - * @param aDisplay IDisplay that initiated the callback. - * @param callback Callback interface. - */ - @UiThread - default void onShowPaymentHandler(@NonNull final WSession aSession, - @NonNull final WDisplay aDisplay, - @NonNull final OnPaymentHandlerCallback callback) {} - /** - * The view should hide its payment handler. - * - * @param aSession ISession that initiated the callback. - */ - @UiThread - default void onHidePaymentHandler(@NonNull final WSession aSession) {} } interface NavigationDelegate { diff --git a/app/src/common/shared/com/igalia/wolvic/browser/engine/Session.java b/app/src/common/shared/com/igalia/wolvic/browser/engine/Session.java index 9bc6666bc7..8dc0db430a 100644 --- a/app/src/common/shared/com/igalia/wolvic/browser/engine/Session.java +++ b/app/src/common/shared/com/igalia/wolvic/browser/engine/Session.java @@ -1423,20 +1423,6 @@ public void onExternalResponse(@NonNull WSession aSession, @NonNull WWebResponse } } - @Override - public void onShowPaymentHandler(@NonNull final WSession aSession, @NonNull WDisplay aDisplay, @NonNull OnPaymentHandlerCallback callback) { - for (WSession.ContentDelegate listener : mContentListeners) { - listener.onShowPaymentHandler(aSession, aDisplay, callback); - } - } - - @Override - public void onHidePaymentHandler(@NonNull final WSession aSession) { - for (WSession.ContentDelegate listener : mContentListeners) { - listener.onHidePaymentHandler(aSession); - } - } - // TextInput Delegate @Override diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/OverlayContentWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/OverlayContentWidget.java deleted file mode 100644 index 5e3eb94aa3..0000000000 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/OverlayContentWidget.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.igalia.wolvic.ui.widgets; - -import android.content.Context; -import android.graphics.SurfaceTexture; -import android.os.Handler; -import android.os.Looper; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.Surface; - -import androidx.annotation.NonNull; - -import com.igalia.wolvic.R; -import com.igalia.wolvic.VRBrowserApplication; -import com.igalia.wolvic.browser.api.WDisplay; -import com.igalia.wolvic.browser.api.WSession; - -import java.util.concurrent.Executor; - -public class OverlayContentWidget extends UIWidget implements WidgetManagerDelegate.WorldClickListener { - private Surface mSurface; - private int mSurfaceWidth; - private int mSurfaceHeight; - private Runnable mFirstDrawCallback; - private WSession mSession; - private WDisplay mDisplay; - private WSession.ContentDelegate.OnPaymentHandlerCallback mCallback; - private Executor mUIThreadExecutor; - private Handler mHandler; - - public OverlayContentWidget(Context aContext) { - super(aContext); - initialize(aContext); - } - - public OverlayContentWidget(Context aContext, AttributeSet aAttrs) { - super(aContext, aAttrs); - initialize(aContext); - } - - public OverlayContentWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) { - super(aContext, aAttrs, aDefStyle); - initialize(aContext); - } - - public void setDelegates(@NonNull WSession session, @NonNull WDisplay display, - @NonNull WSession.ContentDelegate.OnPaymentHandlerCallback callback) { - mSession = session; - mDisplay = display; - mCallback = callback; - } - - @Override - public void releaseWidget() { - mWidgetManager.removeWorldClickListener(this); - mCallback.onDismiss(); - - super.releaseWidget(); - } - - @Override - protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { - aPlacement.visible = false; - aPlacement.width = WidgetPlacement.dpDimension(getContext(), R.dimen.tabs_width); - aPlacement.height = WidgetPlacement.dpDimension(getContext(), R.dimen.tabs_height); - - aPlacement.parentAnchorX = 0.5f; - aPlacement.parentAnchorY = 0.0f; - aPlacement.anchorX = 0.5f; - aPlacement.anchorY = 0.5f; - aPlacement.translationY = WidgetPlacement.unitFromMeters(getContext(), R.dimen.settings_world_y) - - WidgetPlacement.unitFromMeters(getContext(), R.dimen.window_world_y); - updatePlacementTranslationZ(); - } - - @Override - public void updatePlacementTranslationZ() { - getPlacement().translationZ = WidgetPlacement.unitFromMeters(getContext(), R.dimen.settings_world_z) - - WidgetPlacement.getWindowWorldZMeters(getContext()); - } - - private void initialize(Context aContext) { - mUIThreadExecutor = ((VRBrowserApplication)aContext.getApplicationContext()).getExecutors().mainThread(); - mHandler = new Handler(Looper.getMainLooper()); - - mWidgetManager.addWorldClickListener(this); - } - - @Override - public void attachToWindow(@NonNull WindowWidget window) { - mWidgetPlacement.parentHandle = window.getHandle(); - } - - // View - @Override - public boolean onKeyPreIme(int aKeyCode, KeyEvent aEvent) { - if (super.onKeyPreIme(aKeyCode, aEvent)) { - return true; - } - return mSession.getTextInput().onKeyPreIme(aKeyCode, aEvent); - } - - @Override - public boolean onKeyUp(int aKeyCode, KeyEvent aEvent) { - if (super.onKeyUp(aKeyCode, aEvent)) { - return true; - } - return mSession.getTextInput().onKeyUp(aKeyCode, aEvent); - } - - @Override - public boolean onKeyDown(int aKeyCode, KeyEvent aEvent) { - if (super.onKeyDown(aKeyCode, aEvent)) { - return true; - } - return mSession.getTextInput().onKeyDown(aKeyCode, aEvent); - } - - @Override - public boolean onKeyLongPress(int aKeyCode, KeyEvent aEvent) { - if (super.onKeyLongPress(aKeyCode, aEvent)) { - return true; - } - return mSession.getTextInput().onKeyLongPress(aKeyCode, aEvent); - } - - @Override - public boolean onKeyMultiple(int aKeyCode, int repeatCount, KeyEvent aEvent) { - if (super.onKeyMultiple(aKeyCode, repeatCount, aEvent)) { - return true; - } - return mSession.getTextInput().onKeyMultiple(aKeyCode, repeatCount, aEvent); - } - - @Override - public void handleHoverEvent(MotionEvent aEvent) { - mSession.getPanZoomController().onMotionEvent(aEvent); - } - - @Override - public void handleTouchEvent(MotionEvent aEvent) { - if (aEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { - requestFocus(); - requestFocusFromTouch(); - } - - mSession.getPanZoomController().onTouchEvent(aEvent); - } - - @Override - public boolean onTouchEvent(MotionEvent aEvent) { - mSession.getPanZoomController().onTouchEvent(aEvent); - return true; - } - - @Override - public boolean onGenericMotionEvent(MotionEvent aEvent) { - mSession.getPanZoomController().onMotionEvent(aEvent); - return true; - } - - @Override - public void setSurfaceTexture(SurfaceTexture aTexture, final int aWidth, final int aHeight, Runnable aFirstDrawCallback) { - mFirstDrawCallback = aFirstDrawCallback; - if (aTexture == null) { - setWillNotDraw(true); - return; - } - mSurfaceWidth = aWidth; - mSurfaceHeight = aHeight; - mTexture = aTexture; - aTexture.setDefaultBufferSize(aWidth, aHeight); - mSurface = new Surface(aTexture); - callSurfaceChanged(); - if (mFirstDrawCallback != null) { - mUIThreadExecutor.execute(mFirstDrawCallback); - mFirstDrawCallback = null; - } - } - - @Override - public void setSurface(Surface aSurface, final int aWidth, final int aHeight, Runnable aFirstDrawCallback) { - mSurfaceWidth = aWidth; - mSurfaceHeight = aHeight; - mSurface = aSurface; - mFirstDrawCallback = aFirstDrawCallback; - if (mSurface != null) { - callSurfaceChanged(); - } else { - mDisplay.surfaceDestroyed(); - } - if (mFirstDrawCallback != null) { - mUIThreadExecutor.execute(mFirstDrawCallback); - mFirstDrawCallback = null; - } - } - - private void callSurfaceChanged() { - if (mSurface != null) { - mDisplay.surfaceChanged(mSurface, 0, 0, mSurfaceWidth, mSurfaceHeight); - } - } - - @Override - public void resizeSurface(final int aWidth, final int aHeight) { - mSurfaceWidth = aWidth; - mSurfaceHeight = aHeight; - if (mTexture != null) { - mTexture.setDefaultBufferSize(aWidth, aHeight); - } - - if (mTexture != null && mSurface != null) { - callSurfaceChanged(); - } - } - - @Override - public void onWorldClick() { - post(this::onDismiss); - mCallback.onDismiss(); - } - - @Override - public boolean isDialog() { - return true; - } -} \ No newline at end of file diff --git a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java index a649d365ad..33d45dbddf 100644 --- a/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/com/igalia/wolvic/ui/widgets/WindowWidget.java @@ -48,7 +48,6 @@ import com.igalia.wolvic.browser.SettingsStore; import com.igalia.wolvic.browser.VideoAvailabilityListener; import com.igalia.wolvic.browser.api.WAllowOrDeny; -import com.igalia.wolvic.browser.api.WDisplay; import com.igalia.wolvic.browser.api.WMediaSession; import com.igalia.wolvic.browser.api.WResult; import com.igalia.wolvic.browser.api.WSession; @@ -126,7 +125,6 @@ public class WindowWidget extends UIWidget implements SessionChangeListener, private PromptDialogWidget mAppDialog; private ContextMenuWidget mContextMenu; private SelectionActionWidget mSelectionMenu; - private OverlayContentWidget mPaymentHandler; private int mWidthBackup; private int mHeightBackup; private int mBorderWidth; @@ -1888,26 +1886,6 @@ public void onExternalResponse(@NonNull WSession aSession, @NonNull WWebResponse } } - @Override - public void onShowPaymentHandler(@NonNull WSession session, @NonNull WDisplay display, @NonNull OnPaymentHandlerCallback callback) { - assert mPaymentHandler == null; - mPaymentHandler = new OverlayContentWidget(getContext()); - mPaymentHandler.setDelegates(session, display, callback); - - mPaymentHandler.getPlacement().parentHandle = getHandle(); - mPaymentHandler.attachToWindow(this); - mPaymentHandler.show(KEEP_FOCUS); - } - - @Override - public void onHidePaymentHandler(@NonNull WSession session) { - if (mPaymentHandler != null) { - mPaymentHandler.hide(REMOVE_WIDGET); - mPaymentHandler.releaseWidget(); - mPaymentHandler = null; - } - } - // VideoAvailabilityListener @Override