Skip to content

Commit

Permalink
Media controls in the title bar (#1660)
Browse files Browse the repository at this point in the history
Also a few fixes for the title bar
  • Loading branch information
keianhzo authored and bluemarvin committed Aug 26, 2019
1 parent b6e21f8 commit 05fb61d
Show file tree
Hide file tree
Showing 10 changed files with 169 additions and 54 deletions.
@@ -1,5 +1,5 @@
package org.mozilla.vrbrowser.browser;

public interface VideoAvailabilityListener {
default void onVideoAvailabilityChanged(boolean aVideosAvailable) {};
default void onVideoAvailabilityChanged(boolean aVideosAvailable) {}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -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<GeckoSession.NavigationDelegate> mNavigationListeners;
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;
}

Expand Down
Expand Up @@ -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("://");
}
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
}
};


}
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down
Expand Up @@ -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);
}
}
}
}
Expand Down Expand Up @@ -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
Expand Down
111 changes: 71 additions & 40 deletions app/src/main/res/layout/title_bar.xml
Expand Up @@ -3,50 +3,81 @@
xmlns:tools="http://schemas.android.com/tools">

<data>
<variable name="widget" type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget"/>
<variable name="delegate" type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget.Delegate"/>
</data>

<import type="android.view.View" />

<variable
name="widget"
type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget" />

<variable
name="delegate"
type="org.mozilla.vrbrowser.ui.widgets.TitleBarWidget.Delegate" />

<variable
name="isMediaPlaying"
type="boolean" />

<variable
name="isMediaAvailable"
type="boolean" />
</data>

<LinearLayout
android:id="@+id/title_bar"
style="?attr/navigationBarStyle"
android:background="@drawable/title_bar_background"
android:layout_width="300dp"
android:layout_height="40dp"
android:layout_width="@dimen/title_bar_width"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:focusable="true"
android:clickable="true"
android:onClick="@{(view) -> delegate != null ? delegate.onTitleClicked(widget) : void}"
android:padding="10dp">

<ImageView
android:id="@+id/insecureIcon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:contentDescription="SSL icon"
android:padding="5dp"
android:duplicateParentState="true"
android:tint="@color/rhino"
android:visibility="gone"
android:src="@drawable/ic_icon_security_state_insecure" />

<TextView
android:id="@+id/url"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:duplicateParentState="true"
android:contentDescription="Page URL"
android:ellipsize="none"
android:fadingEdgeLength="80dp"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
tools:text="http://mozilla.org" />
android:orientation="horizontal">

<LinearLayout
android:id="@+id/title_bar"
style="?attr/navigationBarStyle"
android:layout_width="260dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/title_bar_background"
android:clickable="true"
android:focusable="true"
android:gravity="center_horizontal"
android:onClick="@{(view) -> delegate != null ? delegate.onTitleClicked(widget) : void}"
android:orientation="horizontal"
android:padding="10dp">

<ImageView
android:id="@+id/insecureIcon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:contentDescription="SSL icon"
android:duplicateParentState="true"
android:padding="5dp"
android:src="@drawable/ic_icon_security_state_insecure"
android:tint="@color/rhino"
android:visibility="gone" />

<TextView
android:id="@+id/url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:contentDescription="Page URL"
android:duplicateParentState="true"
android:ellipsize="none"
android:fadingEdgeLength="80dp"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:requiresFadingEdge="horizontal"
android:singleLine="true"
tools:text="http://mozilla.org" />
</LinearLayout>

<org.mozilla.vrbrowser.ui.views.UIButton
android:id="@+id/mediaButton"
style="?attr/navigationBarButtonStyle"
android:src="@{isMediaPlaying ? @drawable/ic_icon_media_pause : @drawable/ic_icon_media_play}"
android:onClick="@{(view) -> isMediaPlaying ? delegate.onMediaPauseClicked(widget) : delegate.onMediaPlayClicked(widget)}"
android:tooltipText="@{isMediaPlaying ? @string/media_pause_tooltip : @string/media_resume_tooltip}"
android:visibility="@{isMediaAvailable ? View.VISIBLE : View.GONE}" />
</LinearLayout>
</layout>
3 changes: 2 additions & 1 deletion app/src/main/res/values/non_L10n.xml
Expand Up @@ -62,7 +62,8 @@
<string name="developer_options_by" translatable="false">x</string>
<string name="crash_app_name" translatable="false">FirefoxReality</string>
<string name="user_agent_override_file" translatable="false">userAgentOverride.json</string>
<string name="about_bookmarks" translatable="false">about:bookmarks</string>
<string name="about_blank" translatable="false">about:blank</string>
<string name="about_private_browsing" translatable="false">about:privatebrowsing</string>
<string name="voice_app_id" translatable="false">fxr</string>
<string name="keyboard_mode_change" translatable="false">ABC</string>
<string name="keyboard_symbol" translatable="false">%&amp;=</string>
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -733,6 +733,14 @@
'Stop' stops the current page load. -->
<string name="stop_tooltip">Stop Loading</string>

<!-- This string is for the tooltip that appears upon hovering the 'Resume' button in the browser's title bar media buttons.
When clicked the current media playback is resumed. -->
<string name="media_resume_tooltip">Resume</string>

<!-- This string is for the tooltip that appears upon hovering the 'Pause' button in the browser's title bar media buttons.
When clicked the current media playback is paused. -->
<string name="media_pause_tooltip">Pause</string>

<!-- This string is for the tooltip that appears upon hovering the 'Home' button in the browser's navigation bar.
'Home' refers to the browser's start page (e.g., the Firefox Reality Home Page). -->
<string name="home_tooltip">Home</string>
Expand Down

0 comments on commit 05fb61d

Please sign in to comment.