From a65b551e1216fa66e420cadea0db66639a568deb Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Fri, 23 Aug 2019 19:58:59 +0200 Subject: [PATCH] Title bar support wip --- .../browser/engine/SessionStack.java | 16 +- .../vrbrowser/ui/views/NavigationURLBar.java | 29 +-- .../ui/widgets/NavigationBarWidget.java | 21 ++- .../vrbrowser/ui/widgets/TitleBarWidget.java | 170 ++++++++++++++++++ .../vrbrowser/ui/widgets/WindowWidget.java | 51 +++++- .../mozilla/vrbrowser/ui/widgets/Windows.java | 32 +++- .../res/drawable/title_bar_background.xml | 45 +++++ .../drawable/title_bar_background_private.xml | 45 +++++ app/src/main/res/layout/navigation_bar.xml | 152 +--------------- .../res/layout/navigation_bar_fullscreen.xml | 37 ++++ .../res/layout/navigation_bar_navigation.xml | 69 +++++++ .../main/res/layout/navigation_bar_resize.xml | 53 ++++++ app/src/main/res/layout/title_bar.xml | 52 ++++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 9 + 15 files changed, 607 insertions(+), 176 deletions(-) create mode 100644 app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java create mode 100644 app/src/main/res/drawable/title_bar_background.xml create mode 100644 app/src/main/res/drawable/title_bar_background_private.xml create mode 100644 app/src/main/res/layout/navigation_bar_fullscreen.xml create mode 100644 app/src/main/res/layout/navigation_bar_navigation.xml create mode 100644 app/src/main/res/layout/navigation_bar_resize.xml create mode 100644 app/src/main/res/layout/title_bar.xml 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 f3557f63d..c0b36477e 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 @@ -36,11 +36,9 @@ import org.mozilla.vrbrowser.telemetry.TelemetryWrapper; import org.mozilla.vrbrowser.utils.InternalPages; -import java.util.ArrayList; import java.net.URI; import java.net.URISyntaxException; -import java.util.ArrayDeque; -import java.util.Deque; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -546,6 +544,18 @@ public String getCurrentTitle() { return result; } + public boolean isSecure() { + boolean isSecure = false; + if (mCurrentSession != null) { + SessionState state = mSessions.get(mCurrentSession.hashCode()); + if (state == null) { + return false; + } + isSecure = state.mSecurityInformation != null && state.mSecurityInformation.isSecure; + } + return isSecure; + } + public Media getFullScreenVideo() { if (mCurrentSession != null) { SessionState state = mSessions.get(mCurrentSession.hashCode()); 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 da81e427f..afe8bf8e2 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 @@ -225,21 +225,6 @@ public void setIsBookmarkMode(boolean isBookmarkMode) { syncViews(); } - public boolean isInBookmarkMode() { - return mIsBookmarkMode; - } - - private void setBookmarkEnabled(boolean aEnabled) { - if (mBookmarkEnabled != aEnabled) { - mBookmarkEnabled = aEnabled; - mBookmarkButton.setVisibility(aEnabled ? View.VISIBLE : View.GONE); - ViewGroup.LayoutParams params = mMicrophoneButton.getLayoutParams(); - params.width = (int) getResources().getDimension(aEnabled ? R.dimen.url_bar_item_width : R.dimen.url_bar_last_item_width); - mMicrophoneButton.setLayoutParams(params); - mMicrophoneButton.setBackgroundResource(aEnabled ? R.drawable.url_button : R.drawable.url_button_end); - } - } - private void handleBookmarkClick() { if (mAudio != null) { mAudio.playSound(AudioEngine.Sound.CLICK); @@ -278,11 +263,11 @@ public void setHint(@StringRes int aHint) { mURL.setHint(aHint); } - public void setURL(String aURL) { - if (mIsBookmarkMode) { - return; - } + public void setInsecureVisibility(int visibility) { + mInsecureIcon.setVisibility(visibility); + } + public void setURL(String aURL) { mURL.removeTextChangedListener(mURLTextWatcher); if (StringUtils.isEmpty(aURL)) { setBookmarked(false); @@ -419,8 +404,11 @@ private void syncViews() { mURLLeftContainer.setVisibility(View.VISIBLE); mURLLeftContainer.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); mLoadingView.setVisibility(mIsLoading ? View.VISIBLE : View.GONE); - mInsecureIcon.setVisibility(!mIsLoading && mIsInsecure ? View.VISIBLE : View.GONE); + if (!mIsBookmarkMode) { + mInsecureIcon.setVisibility(!mIsLoading && mIsInsecure ? View.VISIBLE : View.GONE); + } leftPadding = mURLLeftContainer.getMeasuredWidth(); + } else { mURLLeftContainer.setVisibility(View.GONE); mLoadingView.setVisibility(View.GONE); @@ -478,6 +466,7 @@ public void handleURLEdit(String text) { public void setPrivateMode(boolean isEnabled) { if (isEnabled) { mURL.setBackground(getContext().getDrawable(R.drawable.url_background_private)); + } else { mURL.setBackground(getContext().getDrawable(R.drawable.url_background)); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java index d1532bfe0..3946b567d 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java @@ -375,9 +375,7 @@ public void detachFromWindow() { if (mIsInFullScreenMode) { exitFullScreenMode(); } - if (mURLBar.isInBookmarkMode() && mAttachedWindow != null) { - onBookmarksHidden(mAttachedWindow); - } + if (mSessionStack != null) { mSessionStack.removeSessionChangeListener(this); mSessionStack.removeNavigationListener(this); @@ -402,6 +400,19 @@ public void attachToWindow(@NonNull WindowWidget aWindow) { mAttachedWindow = aWindow; mAttachedWindow.addBookmarksListener(this); + if (mAttachedWindow != null) { + mURLBar.setIsBookmarkMode(mAttachedWindow.isBookmarksVisible()); + if (mAttachedWindow.isBookmarksVisible()) { + mURLBar.setURL(getResources().getString(R.string.url_bookmarks_title)); + mURLBar.setInsecureVisibility(View.GONE); + + } else { + mURLBar.setURL(mAttachedWindow.getSessionStack().getCurrentUri()); + mURLBar.setHint(R.string.search_placeholder); + mURLBar.setInsecureVisibility(View.VISIBLE); + } + } + mSessionStack = aWindow.getSessionStack(); if (mSessionStack != null) { mURLBar.setSessionStack(mSessionStack); @@ -712,6 +723,7 @@ public void onLocationChange(GeckoSession session, String url) { if (mURLBar != null && !mAttachedWindow.isBookmarksVisible()) { Log.d(LOGTAG, "Got location change"); mURLBar.setURL(url); + mURLBar.setHint(R.string.search_placeholder); mReloadButton.setEnabled(true); } updateServoButton(); @@ -773,6 +785,7 @@ public void onPageStart(GeckoSession aSession, String aUri) { if (mURLBar != null) { Log.d(LOGTAG, "Got onPageStart"); mURLBar.setURL(aUri); + mURLBar.setHint(R.string.search_placeholder); } mIsLoading = true; mURLBar.setIsLoading(true); @@ -966,7 +979,7 @@ public void OnItemClicked(SuggestionsWidget.SuggestionItem item) { public void onBookmarksShown(WindowWidget aWindow) { if (mAttachedWindow == aWindow) { mURLBar.setURL(""); - mURLBar.setHint(R.string.about_bookmarks); + mURLBar.setHint(R.string.url_bookmarks_title); mURLBar.setIsBookmarkMode(true); } } 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 new file mode 100644 index 000000000..479adf176 --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/TitleBarWidget.java @@ -0,0 +1,170 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.vrbrowser.ui.widgets; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +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.vrbrowser.R; +import org.mozilla.vrbrowser.browser.SettingsStore; +import org.mozilla.vrbrowser.databinding.TitleBarBinding; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; + +public class TitleBarWidget extends UIWidget { + + private static final String LOGTAG = TitleBarWidget.class.getSimpleName(); + + public interface Delegate { + void onTitleClicked(TitleBarWidget aWidget); + } + + private TitleBarBinding mBinding; + private WindowWidget mAttachedWindow; + private boolean mVisible; + + public TitleBarWidget(Context aContext) { + super(aContext); + initialize(aContext); + } + + public TitleBarWidget(Context aContext, AttributeSet aAttrs) { + super(aContext, aAttrs); + initialize(aContext); + } + + public TitleBarWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) { + super(aContext, aAttrs, aDefStyle); + initialize(aContext); + } + + private void initialize(@NonNull Context aContext) { + LayoutInflater inflater = LayoutInflater.from(aContext); + + mBinding = DataBindingUtil.inflate(inflater, R.layout.title_bar, this, true); + mBinding.setWidget(this); + mBinding.executePendingBindings(); + } + + public void setDelegate(Delegate delegate) { + mBinding.setDelegate(delegate); + } + + public @Nullable + WindowWidget getAttachedWindow() { + return mAttachedWindow; + } + + @Override + public void releaseWidget() { + detachFromWindow(); + + mAttachedWindow = null; + super.releaseWidget(); + } + + @Override + protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { + aPlacement.width = WidgetPlacement.dpDimension(getContext(), R.dimen.navigation_bar_width); + aPlacement.worldWidth = WidgetPlacement.floatDimension(getContext(), R.dimen.window_world_width); + aPlacement.height = WidgetPlacement.dpDimension(getContext(), R.dimen.navigation_bar_height); + aPlacement.anchorX = 0.5f; + aPlacement.anchorY = 1.0f; + aPlacement.parentAnchorX = 0.5f; + aPlacement.parentAnchorY = 0.0f; + aPlacement.translationY = -35; + aPlacement.opaque = false; + aPlacement.cylinder = true; + aPlacement.visible = true; + } + + @Override + public void detachFromWindow() { + mAttachedWindow = null; + } + + @Override + public void attachToWindow(@NonNull WindowWidget aWindow) { + if (aWindow == mAttachedWindow) { + return; + } + detachFromWindow(); + + mWidgetPlacement.parentHandle = aWindow.getHandle(); + mAttachedWindow = aWindow; + + setPrivateMode(aWindow.getSessionStack().isPrivateMode()); + } + + @Override + public void setVisible(boolean aIsVisible) { + if (mVisible == aIsVisible) { + return; + } + mVisible = aIsVisible; + getPlacement().visible = aIsVisible; + + if (aIsVisible) { + mWidgetManager.addWidget(this); + } else { + mWidgetManager.removeWidget(this); + } + } + + private void setPrivateMode(boolean aPrivateMode) { + mBinding.titleBar.setBackground(getContext().getDrawable(aPrivateMode ? R.drawable.title_bar_background_private : R.drawable.title_bar_background)); + } + + public void setURL(@StringRes int id) { + setURL(getResources().getString(id)); + } + + public void setURL(String urlString) { + if (urlString == null) { + return; + } + + if (URLUtil.isValidUrl(urlString)) { + try { + URI uri = URI.create(urlString); + URL url = new URL( + uri.getScheme() != null ? uri.getScheme() : "", + uri.getAuthority() != null ? uri.getAuthority() : "", + ""); + mBinding.url.setText(url.toString()); + + } catch (MalformedURLException e) { + mBinding.url.setText(""); + } + + } else { + mBinding.url.setText(urlString); + } + } + + public void setIsInsecure(boolean aIsInsecure) { + if (!(mAttachedWindow.getSessionStack().getCurrentUri().startsWith("data") && + mAttachedWindow.getSessionStack().isPrivateMode())) { + mBinding.insecureIcon.setVisibility(aIsInsecure ? View.VISIBLE : View.GONE); + } + } + + public void setInsecureVisibility(int visibility) { + mBinding.insecureIcon.setVisibility(visibility); + } + +} 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 74235df66..a5bab55c8 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 @@ -45,7 +45,6 @@ import org.mozilla.vrbrowser.ui.widgets.prompts.ConfirmPromptWidget; import org.mozilla.vrbrowser.ui.widgets.prompts.PromptWidget; import org.mozilla.vrbrowser.ui.widgets.prompts.TextPromptWidget; -import org.mozilla.vrbrowser.utils.InternalPages; import org.mozilla.vrbrowser.utils.ViewUtils; import java.util.ArrayList; @@ -55,7 +54,7 @@ import static org.mozilla.vrbrowser.utils.ServoUtils.isInstanceOfServoSession; public class WindowWidget extends UIWidget implements SessionChangeListener, - GeckoSession.ContentDelegate, GeckoSession.PromptDelegate, + GeckoSession.ContentDelegate, GeckoSession.PromptDelegate, GeckoSession.ProgressDelegate, GeckoSession.NavigationDelegate, VideoAvailabilityListener { private static final String LOGTAG = "VRB"; @@ -68,6 +67,7 @@ public class WindowWidget extends UIWidget implements SessionChangeListener, private int mHandle; private WidgetPlacement mWidgetPlacement; private TopBarWidget mTopBar; + private TitleBarWidget mTitleBar; private WidgetManagerDelegate mWidgetManager; private ChoicePromptWidget mChoicePrompt; private AlertPromptWidget mAlertPrompt; @@ -114,6 +114,7 @@ public WindowWidget(Context aContext, int windowId, boolean privateMode) { mSessionStack.addContentListener(this); mSessionStack.addVideoAvailabilityListener(this); mSessionStack.addNavigationListener(this); + mSessionStack.addProgressListener(this); mSessionStack.newSession(); mBookmarksView = new BookmarksView(aContext); @@ -127,6 +128,9 @@ public WindowWidget(Context aContext, int windowId, boolean privateMode) { mTopBar.attachToWindow(this); mLastMouseClickPos = new Point(0, 0); + mTitleBar = new TitleBarWidget(aContext); + mTitleBar.attachToWindow(this); + setFocusable(true); TelemetryWrapper.openWindowEvent(mWindowId); @@ -275,11 +279,20 @@ public void removeBookmarksListener(@NonNull BookmarkListener listener) { public void switchBookmarks() { if (mView == null) { setView(mBookmarksView); + if (mTitleBar != null) { + mTitleBar.setURL(R.string.url_bookmarks_title); + mTitleBar.setInsecureVisibility(View.GONE); + } for (BookmarkListener listener : mBookmarksListeners) listener.onBookmarksShown(this); } else { unsetView(mBookmarksView); + if (mTitleBar != null) { + mTitleBar.setURL(mSessionStack.getCurrentUri()); + mTitleBar.setInsecureVisibility(View.VISIBLE); + mTitleBar.setIsInsecure(!mSessionStack.isSecure()); + } for (BookmarkListener listener : mBookmarksListeners) listener.onBookmarksHidden(this); } @@ -408,6 +421,10 @@ public TopBarWidget getTopBar() { return mTopBar; } + public TitleBarWidget getTitleBar() { + return mTitleBar; + } + @Override public void setSurfaceTexture(SurfaceTexture aTexture, final int aWidth, final int aHeight) { if (mView != null) { @@ -603,6 +620,7 @@ public void releaseWidget() { mSessionStack.removeContentListener(this); mSessionStack.removeVideoAvailabilityListener(this); mSessionStack.removeNavigationListener(this); + mSessionStack.removeProgressListener(this); GeckoSession session = mSessionStack.getSession(mSessionId); if (session == null) { return; @@ -1026,6 +1044,25 @@ public void onLocationChange(@NonNull GeckoSession session, @Nullable String url if (isBookmarksVisible()) { switchBookmarks(); } + + if (mTitleBar != null && url != null) { + if (url.startsWith("data") && mSessionStack.isPrivateMode()) { + mTitleBar.setInsecureVisibility(GONE); + mTitleBar.setURL(getResources().getString(R.string.private_browsing_title)); + + } else if (url.equals(mSessionStack.getHomeUri())) { + mTitleBar.setInsecureVisibility(VISIBLE); + mTitleBar.setURL(getResources().getString(R.string.url_home_title, getResources().getString(R.string.app_name))); + + } else if (url.equals(getResources().getString(R.string.url_bookmarks_title))) { + mTitleBar.setInsecureVisibility(GONE); + mTitleBar.setURL(url); + + } else { + mTitleBar.setInsecureVisibility(View.VISIBLE); + mTitleBar.setURL(url); + } + } } @Nullable @@ -1039,4 +1076,14 @@ public GeckoResult onLoadRequest(@NonNull GeckoSession session, @No return GeckoResult.ALLOW; } + + // GeckoSession.ProgressDelegate + + @Override + public void onSecurityChange(GeckoSession geckoSession, SecurityInformation securityInformation) { + if (mTitleBar != null) { + mTitleBar.setIsInsecure(!securityInformation.isSecure); + } + } + } 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 e91f90654..96cc28027 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 @@ -25,7 +25,8 @@ import java.lang.reflect.Type; import java.util.ArrayList; -public class Windows implements TrayListener, TopBarWidget.Delegate, GeckoSession.ContentDelegate, WindowWidget.WindowDelegate { +public class Windows implements TrayListener, TopBarWidget.Delegate, TitleBarWidget.Delegate, + GeckoSession.ContentDelegate, WindowWidget.WindowDelegate { private static final String LOGTAG = Windows.class.getSimpleName(); @@ -317,7 +318,11 @@ public void focusWindow(@NonNull WindowWidget aWindow) { mFocusedWindow = aWindow; if (prev != null) { prev.setActiveWindow(false); + if (prev.isVisible()) { + prev.getTitleBar().setVisible(true); + } } + mFocusedWindow.getTitleBar().setVisible(false); mFocusedWindow.setActiveWindow(true); if (mDelegate != null) { mDelegate.onFocusedWindowChanged(mFocusedWindow, prev); @@ -513,6 +518,8 @@ private void removeWindow(@NonNull WindowWidget aWindow) { aWindow.getTopBar().setVisible(false); aWindow.getTopBar().setDelegate((TopBarWidget.Delegate) null); aWindow.setWindowDelegate(null); + aWindow.getTitleBar().setVisible(false); + aWindow.getTitleBar().setDelegate((TitleBarWidget.Delegate) null); aWindow.getSessionStack().removeContentListener(this); aWindow.close(); updateMaxWindowScales(); @@ -528,6 +535,7 @@ private void removeWindow(@NonNull WindowWidget aWindow) { private void setWindowVisible(@NonNull WindowWidget aWindow, boolean aVisible) { aWindow.setVisible(aVisible); aWindow.getTopBar().setVisible(aVisible); + aWindow.getTitleBar().setVisible(aVisible); } private void placeWindow(@NonNull WindowWidget aWindow, WindowPlacement aPosition) { @@ -635,12 +643,15 @@ private void updateViews() { } updateTopBars(); + updateTitleBars(); + ArrayList windows = getCurrentWindows(); // Sort windows so frontWindow is the first one. Required for proper native matrix updates. windows.sort((o1, o2) -> o1 == frontWindow ? -1 : 0); for (WindowWidget window: getCurrentWindows()) { mWidgetManager.updateWidget(window); mWidgetManager.updateWidget(window.getTopBar()); + mWidgetManager.updateWidget(window.getTitleBar()); } } @@ -664,12 +675,25 @@ private void updateTopBars() { } } + private void updateTitleBars() { + ArrayList windows = getCurrentWindows(); + for (WindowWidget window: windows) { + if (window == mFocusedWindow) { + window.getTitleBar().setVisible(false); + + } else { + window.getTitleBar().setVisible(true); + } + } + } + private WindowWidget createWindow() { int newWindowId = sIndex++; WindowWidget window = new WindowWidget(mContext, newWindowId, mPrivateMode); window.setWindowDelegate(this); getCurrentWindows().add(window); window.getTopBar().setDelegate(this); + window.getTitleBar().setDelegate(this); window.getSessionStack().addContentListener(this); if (mPrivateMode) { @@ -748,6 +772,12 @@ public void onMoveRightClicked(TopBarWidget aWidget) { } } + // Title Bar Delegate + @Override + public void onTitleClicked(TitleBarWidget aWidget) { + focusWindow(aWidget.getAttachedWindow()); + } + // Content delegate @Override public void onFullScreen(GeckoSession session, boolean aFullScreen) { diff --git a/app/src/main/res/drawable/title_bar_background.xml b/app/src/main/res/drawable/title_bar_background.xml new file mode 100644 index 000000000..6bbdb1c8c --- /dev/null +++ b/app/src/main/res/drawable/title_bar_background.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/title_bar_background_private.xml b/app/src/main/res/drawable/title_bar_background_private.xml new file mode 100644 index 000000000..1f649aec2 --- /dev/null +++ b/app/src/main/res/drawable/title_bar_background_private.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/navigation_bar.xml b/app/src/main/res/layout/navigation_bar.xml index c03316e14..8d269b996 100644 --- a/app/src/main/res/layout/navigation_bar.xml +++ b/app/src/main/res/layout/navigation_bar.xml @@ -1,154 +1,14 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="40dp"> - + - + - - + diff --git a/app/src/main/res/layout/navigation_bar_fullscreen.xml b/app/src/main/res/layout/navigation_bar_fullscreen.xml new file mode 100644 index 000000000..1dc2f3f9d --- /dev/null +++ b/app/src/main/res/layout/navigation_bar_fullscreen.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/navigation_bar_navigation.xml b/app/src/main/res/layout/navigation_bar_navigation.xml new file mode 100644 index 000000000..a4c709178 --- /dev/null +++ b/app/src/main/res/layout/navigation_bar_navigation.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/navigation_bar_resize.xml b/app/src/main/res/layout/navigation_bar_resize.xml new file mode 100644 index 000000000..06be11ced --- /dev/null +++ b/app/src/main/res/layout/navigation_bar_resize.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/title_bar.xml b/app/src/main/res/layout/title_bar.xml new file mode 100644 index 000000000..6a429dce5 --- /dev/null +++ b/app/src/main/res/layout/title_bar.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 74057b58a..2232c00c3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,6 +8,8 @@ #556f8e #518fe1 #80518fe1 + #1ac1dd + #1ac1dd3d #9ea3ab #75eff9 #e3e4e5 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29ead577a..434313e71 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -884,4 +884,13 @@ Default + + + %1$s Home + + + Bookmarks + + + History