From 05fb61d53f6ead85a69a6c4d739d3816f1251f51 Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Mon, 26 Aug 2019 21:07:12 +0200 Subject: [PATCH] Media controls in the title bar (#1660) Also a few fixes for the title bar --- .../browser/VideoAvailabilityListener.java | 2 +- .../browser/engine/SessionStack.java | 7 +- .../vrbrowser/ui/views/NavigationURLBar.java | 6 + .../mozilla/vrbrowser/ui/views/UIButton.java | 5 + .../vrbrowser/ui/widgets/TitleBarWidget.java | 40 ++++++- .../vrbrowser/ui/widgets/WindowWidget.java | 12 ++ .../mozilla/vrbrowser/ui/widgets/Windows.java | 29 ++++- app/src/main/res/layout/title_bar.xml | 111 +++++++++++------- app/src/main/res/values/non_L10n.xml | 3 +- app/src/main/res/values/strings.xml | 8 ++ 10 files changed, 169 insertions(+), 54 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/VideoAvailabilityListener.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/VideoAvailabilityListener.java index 327f5ff50..53cc1b8a3 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/VideoAvailabilityListener.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/VideoAvailabilityListener.java @@ -1,5 +1,5 @@ package org.mozilla.vrbrowser.browser; public interface VideoAvailabilityListener { - default void onVideoAvailabilityChanged(boolean aVideosAvailable) {}; + default void onVideoAvailabilityChanged(boolean aVideosAvailable) {} } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStack.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStack.java index c0b36477e..cc85c2090 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStack.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStack.java @@ -24,7 +24,6 @@ import org.mozilla.geckoview.GeckoSession; import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.geckoview.MediaElement; -import org.mozilla.geckoview.StorageController; import org.mozilla.geckoview.WebRequestError; import org.mozilla.vrbrowser.R; import org.mozilla.vrbrowser.browser.Media; @@ -57,8 +56,6 @@ public class SessionStack implements ContentBlocking.Delegate, GeckoSession.Navi private static final String LOGTAG = "VRB"; // You can test a local file using: "resource://android/assets/webvr/index.html" - private static final String PRIVATE_BROWSING_URI = "about:privatebrowsing"; - private static final String BLANK_BROWSING_URI = "about:blank"; public static final int NO_SESSION = -1; private transient LinkedList mNavigationListeners; @@ -315,7 +312,7 @@ public void restore(SessionStack store, int currentSessionId) { if (mUsePrivateMode) { loadPrivateBrowsingPage(); - } else if(state.mSessionState == null || state.mUri.equals(BLANK_BROWSING_URI) || + } else if(state.mSessionState == null || state.mUri.equals(mContext.getResources().getString(R.string.about_blank)) || (state.mSessionState != null && state.mSessionState.size() == 0)) { loadHomePage(); } @@ -942,7 +939,7 @@ public void onCanGoForward(@NonNull GeckoSession aSession, boolean aCanGoForward aSession.getSettings().setUserAgentOverride(mUserAgentOverride.lookupOverride(uri)); } - if (PRIVATE_BROWSING_URI.equalsIgnoreCase(uri)) { + if (mContext.getString(R.string.about_private_browsing).equalsIgnoreCase(uri)) { return GeckoResult.DENY; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/NavigationURLBar.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/NavigationURLBar.java index ced9e3218..2043ad190 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/NavigationURLBar.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/NavigationURLBar.java @@ -285,10 +285,16 @@ public void setURL(String aURL) { } if (aURL.startsWith("jar:")) { return; + } else if (aURL.startsWith("resource:") || mSessionStack.isHomeUri(aURL)) { + aURL = ""; } else if (aURL.startsWith("data:") && mSessionStack.isPrivateMode()) { aURL = ""; + + } else if (aURL.startsWith(getContext().getString(R.string.about_blank))) { + aURL = ""; + } else { index = aURL.indexOf("://"); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java index 9d86e9a67..594bb9b8b 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java @@ -15,6 +15,7 @@ import android.view.MotionEvent; import androidx.annotation.IdRes; +import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatImageButton; import org.mozilla.gecko.util.ThreadUtils; @@ -97,6 +98,10 @@ public void setTooltip(String text) { } } + public void setTooltipText(@NonNull String text) { + mTooltipText = text; + } + @Override public boolean onHoverEvent(MotionEvent event) { if (getTooltip() != null) { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java index 9aa227e4f..51da41a9f 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java @@ -11,31 +11,34 @@ import android.view.View; import android.webkit.URLUtil; -import androidx.annotation.IntegerRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.databinding.DataBindingUtil; +import org.mozilla.geckoview.MediaElement; import org.mozilla.vrbrowser.R; -import org.mozilla.vrbrowser.browser.SettingsStore; +import org.mozilla.vrbrowser.browser.Media; import org.mozilla.vrbrowser.databinding.TitleBarBinding; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; -public class TitleBarWidget extends UIWidget { +public class TitleBarWidget extends UIWidget { private static final String LOGTAG = TitleBarWidget.class.getSimpleName(); public interface Delegate { - void onTitleClicked(TitleBarWidget aWidget); + void onTitleClicked(@NonNull TitleBarWidget titleBar); + void onMediaPlayClicked(@NonNull TitleBarWidget titleBar); + void onMediaPauseClicked(@NonNull TitleBarWidget titleBar); } private TitleBarBinding mBinding; private WindowWidget mAttachedWindow; private boolean mVisible; + private Media mMedia; public TitleBarWidget(Context aContext) { super(aContext); @@ -130,6 +133,7 @@ public void setVisible(boolean aIsVisible) { private void setPrivateMode(boolean aPrivateMode) { mBinding.titleBar.setBackground(getContext().getDrawable(aPrivateMode ? R.drawable.title_bar_background_private : R.drawable.title_bar_background)); + mBinding.mediaButton.setPrivateMode(aPrivateMode); } public void setURL(@StringRes int id) { @@ -170,4 +174,32 @@ public void setInsecureVisibility(int visibility) { mBinding.insecureIcon.setVisibility(visibility); } + public void mediaAvailabilityChanged(boolean available) { + mBinding.setIsMediaAvailable(false); + if (available) { + mMedia = mAttachedWindow.getSessionStack().getFullScreenVideo(); + if (mMedia != null) { + mBinding.setIsMediaPlaying(mMedia.isPlaying()); + mMedia.setDelegate(mMediaDelegate); + } + } + } + + MediaElement.Delegate mMediaDelegate = new MediaElement.Delegate() { + @Override + public void onPlaybackStateChange(@NonNull MediaElement mediaElement, int state) { + switch(state) { + case MediaElement.MEDIA_STATE_PLAY: + case MediaElement.MEDIA_STATE_PLAYING: + mBinding.setIsMediaAvailable(true); + mBinding.setIsMediaPlaying(true); + break; + case MediaElement.MEDIA_STATE_PAUSE: + mBinding.setIsMediaAvailable(true); + mBinding.setIsMediaPlaying(false); + } + } + }; + + } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index dfe0be28f..7220f48c0 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -432,6 +432,10 @@ private void updateTitleBarUrl(String url) { mTitleBar.setInsecureVisibility(GONE); mTitleBar.setURL(url); + } else if (url.equals(getResources().getString(R.string.about_blank))) { + mTitleBar.setInsecureVisibility(GONE); + mTitleBar.setURL(""); + } else { mTitleBar.setURL(url); } @@ -1060,6 +1064,10 @@ public void onVideoAvailabilityChanged(boolean aVideosAvailable) { mWidgetManager.setCPULevel(aVideosAvailable ? WidgetManagerDelegate.CPU_LEVEL_HIGH : WidgetManagerDelegate.CPU_LEVEL_NORMAL); + + if (mTitleBar != null) { + mTitleBar.mediaAvailabilityChanged(aVideosAvailable); + } } // GeckoSession.NavigationDelegate @@ -1083,6 +1091,10 @@ public void onLocationChange(@NonNull GeckoSession session, @Nullable String url mTitleBar.setInsecureVisibility(GONE); mTitleBar.setURL(url); + } else if (url.equals(getResources().getString(R.string.about_blank))) { + mTitleBar.setInsecureVisibility(GONE); + mTitleBar.setURL(""); + } else { mTitleBar.setInsecureVisibility(View.VISIBLE); mTitleBar.setURL(url); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java index f98a9a93f..3778e9fbd 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java @@ -685,7 +685,12 @@ private void updateTitleBars() { window.getTitleBar().setVisible(false); } else { - window.getTitleBar().setVisible(true); + if (mFullscreenWindow != null) { + window.getTitleBar().setVisible(false); + + } else { + window.getTitleBar().setVisible(true); + } } } } @@ -777,8 +782,26 @@ public void onMoveRightClicked(TopBarWidget aWidget) { // Title Bar Delegate @Override - public void onTitleClicked(TitleBarWidget aWidget) { - focusWindow(aWidget.getAttachedWindow()); + public void onTitleClicked(@NonNull TitleBarWidget titleBar) { + focusWindow(titleBar.getAttachedWindow()); + } + + @Override + public void onMediaPlayClicked(@NonNull TitleBarWidget titleBar) { + for (WindowWidget window : getCurrentWindows()) { + if (window.getTitleBar() == titleBar) { + window.getSessionStack().getFullScreenVideo().play(); + } + } + } + + @Override + public void onMediaPauseClicked(@NonNull TitleBarWidget titleBar) { + for (WindowWidget window : getCurrentWindows()) { + if (window.getTitleBar() == titleBar) { + window.getSessionStack().getFullScreenVideo().pause(); + } + } } // Content delegate diff --git a/app/src/main/res/layout/title_bar.xml b/app/src/main/res/layout/title_bar.xml index 6a429dce5..38cfe4f86 100644 --- a/app/src/main/res/layout/title_bar.xml +++ b/app/src/main/res/layout/title_bar.xml @@ -3,50 +3,81 @@ xmlns:tools="http://schemas.android.com/tools"> - - - + + + + + + + + + + - - - - + android:orientation="horizontal"> + + + + + + + + + diff --git a/app/src/main/res/values/non_L10n.xml b/app/src/main/res/values/non_L10n.xml index de0390b2f..b8a1254e8 100644 --- a/app/src/main/res/values/non_L10n.xml +++ b/app/src/main/res/values/non_L10n.xml @@ -62,7 +62,8 @@ x FirefoxReality userAgentOverride.json - about:bookmarks + about:blank + about:privatebrowsing fxr ABC %&= diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 434313e71..5eb0d26a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -733,6 +733,14 @@ 'Stop' stops the current page load. --> Stop Loading + + Resume + + + Pause + Home