Bug 1366672 - part1: add ThemedProgressBar r=jwu,sebastian
authorJulian_Chu <walkingice0204@gmail.com>
Sat, 05 Aug 2017 13:30:29 +0800
changeset 376650 3403e2cea2242cad02d24683b538c5dc4cd653de
parent 376649 0f63d6c1f3c60fd3da62f6003541f6065449f086
child 376651 7dfd7586ce709b4173bd928a745c0c6f8cdbe30d
push id94144
push userryanvm@gmail.com
push dateFri, 25 Aug 2017 00:21:50 +0000
treeherdermozilla-inbound@942d868646cf [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjwu, sebastian
bugs1366672
milestone57.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1366672 - part1: add ThemedProgressBar r=jwu,sebastian We are going to involve new implementation for page loading indicator by ProgressBar. Add ThemedProgressBar for Private Mode. MozReview-Commit-ID: 4Bj9mJtlHPM
mobile/android/base/java/org/mozilla/gecko/widget/themed/ThemedProgressBar.java
mobile/android/base/java/org/mozilla/gecko/widget/themed/generate_themed_views.py
mobile/android/base/moz.build
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/java/org/mozilla/gecko/widget/themed/ThemedProgressBar.java
@@ -0,0 +1,172 @@
+// This file is generated by generate_themed_views.py; do not edit.
+
+/* 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.widget.themed;
+
+import android.support.v4.content.ContextCompat;
+import org.mozilla.gecko.GeckoApplication;
+import org.mozilla.gecko.lwt.LightweightTheme;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.util.DrawableUtil;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+
+public class ThemedProgressBar extends android.widget.ProgressBar
+                                     implements LightweightTheme.OnChangeListener {
+    private LightweightTheme theme;
+
+    private static final int[] STATE_PRIVATE_MODE = { R.attr.state_private };
+    private static final int[] STATE_LIGHT = { R.attr.state_light };
+    private static final int[] STATE_DARK = { R.attr.state_dark };
+
+    protected static final int[] PRIVATE_PRESSED_STATE_SET = { R.attr.state_private, android.R.attr.state_pressed };
+    protected static final int[] PRIVATE_FOCUSED_STATE_SET = { R.attr.state_private, android.R.attr.state_focused };
+    protected static final int[] PRIVATE_STATE_SET = { R.attr.state_private };
+
+    private boolean isPrivate;
+    private boolean isLight;
+    private boolean isDark;
+    private boolean autoUpdateTheme;        // always false if there's no theme.
+
+    private ColorStateList drawableColors;
+
+    public ThemedProgressBar(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initialize(context, attrs, 0);
+    }
+
+    public ThemedProgressBar(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        initialize(context, attrs, defStyle);
+    }
+
+    private void initialize(final Context context, final AttributeSet attrs, final int defStyle) {
+        // The theme can be null, particularly if we might be instantiating this
+        // View in an IDE, with no ambient GeckoApplication.
+        final Context applicationContext = context.getApplicationContext();
+        if (applicationContext instanceof GeckoApplication) {
+            theme = ((GeckoApplication) applicationContext).getLightweightTheme();
+        }
+
+        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LightweightTheme);
+        autoUpdateTheme = theme != null && a.getBoolean(R.styleable.LightweightTheme_autoUpdateTheme, true);
+        a.recycle();
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        if (autoUpdateTheme)
+            theme.addListener(this);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+
+        if (autoUpdateTheme)
+            theme.removeListener(this);
+    }
+
+    @Override
+    public int[] onCreateDrawableState(int extraSpace) {
+        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+
+        if (isPrivate)
+            mergeDrawableStates(drawableState, STATE_PRIVATE_MODE);
+        else if (isLight)
+            mergeDrawableStates(drawableState, STATE_LIGHT);
+        else if (isDark)
+            mergeDrawableStates(drawableState, STATE_DARK);
+
+        return drawableState;
+    }
+
+    @Override
+    public void onLightweightThemeChanged() {
+        if (autoUpdateTheme && theme.isEnabled())
+            setTheme(theme.isLightTheme());
+    }
+
+    @Override
+    public void onLightweightThemeReset() {
+        if (autoUpdateTheme)
+            resetTheme();
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+        onLightweightThemeChanged();
+    }
+
+    public boolean isPrivateMode() {
+        return isPrivate;
+    }
+
+    public void setPrivateMode(boolean isPrivate) {
+        if (this.isPrivate != isPrivate) {
+            this.isPrivate = isPrivate;
+            refreshDrawableState();
+            invalidate();
+        }
+    }
+
+    public void setTheme(boolean isLight) {
+        // Set the theme only if it is different from existing theme.
+        if ((isLight && this.isLight != isLight) ||
+            (!isLight && this.isDark == isLight)) {
+            if (isLight) {
+                this.isLight = true;
+                this.isDark = false;
+            } else {
+                this.isLight = false;
+                this.isDark = true;
+            }
+
+            refreshDrawableState();
+            invalidate();
+        }
+    }
+
+    public void resetTheme() {
+        if (isLight || isDark) {
+            isLight = false;
+            isDark = false;
+            refreshDrawableState();
+            invalidate();
+        }
+    }
+
+    public void setAutoUpdateTheme(boolean autoUpdateTheme) {
+        if (theme == null) {
+            return;
+        }
+
+        if (this.autoUpdateTheme != autoUpdateTheme) {
+            this.autoUpdateTheme = autoUpdateTheme;
+
+            if (autoUpdateTheme)
+                theme.addListener(this);
+            else
+                theme.removeListener(this);
+        }
+    }
+
+    public ColorDrawable getColorDrawable(int id) {
+        return new ColorDrawable(ContextCompat.getColor(getContext(), id));
+    }
+
+    protected LightweightTheme getTheme() {
+        return theme;
+    }
+}
--- a/mobile/android/base/java/org/mozilla/gecko/widget/themed/generate_themed_views.py
+++ b/mobile/android/base/java/org/mozilla/gecko/widget/themed/generate_themed_views.py
@@ -58,16 +58,19 @@ views = [
          BASE_TYPE='android.widget.TextView',
          STYLE_CONSTRUCTOR=1),
     dict(VIEW_NAME_SUFFIX='View',
          BASE_TYPE='android.view.View',
          STYLE_CONSTRUCTOR=1),
     dict(VIEW_NAME_SUFFIX='ListView',
          BASE_TYPE='android.widget.ListView',
          STYLE_CONSTRUCTOR=1),
+    dict(VIEW_NAME_SUFFIX='ProgressBar',
+         BASE_TYPE='android.widget.ProgressBar',
+         STYLE_CONSTRUCTOR=1),
 ]
 
 for view in views:
     pp = Preprocessor(defines=view, marker='//#')
 
     dest = os.path.join(__DIR__, dest_format_string % view)
     with open(template, 'rU') as input:
         with open(dest, 'wt') as output:
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -1004,16 +1004,17 @@ gbjar.sources += ['java/org/mozilla/geck
 # If you're editing this list, make sure to edit that script.
 gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
     'widget/themed/ThemedEditText.java',
     'widget/themed/ThemedFrameLayout.java',
     'widget/themed/ThemedImageButton.java',
     'widget/themed/ThemedImageView.java',
     'widget/themed/ThemedLinearLayout.java',
     'widget/themed/ThemedListView.java',
+    'widget/themed/ThemedProgressBar.java',
     'widget/themed/ThemedRelativeLayout.java',
     'widget/themed/ThemedTextSwitcher.java',
     'widget/themed/ThemedTextView.java',
     'widget/themed/ThemedView.java',
 ]]
 # The following sources are Photon specific, Eventually they should be merged into base.
 gbjar.sources += ['../app/src/photon/java/org/mozilla/gecko/' + x for x in [
     'home/SearchEngineRow.java',