Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 05fb61d

Browse files
keianhzobluemarvin
authored andcommitted
Media controls in the title bar (#1660)
Also a few fixes for the title bar
1 parent b6e21f8 commit 05fb61d

10 files changed

Lines changed: 169 additions & 54 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package org.mozilla.vrbrowser.browser;
22

33
public interface VideoAvailabilityListener {
4-
default void onVideoAvailabilityChanged(boolean aVideosAvailable) {};
4+
default void onVideoAvailabilityChanged(boolean aVideosAvailable) {}
55
}

app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStack.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.mozilla.geckoview.GeckoSession;
2525
import org.mozilla.geckoview.GeckoSessionSettings;
2626
import org.mozilla.geckoview.MediaElement;
27-
import org.mozilla.geckoview.StorageController;
2827
import org.mozilla.geckoview.WebRequestError;
2928
import org.mozilla.vrbrowser.R;
3029
import org.mozilla.vrbrowser.browser.Media;
@@ -57,8 +56,6 @@ public class SessionStack implements ContentBlocking.Delegate, GeckoSession.Navi
5756
private static final String LOGTAG = "VRB";
5857

5958
// You can test a local file using: "resource://android/assets/webvr/index.html"
60-
private static final String PRIVATE_BROWSING_URI = "about:privatebrowsing";
61-
private static final String BLANK_BROWSING_URI = "about:blank";
6259
public static final int NO_SESSION = -1;
6360

6461
private transient LinkedList<GeckoSession.NavigationDelegate> mNavigationListeners;
@@ -315,7 +312,7 @@ public void restore(SessionStack store, int currentSessionId) {
315312
if (mUsePrivateMode) {
316313
loadPrivateBrowsingPage();
317314

318-
} else if(state.mSessionState == null || state.mUri.equals(BLANK_BROWSING_URI) ||
315+
} else if(state.mSessionState == null || state.mUri.equals(mContext.getResources().getString(R.string.about_blank)) ||
319316
(state.mSessionState != null && state.mSessionState.size() == 0)) {
320317
loadHomePage();
321318
}
@@ -942,7 +939,7 @@ public void onCanGoForward(@NonNull GeckoSession aSession, boolean aCanGoForward
942939
aSession.getSettings().setUserAgentOverride(mUserAgentOverride.lookupOverride(uri));
943940
}
944941

945-
if (PRIVATE_BROWSING_URI.equalsIgnoreCase(uri)) {
942+
if (mContext.getString(R.string.about_private_browsing).equalsIgnoreCase(uri)) {
946943
return GeckoResult.DENY;
947944
}
948945

app/src/common/shared/org/mozilla/vrbrowser/ui/views/NavigationURLBar.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,16 @@ public void setURL(String aURL) {
285285
}
286286
if (aURL.startsWith("jar:")) {
287287
return;
288+
288289
} else if (aURL.startsWith("resource:") || mSessionStack.isHomeUri(aURL)) {
290+
289291
aURL = "";
290292
} else if (aURL.startsWith("data:") && mSessionStack.isPrivateMode()) {
291293
aURL = "";
294+
295+
} else if (aURL.startsWith(getContext().getString(R.string.about_blank))) {
296+
aURL = "";
297+
292298
} else {
293299
index = aURL.indexOf("://");
294300
}

app/src/common/shared/org/mozilla/vrbrowser/ui/views/UIButton.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import android.view.MotionEvent;
1616

1717
import androidx.annotation.IdRes;
18+
import androidx.annotation.NonNull;
1819
import androidx.appcompat.widget.AppCompatImageButton;
1920

2021
import org.mozilla.gecko.util.ThreadUtils;
@@ -97,6 +98,10 @@ public void setTooltip(String text) {
9798
}
9899
}
99100

101+
public void setTooltipText(@NonNull String text) {
102+
mTooltipText = text;
103+
}
104+
100105
@Override
101106
public boolean onHoverEvent(MotionEvent event) {
102107
if (getTooltip() != null) {

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,34 @@
1111
import android.view.View;
1212
import android.webkit.URLUtil;
1313

14-
import androidx.annotation.IntegerRes;
1514
import androidx.annotation.NonNull;
1615
import androidx.annotation.Nullable;
1716
import androidx.annotation.StringRes;
1817
import androidx.databinding.DataBindingUtil;
1918

19+
import org.mozilla.geckoview.MediaElement;
2020
import org.mozilla.vrbrowser.R;
21-
import org.mozilla.vrbrowser.browser.SettingsStore;
21+
import org.mozilla.vrbrowser.browser.Media;
2222
import org.mozilla.vrbrowser.databinding.TitleBarBinding;
2323

2424
import java.net.MalformedURLException;
2525
import java.net.URI;
2626
import java.net.URL;
2727

28-
public class TitleBarWidget extends UIWidget {
28+
public class TitleBarWidget extends UIWidget {
2929

3030
private static final String LOGTAG = TitleBarWidget.class.getSimpleName();
3131

3232
public interface Delegate {
33-
void onTitleClicked(TitleBarWidget aWidget);
33+
void onTitleClicked(@NonNull TitleBarWidget titleBar);
34+
void onMediaPlayClicked(@NonNull TitleBarWidget titleBar);
35+
void onMediaPauseClicked(@NonNull TitleBarWidget titleBar);
3436
}
3537

3638
private TitleBarBinding mBinding;
3739
private WindowWidget mAttachedWindow;
3840
private boolean mVisible;
41+
private Media mMedia;
3942

4043
public TitleBarWidget(Context aContext) {
4144
super(aContext);
@@ -130,6 +133,7 @@ public void setVisible(boolean aIsVisible) {
130133

131134
private void setPrivateMode(boolean aPrivateMode) {
132135
mBinding.titleBar.setBackground(getContext().getDrawable(aPrivateMode ? R.drawable.title_bar_background_private : R.drawable.title_bar_background));
136+
mBinding.mediaButton.setPrivateMode(aPrivateMode);
133137
}
134138

135139
public void setURL(@StringRes int id) {
@@ -170,4 +174,32 @@ public void setInsecureVisibility(int visibility) {
170174
mBinding.insecureIcon.setVisibility(visibility);
171175
}
172176

177+
public void mediaAvailabilityChanged(boolean available) {
178+
mBinding.setIsMediaAvailable(false);
179+
if (available) {
180+
mMedia = mAttachedWindow.getSessionStack().getFullScreenVideo();
181+
if (mMedia != null) {
182+
mBinding.setIsMediaPlaying(mMedia.isPlaying());
183+
mMedia.setDelegate(mMediaDelegate);
184+
}
185+
}
186+
}
187+
188+
MediaElement.Delegate mMediaDelegate = new MediaElement.Delegate() {
189+
@Override
190+
public void onPlaybackStateChange(@NonNull MediaElement mediaElement, int state) {
191+
switch(state) {
192+
case MediaElement.MEDIA_STATE_PLAY:
193+
case MediaElement.MEDIA_STATE_PLAYING:
194+
mBinding.setIsMediaAvailable(true);
195+
mBinding.setIsMediaPlaying(true);
196+
break;
197+
case MediaElement.MEDIA_STATE_PAUSE:
198+
mBinding.setIsMediaAvailable(true);
199+
mBinding.setIsMediaPlaying(false);
200+
}
201+
}
202+
};
203+
204+
173205
}

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,10 @@ private void updateTitleBarUrl(String url) {
432432
mTitleBar.setInsecureVisibility(GONE);
433433
mTitleBar.setURL(url);
434434

435+
} else if (url.equals(getResources().getString(R.string.about_blank))) {
436+
mTitleBar.setInsecureVisibility(GONE);
437+
mTitleBar.setURL("");
438+
435439
} else {
436440
mTitleBar.setURL(url);
437441
}
@@ -1060,6 +1064,10 @@ public void onVideoAvailabilityChanged(boolean aVideosAvailable) {
10601064
mWidgetManager.setCPULevel(aVideosAvailable ?
10611065
WidgetManagerDelegate.CPU_LEVEL_HIGH :
10621066
WidgetManagerDelegate.CPU_LEVEL_NORMAL);
1067+
1068+
if (mTitleBar != null) {
1069+
mTitleBar.mediaAvailabilityChanged(aVideosAvailable);
1070+
}
10631071
}
10641072

10651073
// GeckoSession.NavigationDelegate
@@ -1083,6 +1091,10 @@ public void onLocationChange(@NonNull GeckoSession session, @Nullable String url
10831091
mTitleBar.setInsecureVisibility(GONE);
10841092
mTitleBar.setURL(url);
10851093

1094+
} else if (url.equals(getResources().getString(R.string.about_blank))) {
1095+
mTitleBar.setInsecureVisibility(GONE);
1096+
mTitleBar.setURL("");
1097+
10861098
} else {
10871099
mTitleBar.setInsecureVisibility(View.VISIBLE);
10881100
mTitleBar.setURL(url);

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,12 @@ private void updateTitleBars() {
685685
window.getTitleBar().setVisible(false);
686686

687687
} else {
688-
window.getTitleBar().setVisible(true);
688+
if (mFullscreenWindow != null) {
689+
window.getTitleBar().setVisible(false);
690+
691+
} else {
692+
window.getTitleBar().setVisible(true);
693+
}
689694
}
690695
}
691696
}
@@ -777,8 +782,26 @@ public void onMoveRightClicked(TopBarWidget aWidget) {
777782

778783
// Title Bar Delegate
779784
@Override
780-
public void onTitleClicked(TitleBarWidget aWidget) {
781-
focusWindow(aWidget.getAttachedWindow());
785+
public void onTitleClicked(@NonNull TitleBarWidget titleBar) {
786+
focusWindow(titleBar.getAttachedWindow());
787+
}
788+
789+
@Override
790+
public void onMediaPlayClicked(@NonNull TitleBarWidget titleBar) {
791+
for (WindowWidget window : getCurrentWindows()) {
792+
if (window.getTitleBar() == titleBar) {
793+
window.getSessionStack().getFullScreenVideo().play();
794+
}
795+
}
796+
}
797+
798+
@Override
799+
public void onMediaPauseClicked(@NonNull TitleBarWidget titleBar) {
800+
for (WindowWidget window : getCurrentWindows()) {
801+
if (window.getTitleBar() == titleBar) {
802+
window.getSessionStack().getFullScreenVideo().pause();
803+
}
804+
}
782805
}
783806

784807
// Content delegate

app/src/main/res/layout/title_bar.xml

Lines changed: 71 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,81 @@
33
xmlns:tools="http://schemas.android.com/tools">
44

55
<data>
6-
<variable name="widget" type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget"/>
7-
<variable name="delegate" type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget.Delegate"/>
8-
</data>
96

7+
<import type="android.view.View" />
8+
9+
<variable
10+
name="widget"
11+
type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget" />
12+
13+
<variable
14+
name="delegate"
15+
type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget.Delegate" />
16+
17+
<variable
18+
name="isMediaPlaying"
19+
type="boolean" />
20+
21+
<variable
22+
name="isMediaAvailable"
23+
type="boolean" />
24+
</data>
1025

1126
<LinearLayout
12-
android:id="@+id/title_bar"
13-
style="?attr/navigationBarStyle"
14-
android:background="@drawable/title_bar_background"
15-
android:layout_width="300dp"
16-
android:layout_height="40dp"
27+
android:layout_width="@dimen/title_bar_width"
28+
android:layout_height="wrap_content"
1729
android:layout_gravity="center"
1830
android:gravity="center_horizontal"
19-
android:orientation="horizontal"
20-
android:focusable="true"
21-
android:clickable="true"
22-
android:onClick="@{(view) -> delegate != null ? delegate.onTitleClicked(widget) : void}"
23-
android:padding="10dp">
24-
25-
<ImageView
26-
android:id="@+id/insecureIcon"
27-
android:layout_width="30dp"
28-
android:layout_height="30dp"
29-
android:layout_gravity="center_vertical"
30-
android:contentDescription="SSL icon"
31-
android:padding="5dp"
32-
android:duplicateParentState="true"
33-
android:tint="@color/rhino"
34-
android:visibility="gone"
35-
android:src="@drawable/ic_icon_security_state_insecure" />
36-
37-
<TextView
38-
android:id="@+id/url"
39-
android:paddingStart="5dp"
40-
android:paddingEnd="5dp"
41-
android:layout_width="wrap_content"
42-
android:layout_height="wrap_content"
43-
android:layout_gravity="center_vertical"
44-
android:duplicateParentState="true"
45-
android:contentDescription="Page URL"
46-
android:ellipsize="none"
47-
android:fadingEdgeLength="80dp"
48-
android:requiresFadingEdge="horizontal"
49-
android:singleLine="true"
50-
tools:text="http://mozilla.org" />
31+
android:orientation="horizontal">
32+
33+
<LinearLayout
34+
android:id="@+id/title_bar"
35+
style="?attr/navigationBarStyle"
36+
android:layout_width="260dp"
37+
android:layout_height="match_parent"
38+
android:layout_gravity="center"
39+
android:background="@drawable/title_bar_background"
40+
android:clickable="true"
41+
android:focusable="true"
42+
android:gravity="center_horizontal"
43+
android:onClick="@{(view) -> delegate != null ? delegate.onTitleClicked(widget) : void}"
44+
android:orientation="horizontal"
45+
android:padding="10dp">
46+
47+
<ImageView
48+
android:id="@+id/insecureIcon"
49+
android:layout_width="30dp"
50+
android:layout_height="30dp"
51+
android:layout_gravity="center_vertical"
52+
android:contentDescription="SSL icon"
53+
android:duplicateParentState="true"
54+
android:padding="5dp"
55+
android:src="@drawable/ic_icon_security_state_insecure"
56+
android:tint="@color/rhino"
57+
android:visibility="gone" />
58+
59+
<TextView
60+
android:id="@+id/url"
61+
android:layout_width="wrap_content"
62+
android:layout_height="wrap_content"
63+
android:layout_gravity="center_vertical"
64+
android:contentDescription="Page URL"
65+
android:duplicateParentState="true"
66+
android:ellipsize="none"
67+
android:fadingEdgeLength="80dp"
68+
android:paddingStart="5dp"
69+
android:paddingEnd="5dp"
70+
android:requiresFadingEdge="horizontal"
71+
android:singleLine="true"
72+
tools:text="http://mozilla.org" />
73+
</LinearLayout>
74+
75+
<org.mozilla.vrbrowser.ui.views.UIButton
76+
android:id="@+id/mediaButton"
77+
style="?attr/navigationBarButtonStyle"
78+
android:src="@{isMediaPlaying ? @drawable/ic_icon_media_pause : @drawable/ic_icon_media_play}"
79+
android:onClick="@{(view) -> isMediaPlaying ? delegate.onMediaPauseClicked(widget) : delegate.onMediaPlayClicked(widget)}"
80+
android:tooltipText="@{isMediaPlaying ? @string/media_pause_tooltip : @string/media_resume_tooltip}"
81+
android:visibility="@{isMediaAvailable ? View.VISIBLE : View.GONE}" />
5182
</LinearLayout>
5283
</layout>

app/src/main/res/values/non_L10n.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@
6262
<string name="developer_options_by" translatable="false">x</string>
6363
<string name="crash_app_name" translatable="false">FirefoxReality</string>
6464
<string name="user_agent_override_file" translatable="false">userAgentOverride.json</string>
65-
<string name="about_bookmarks" translatable="false">about:bookmarks</string>
65+
<string name="about_blank" translatable="false">about:blank</string>
66+
<string name="about_private_browsing" translatable="false">about:privatebrowsing</string>
6667
<string name="voice_app_id" translatable="false">fxr</string>
6768
<string name="keyboard_mode_change" translatable="false">ABC</string>
6869
<string name="keyboard_symbol" translatable="false">%&amp;=</string>

app/src/main/res/values/strings.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,14 @@
733733
'Stop' stops the current page load. -->
734734
<string name="stop_tooltip">Stop Loading</string>
735735

736+
<!-- This string is for the tooltip that appears upon hovering the 'Resume' button in the browser's title bar media buttons.
737+
When clicked the current media playback is resumed. -->
738+
<string name="media_resume_tooltip">Resume</string>
739+
740+
<!-- This string is for the tooltip that appears upon hovering the 'Pause' button in the browser's title bar media buttons.
741+
When clicked the current media playback is paused. -->
742+
<string name="media_pause_tooltip">Pause</string>
743+
736744
<!-- This string is for the tooltip that appears upon hovering the 'Home' button in the browser's navigation bar.
737745
'Home' refers to the browser's start page (e.g., the Firefox Reality Home Page). -->
738746
<string name="home_tooltip">Home</string>

0 commit comments

Comments
 (0)