diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 947641f0ae73..72166bdcbd8c 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -133,15 +133,12 @@ import android.view.ViewGroup; import android.view.ViewStub; import android.view.ViewTreeObserver; import android.view.Window; -import android.view.WindowManager; import android.view.animation.Interpolator; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; import android.widget.ViewFlipper; -import com.readystatesoftware.systembartint.SystemBarTintManager; - public class BrowserApp extends GeckoApp implements TabsPanel.TabsLayoutChangeListener, PropertyAnimator.PropertyAnimationListener, @@ -245,8 +242,6 @@ public class BrowserApp extends GeckoApp private ReadingListHelper mReadingListHelper; - private SystemBarTintManager mTintManager; - // The tab to be selected on editing mode exit. private Integer mTargetTabForEditingMode; @@ -687,8 +682,6 @@ public class BrowserApp extends GeckoApp final Context appContext = getApplicationContext(); - setupSystemUITinting(); - mBrowserChrome = (ViewGroup) findViewById(R.id.browser_chrome); mActionBarFlipper = (ViewFlipper) findViewById(R.id.browser_actionbar); mActionBar = (ActionModeCompatView) findViewById(R.id.actionbar); @@ -838,31 +831,6 @@ public class BrowserApp extends GeckoApp } } - private void setupSystemUITinting() { - if (!Versions.feature19Plus) { - return; - } - - getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - - mTintManager = new SystemBarTintManager(this); - mTintManager.setTintColor(getResources().getColor(R.color.background_tabs)); - updateSystemUITinting(mRootLayout.getSystemUiVisibility()); - - mRootLayout.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { - @Override - public void onSystemUiVisibilityChange(int visibility) { - updateSystemUITinting(visibility); - } - }); - } - - private void updateSystemUITinting(int visibility) { - final boolean shouldTint = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0 && - (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0; - mTintManager.setStatusBarTintEnabled(shouldTint); - } - /** * Check and show the firstrun pane if the browser has never been launched and * is not opening an external link from another application. @@ -2649,11 +2617,6 @@ public class BrowserApp extends GeckoApp view.getHitRect(mTempRect); mTempRect.offset(-view.getScrollX(), -view.getScrollY()); - if (mTintManager != null) { - SystemBarTintManager.SystemBarConfig config = mTintManager.getConfig(); - mTempRect.offset(0, -config.getPixelInsetTop(false)); - } - int[] viewCoords = new int[2]; view.getLocationOnScreen(viewCoords); diff --git a/mobile/android/base/moz.build b/mobile/android/base/moz.build index 8523cf4af4eb..05665c14ebae 100644 --- a/mobile/android/base/moz.build +++ b/mobile/android/base/moz.build @@ -628,7 +628,6 @@ gtjar.sources += [ thirdparty_source_dir + f for f in [ 'com/nineoldandroids/view/ViewPropertyAnimatorHC.java', 'com/nineoldandroids/view/ViewPropertyAnimatorICS.java', 'com/nineoldandroids/view/ViewPropertyAnimatorPreHC.java', - 'com/readystatesoftware/systembartint/SystemBarTintManager.java', 'com/squareup/picasso/Action.java', 'com/squareup/picasso/AssetBitmapHunter.java', 'com/squareup/picasso/BitmapHunter.java', diff --git a/mobile/android/base/resources/layout/gecko_app.xml b/mobile/android/base/resources/layout/gecko_app.xml index e7ad0da9918d..b13e4be63dcd 100644 --- a/mobile/android/base/resources/layout/gecko_app.xml +++ b/mobile/android/base/resources/layout/gecko_app.xml @@ -7,8 +7,7 @@ xmlns:gecko="http://schemas.android.com/apk/res-auto" android:id="@+id/root_layout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="true"> + android:layout_height="match_parent"> = Build.VERSION_CODES.KITKAT) { - try { - Class c = Class.forName("android.os.SystemProperties"); - Method m = c.getDeclaredMethod("get", String.class); - m.setAccessible(true); - sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys"); - } catch (Throwable e) { - sNavBarOverride = null; - } - } - } - - - /** - * The default system bar tint color value. - */ - public static final int DEFAULT_TINT_COLOR = 0x99000000; - - private static String sNavBarOverride; - - private final SystemBarConfig mConfig; - private boolean mStatusBarAvailable; - private boolean mNavBarAvailable; - private boolean mStatusBarTintEnabled; - private boolean mNavBarTintEnabled; - private View mStatusBarTintView; - private View mNavBarTintView; - - /** - * Constructor. Call this in the host activity onCreate method after its - * content view has been set. You should always create new instances when - * the host activity is recreated. - * - * @param activity The host activity. - */ - @TargetApi(19) - public SystemBarTintManager(Activity activity) { - - Window win = activity.getWindow(); - ViewGroup decorViewGroup = (ViewGroup) win.getDecorView(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - // check theme attrs - int[] attrs = {android.R.attr.windowTranslucentStatus, - android.R.attr.windowTranslucentNavigation}; - TypedArray a = activity.obtainStyledAttributes(attrs); - try { - mStatusBarAvailable = a.getBoolean(0, false); - mNavBarAvailable = a.getBoolean(1, false); - } finally { - a.recycle(); - } - - // check window flags - WindowManager.LayoutParams winParams = win.getAttributes(); - int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; - if ((winParams.flags & bits) != 0) { - mStatusBarAvailable = true; - } - bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; - if ((winParams.flags & bits) != 0) { - mNavBarAvailable = true; - } - } - - mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable); - // device might not have virtual navigation keys - if (!mConfig.hasNavigtionBar()) { - mNavBarAvailable = false; - } - - if (mStatusBarAvailable) { - setupStatusBarView(activity, decorViewGroup); - } - if (mNavBarAvailable) { - setupNavBarView(activity, decorViewGroup); - } - - } - - /** - * Enable tinting of the system status bar. - * - * If the platform is running Jelly Bean or earlier, or translucent system - * UI modes have not been enabled in either the theme or via window flags, - * then this method does nothing. - * - * @param enabled True to enable tinting, false to disable it (default). - */ - public void setStatusBarTintEnabled(boolean enabled) { - mStatusBarTintEnabled = enabled; - if (mStatusBarAvailable) { - mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE); - } - } - - /** - * Enable tinting of the system navigation bar. - * - * If the platform does not have soft navigation keys, is running Jelly Bean - * or earlier, or translucent system UI modes have not been enabled in either - * the theme or via window flags, then this method does nothing. - * - * @param enabled True to enable tinting, false to disable it (default). - */ - public void setNavigationBarTintEnabled(boolean enabled) { - mNavBarTintEnabled = enabled; - if (mNavBarAvailable) { - mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE); - } - } - - /** - * Apply the specified color tint to all system UI bars. - * - * @param color The color of the background tint. - */ - public void setTintColor(int color) { - setStatusBarTintColor(color); - setNavigationBarTintColor(color); - } - - /** - * Apply the specified drawable or color resource to all system UI bars. - * - * @param res The identifier of the resource. - */ - public void setTintResource(int res) { - setStatusBarTintResource(res); - setNavigationBarTintResource(res); - } - - /** - * Apply the specified drawable to all system UI bars. - * - * @param drawable The drawable to use as the background, or null to remove it. - */ - public void setTintDrawable(Drawable drawable) { - setStatusBarTintDrawable(drawable); - setNavigationBarTintDrawable(drawable); - } - - /** - * Apply the specified alpha to all system UI bars. - * - * @param alpha The alpha to use - */ - public void setTintAlpha(float alpha) { - setStatusBarAlpha(alpha); - setNavigationBarAlpha(alpha); - } - - /** - * Apply the specified color tint to the system status bar. - * - * @param color The color of the background tint. - */ - public void setStatusBarTintColor(int color) { - if (mStatusBarAvailable) { - mStatusBarTintView.setBackgroundColor(color); - } - } - - /** - * Apply the specified drawable or color resource to the system status bar. - * - * @param res The identifier of the resource. - */ - public void setStatusBarTintResource(int res) { - if (mStatusBarAvailable) { - mStatusBarTintView.setBackgroundResource(res); - } - } - - /** - * Apply the specified drawable to the system status bar. - * - * @param drawable The drawable to use as the background, or null to remove it. - */ - @SuppressWarnings("deprecation") - public void setStatusBarTintDrawable(Drawable drawable) { - if (mStatusBarAvailable) { - mStatusBarTintView.setBackgroundDrawable(drawable); - } - } - - /** - * Apply the specified alpha to the system status bar. - * - * @param alpha The alpha to use - */ - @TargetApi(11) - public void setStatusBarAlpha(float alpha) { - if (mStatusBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mStatusBarTintView.setAlpha(alpha); - } - } - - /** - * Apply the specified color tint to the system navigation bar. - * - * @param color The color of the background tint. - */ - public void setNavigationBarTintColor(int color) { - if (mNavBarAvailable) { - mNavBarTintView.setBackgroundColor(color); - } - } - - /** - * Apply the specified drawable or color resource to the system navigation bar. - * - * @param res The identifier of the resource. - */ - public void setNavigationBarTintResource(int res) { - if (mNavBarAvailable) { - mNavBarTintView.setBackgroundResource(res); - } - } - - /** - * Apply the specified drawable to the system navigation bar. - * - * @param drawable The drawable to use as the background, or null to remove it. - */ - @SuppressWarnings("deprecation") - public void setNavigationBarTintDrawable(Drawable drawable) { - if (mNavBarAvailable) { - mNavBarTintView.setBackgroundDrawable(drawable); - } - } - - /** - * Apply the specified alpha to the system navigation bar. - * - * @param alpha The alpha to use - */ - @TargetApi(11) - public void setNavigationBarAlpha(float alpha) { - if (mNavBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mNavBarTintView.setAlpha(alpha); - } - } - - /** - * Get the system bar configuration. - * - * @return The system bar configuration for the current device configuration. - */ - public SystemBarConfig getConfig() { - return mConfig; - } - - /** - * Is tinting enabled for the system status bar? - * - * @return True if enabled, False otherwise. - */ - public boolean isStatusBarTintEnabled() { - return mStatusBarTintEnabled; - } - - /** - * Is tinting enabled for the system navigation bar? - * - * @return True if enabled, False otherwise. - */ - public boolean isNavBarTintEnabled() { - return mNavBarTintEnabled; - } - - private void setupStatusBarView(Context context, ViewGroup decorViewGroup) { - mStatusBarTintView = new View(context); - LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight()); - params.gravity = Gravity.TOP; - if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) { - params.rightMargin = mConfig.getNavigationBarWidth(); - } - mStatusBarTintView.setLayoutParams(params); - mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR); - mStatusBarTintView.setVisibility(View.GONE); - decorViewGroup.addView(mStatusBarTintView); - } - - private void setupNavBarView(Context context, ViewGroup decorViewGroup) { - mNavBarTintView = new View(context); - LayoutParams params; - if (mConfig.isNavigationAtBottom()) { - params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight()); - params.gravity = Gravity.BOTTOM; - } else { - params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT); - params.gravity = Gravity.RIGHT; - } - mNavBarTintView.setLayoutParams(params); - mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR); - mNavBarTintView.setVisibility(View.GONE); - decorViewGroup.addView(mNavBarTintView); - } - - /** - * Class which describes system bar sizing and other characteristics for the current - * device configuration. - * - */ - public static class SystemBarConfig { - - private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height"; - private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height"; - private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape"; - private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width"; - private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar"; - - private final boolean mTranslucentStatusBar; - private final boolean mTranslucentNavBar; - private final int mStatusBarHeight; - private final int mActionBarHeight; - private final boolean mHasNavigationBar; - private final int mNavigationBarHeight; - private final int mNavigationBarWidth; - private final boolean mInPortrait; - private final float mSmallestWidthDp; - - private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) { - Resources res = activity.getResources(); - mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); - mSmallestWidthDp = getSmallestWidthDp(activity); - mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME); - mActionBarHeight = getActionBarHeight(activity); - mNavigationBarHeight = getNavigationBarHeight(activity); - mNavigationBarWidth = getNavigationBarWidth(activity); - mHasNavigationBar = (mNavigationBarHeight > 0); - mTranslucentStatusBar = translucentStatusBar; - mTranslucentNavBar = traslucentNavBar; - } - - @TargetApi(14) - private int getActionBarHeight(Context context) { - int result = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - TypedValue tv = new TypedValue(); - context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true); - result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); - } - return result; - } - - @TargetApi(14) - private int getNavigationBarHeight(Context context) { - Resources res = context.getResources(); - int result = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - if (hasNavBar(context)) { - String key; - if (mInPortrait) { - key = NAV_BAR_HEIGHT_RES_NAME; - } else { - key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME; - } - return getInternalDimensionSize(res, key); - } - } - return result; - } - - @TargetApi(14) - private int getNavigationBarWidth(Context context) { - Resources res = context.getResources(); - int result = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - if (hasNavBar(context)) { - return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME); - } - } - return result; - } - - @TargetApi(14) - private boolean hasNavBar(Context context) { - Resources res = context.getResources(); - int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool", "android"); - if (resourceId != 0) { - boolean hasNav = res.getBoolean(resourceId); - // check override flag (see static block) - if ("1".equals(sNavBarOverride)) { - hasNav = false; - } else if ("0".equals(sNavBarOverride)) { - hasNav = true; - } - return hasNav; - } else { // fallback - return !ViewConfiguration.get(context).hasPermanentMenuKey(); - } - } - - private int getInternalDimensionSize(Resources res, String key) { - int result = 0; - int resourceId = res.getIdentifier(key, "dimen", "android"); - if (resourceId > 0) { - result = res.getDimensionPixelSize(resourceId); - } - return result; - } - - @SuppressLint("NewApi") - private float getSmallestWidthDp(Activity activity) { - DisplayMetrics metrics = new DisplayMetrics(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); - } else { - // TODO this is not correct, but we don't really care pre-kitkat - activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); - } - float widthDp = metrics.widthPixels / metrics.density; - float heightDp = metrics.heightPixels / metrics.density; - return Math.min(widthDp, heightDp); - } - - /** - * Should a navigation bar appear at the bottom of the screen in the current - * device configuration? A navigation bar may appear on the right side of - * the screen in certain configurations. - * - * @return True if navigation should appear at the bottom of the screen, False otherwise. - */ - public boolean isNavigationAtBottom() { - return (mSmallestWidthDp >= 600 || mInPortrait); - } - - /** - * Get the height of the system status bar. - * - * @return The height of the status bar (in pixels). - */ - public int getStatusBarHeight() { - return mStatusBarHeight; - } - - /** - * Get the height of the action bar. - * - * @return The height of the action bar (in pixels). - */ - public int getActionBarHeight() { - return mActionBarHeight; - } - - /** - * Does this device have a system navigation bar? - * - * @return True if this device uses soft key navigation, False otherwise. - */ - public boolean hasNavigtionBar() { - return mHasNavigationBar; - } - - /** - * Get the height of the system navigation bar. - * - * @return The height of the navigation bar (in pixels). If the device does not have - * soft navigation keys, this will always return 0. - */ - public int getNavigationBarHeight() { - return mNavigationBarHeight; - } - - /** - * Get the width of the system navigation bar when it is placed vertically on the screen. - * - * @return The width of the navigation bar (in pixels). If the device does not have - * soft navigation keys, this will always return 0. - */ - public int getNavigationBarWidth() { - return mNavigationBarWidth; - } - - /** - * Get the layout inset for any system UI that appears at the top of the screen. - * - * @param withActionBar True to include the height of the action bar, False otherwise. - * @return The layout inset (in pixels). - */ - public int getPixelInsetTop(boolean withActionBar) { - return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0); - } - - /** - * Get the layout inset for any system UI that appears at the bottom of the screen. - * - * @return The layout inset (in pixels). - */ - public int getPixelInsetBottom() { - if (mTranslucentNavBar && isNavigationAtBottom()) { - return mNavigationBarHeight; - } else { - return 0; - } - } - - /** - * Get the layout inset for any system UI that appears at the right of the screen. - * - * @return The layout inset (in pixels). - */ - public int getPixelInsetRight() { - if (mTranslucentNavBar && !isNavigationAtBottom()) { - return mNavigationBarWidth; - } else { - return 0; - } - } - - } - -}