Bug 1376995 - Update status bar color while switching between normal mode and private mode. r?walkingice
MozReview-Commit-ID: 4t0QKTktpSN
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -103,16 +103,17 @@ import org.mozilla.gecko.util.EventCallb
import org.mozilla.gecko.util.GamepadUtils;
import org.mozilla.gecko.util.GeckoBundle;
import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.IntentUtils;
import org.mozilla.gecko.util.MenuUtils;
import org.mozilla.gecko.util.PrefUtils;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ThreadUtils;
+import org.mozilla.gecko.util.WindowUtil;
import org.mozilla.gecko.widget.ActionModePresenter;
import org.mozilla.gecko.widget.AnchoredPopup;
import org.mozilla.gecko.widget.GeckoActionProvider;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
@@ -2268,31 +2269,38 @@ public class BrowserApp extends GeckoApp
// Hide potentially visible "find in page" bar (Bug 1177338)
mFindInPageBar.hide();
for (final BrowserAppDelegate delegate : delegates) {
delegate.onTabsTrayShown(this, mTabsPanel);
}
}
+
+ // Since tabs tray only has dark theme, always update the status bar with dark color.
+ WindowUtil.invalidateStatusBarColor(this, true);
}
@Override
public void hideTabs() {
mTabsPanel.hide();
if (mTabStrip != null) {
mTabStrip.tabStripIsCovered(false);
}
if (mDoorHangerPopup != null) {
mDoorHangerPopup.enable();
}
for (final BrowserAppDelegate delegate : delegates) {
delegate.onTabsTrayHidden(this, mTabsPanel);
}
+
+ final Tab tab = Tabs.getInstance().getSelectedTab();
+ final boolean darkTheme = (tab != null && tab.isPrivate());
+ WindowUtil.invalidateStatusBarColor(this, darkTheme);
}
@Override
public boolean autoHideTabs() {
if (areTabsShown()) {
hideTabs();
return true;
}
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
@@ -6,22 +6,19 @@
package org.mozilla.gecko.toolbar;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
-import org.mozilla.gecko.AppConstants.Versions;
import org.mozilla.gecko.BrowserApp;
-import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.R;
-import org.mozilla.gecko.SiteIdentity;
import org.mozilla.gecko.Tab;
import org.mozilla.gecko.Tabs;
import org.mozilla.gecko.Telemetry;
import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.TouchEventInterceptor;
import org.mozilla.gecko.animation.PropertyAnimator;
import org.mozilla.gecko.animation.PropertyAnimator.PropertyAnimationListener;
import org.mozilla.gecko.animation.ViewHelper;
@@ -31,18 +28,18 @@ import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.MenuPopup;
import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.skin.SkinConfig;
import org.mozilla.gecko.tabs.TabHistoryController;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnStopListener;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.OnTitleChangeListener;
import org.mozilla.gecko.toolbar.ToolbarDisplayLayout.UpdateFlags;
import org.mozilla.gecko.util.Clipboard;
-import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.MenuUtils;
+import org.mozilla.gecko.util.WindowUtil;
import org.mozilla.gecko.widget.themed.ThemedFrameLayout;
import org.mozilla.gecko.widget.themed.ThemedImageButton;
import org.mozilla.gecko.widget.themed.ThemedImageView;
import org.mozilla.gecko.widget.themed.ThemedRelativeLayout;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -332,16 +329,20 @@ public abstract class BrowserToolbar ext
menuButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View view) {
// Drop the soft keyboard.
urlEditLayout.clearFocus();
activity.openOptionsMenu();
}
});
+
+ final Tab tab = Tabs.getInstance().getSelectedTab();
+ final boolean darkTheme = (tab != null && tab.isPrivate());
+ WindowUtil.invalidateStatusBarColor(activity, darkTheme);
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
prefs.close();
}
@@ -833,31 +834,37 @@ public abstract class BrowserToolbar ext
updateProgressVisibility();
triggerStopEditingTransition();
return url;
}
@Override
public void setPrivateMode(boolean isPrivate) {
+ final boolean modeChanged = isPrivateMode() != isPrivate;
+
super.setPrivateMode(isPrivate);
tabsButton.setPrivateMode(isPrivate);
tabsCounter.setPrivateMode(isPrivate);
urlEditLayout.setPrivateMode(isPrivate);
urlDisplayLayout.setPrivateMode(isPrivate);
// bug 1375351: menuButton is a ThemedImageButton in Photon flavor
if (SkinConfig.isPhoton()) {
((ThemedImageButton)menuButton).setPrivateMode(isPrivate);
} else {
((ThemedFrameLayout)menuButton).setPrivateMode(isPrivate);
}
shadowPaint.setColor(isPrivate ? shadowPrivateColor : shadowColor);
+
+ if (modeChanged) {
+ WindowUtil.invalidateStatusBarColor(activity, isPrivate);
+ }
}
public void show() {
setVisibility(View.VISIBLE);
}
public void hide() {
setVisibility(View.GONE);
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/util/WindowUtil.java
@@ -0,0 +1,51 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; 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.gecko.util;
+
+import android.app.Activity;
+import android.os.Build;
+import android.support.v4.content.ContextCompat;
+import android.view.View;
+import android.view.Window;
+
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.skin.SkinConfig;
+
+public class WindowUtil {
+
+ public static void invalidateStatusBarColor(final Activity activity, boolean darkTheme) {
+ // Don't support status bar color change in Australis.
+ if (SkinConfig.isAustralis()) {
+ return;
+ }
+
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return;
+ }
+
+ final int colorResId;
+
+ if (HardwareUtils.isTablet()) {
+ colorResId = R.color.status_bar_bg_color_tablet;
+ darkTheme = true;
+ } else {
+ colorResId = darkTheme ? R.color.status_bar_bg_color_private : R.color.status_bar_bg_color;
+ }
+
+ final Window window = activity.getWindow();
+ final int backgroundColor = ContextCompat.getColor(activity, colorResId);
+ window.setStatusBarColor(backgroundColor);
+
+ final View view = window.getDecorView();
+ int flags = view.getSystemUiVisibility();
+ if (darkTheme) {
+ flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+ } else {
+ flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+ }
+ view.setSystemUiVisibility(flags);
+ }
+}
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -941,16 +941,17 @@ gbjar.sources += ['java/org/mozilla/geck
'updater/UpdateServiceHelper.java',
'util/ColorUtil.java',
'util/DrawableUtil.java',
'util/JavaUtil.java',
'util/ResourceDrawableUtils.java',
'util/TouchTargetUtil.java',
'util/URIUtils.java',
'util/ViewUtil.java',
+ 'util/WindowUtil.java',
'webapps/WebAppActivity.java',
'webapps/WebAppIndexer.java',
'webapps/WebApps.java',
'widget/ActionModePresenter.java',
'widget/ActivityChooserModel.java',
'widget/AllCapsTextView.java',
'widget/AnchoredPopup.java',
'widget/AnimatedHeightLayout.java',