Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da9c2874 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Remove prototype for color QS tiles."

parents 06780834 e87ef4d9
Loading
Loading
Loading
Loading
+1 −19
Original line number Diff line number Diff line
@@ -14,9 +14,6 @@

package com.android.systemui.plugins.qs;

import static java.lang.annotation.RetentionPolicy.SOURCE;

import android.annotation.IntDef;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.metrics.LogMaker;
@@ -28,7 +25,6 @@ import com.android.systemui.plugins.qs.QSTile.Callback;
import com.android.systemui.plugins.qs.QSTile.Icon;
import com.android.systemui.plugins.qs.QSTile.State;

import java.lang.annotation.Retention;
import java.util.Objects;
import java.util.function.Supplier;

@@ -84,17 +80,6 @@ public interface QSTile {
        return logMaker;
    }

    @Retention(SOURCE)
    @IntDef({COLOR_TILE_ACCENT, COLOR_TILE_RED, COLOR_TILE_BLUE, COLOR_TILE_YELLOW,
            COLOR_TILE_GREEN})
    @interface ColorTile {}
    int COLOR_TILE_ACCENT = 0;
    int COLOR_TILE_RED = 1;
    int COLOR_TILE_BLUE = 2;
    int COLOR_TILE_YELLOW = 3;
    int COLOR_TILE_GREEN = 4;
    default void setColor(@ColorTile int color) {}

    @ProvidesInterface(version = Callback.VERSION)
    public interface Callback {
        public static final int VERSION = 1;
@@ -141,7 +126,6 @@ public interface QSTile {
        public SlashState slash;
        public boolean handlesLongClick = true;
        public boolean showRippleEffect = true;
        public int colorActive = -1;

        public boolean copyTo(State other) {
            if (other == null) throw new IllegalArgumentException();
@@ -161,8 +145,7 @@ public interface QSTile {
                    || !Objects.equals(other.dualTarget, dualTarget)
                    || !Objects.equals(other.slash, slash)
                    || !Objects.equals(other.handlesLongClick, handlesLongClick)
                    || !Objects.equals(other.showRippleEffect, showRippleEffect)
                    || !Objects.equals(other.colorActive, colorActive);
                    || !Objects.equals(other.showRippleEffect, showRippleEffect);
            other.icon = icon;
            other.iconSupplier = iconSupplier;
            other.label = label;
@@ -177,7 +160,6 @@ public interface QSTile {
            other.slash = slash != null ? slash.copy() : null;
            other.handlesLongClick = handlesLongClick;
            other.showRippleEffect = showRippleEffect;
            other.colorActive = colorActive;
            return changed;
        }

+0 −140
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.qs

import android.content.ContentResolver
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.provider.Settings
import android.util.Log
import com.android.systemui.plugins.qs.QSTile

private const val TAG = "QSColorController"
private const val QS_COLOR_ICON = "qs_color_icon"
private const val QS_COLOR_ENABLED = "qs_color_enabled"
private const val QS_COLOR_OVERRIDDEN_TILES = "qs_color_overridden_tiles"
private val qsColorIconUri = Settings.System.getUriFor(QS_COLOR_ICON)
private val qsColorEnabledUri = Settings.System.getUriFor(QS_COLOR_ENABLED)
class QSColorController private constructor() {

    private var overrideColor = false
    private var colorIcon = false
    private lateinit var colorCache: SettingBackedMap

    companion object {
        val instance = QSColorController()
        internal fun overrideColor() = instance.overrideColor
        internal fun colorIcon() = instance.colorIcon

        @QSTile.ColorTile
        private fun getColorFromSetting(setting: String): Int {
            return when (setting.toLowerCase()) {
                "red" -> QSTile.COLOR_TILE_RED
                "blue" -> QSTile.COLOR_TILE_BLUE
                "green" -> QSTile.COLOR_TILE_GREEN
                "yellow" -> QSTile.COLOR_TILE_YELLOW
                else -> QSTile.COLOR_TILE_ACCENT
            }
        }
    }

    private fun getBooleanSetting(key: String, default: Boolean = false): Boolean =
            try {
                Settings.System.getInt(contentResolver, key) != 0
            } catch (_: Settings.SettingNotFoundException) {
                default
            }

    private lateinit var tileHost: QSHost
    private lateinit var contentResolver: ContentResolver

    fun initQSTileHost(host: QSHost) {
        tileHost = host
        contentResolver = tileHost.context.contentResolver
        colorCache = SettingBackedMap(contentResolver, mutableMapOf())
        colorIcon = getBooleanSetting(QS_COLOR_ICON)
        overrideColor = getBooleanSetting(QS_COLOR_ENABLED)
        readExistingSettings()
        contentResolver.registerContentObserver(qsColorEnabledUri, true, settingsListener)
        contentResolver.registerContentObserver(qsColorIconUri, false, settingsListener)
    }

    private fun readExistingSettings() {
        Settings.System.getString(contentResolver, QS_COLOR_OVERRIDDEN_TILES)?.split(",")
                ?.mapNotNull { spec ->
            Settings.System.getString(contentResolver, "$QS_COLOR_ENABLED/$spec")?.let {
                spec to it
            }
        }?.forEach {
            modifyTileColor(it.first, getColorFromSetting(it.second))
        }
    }

    private val settingsListener = object : ContentObserver(Handler(Looper.getMainLooper())) {
        override fun onChange(selfChange: Boolean, uri: Uri) {
            super.onChange(selfChange, uri)
            when (uri) {
                qsColorIconUri -> colorIcon = getBooleanSetting(QS_COLOR_ICON)
                qsColorEnabledUri -> overrideColor = getBooleanSetting(QS_COLOR_ENABLED)
                else -> {
                    uri.path?.drop("/system/".length)?.let {
                        val color = getColorFromSetting(
                                Settings.System.getString(contentResolver, it) ?: "accent")
                        val tileSpec = uri.lastPathSegment ?: ""
                        modifyTileColor(tileSpec, color)
                    }
                }
            }
        }
    }

    private fun modifyTileColor(spec: String, @QSTile.ColorTile color: Int) {
        Log.w(TAG, "Setting color of tile $spec to $color")
        colorCache.put(spec, color)
        tileHost.tiles.firstOrNull { it.tileSpec == spec }?.setColor(color)
    }

    fun applyColorToTile(tile: QSTile) {
        colorCache.get(tile.tileSpec)?.let {
            modifyTileColor(tile.tileSpec, it)
        }
    }

    fun applyColorToAllTiles() = tileHost.tiles.forEach(::applyColorToTile)

    fun destroy() {
        contentResolver.unregisterContentObserver(settingsListener)
    }

    class SettingBackedMap(
        private val contentResolver: ContentResolver,
        private val map: MutableMap<String, Int>
    ) : MutableMap<String, @QSTile.ColorTile Int> by map {
        override fun put(key: String, @QSTile.ColorTile value: Int): Int? {
            return map.put(key, value).also {
                Settings.System.putString(contentResolver, QS_COLOR_OVERRIDDEN_TILES,
                        map.filterValues { it != QSTile.COLOR_TILE_ACCENT }
                                .keys
                                .joinToString(","))
            }
        }
    }
}
fun overrideColor() = QSColorController.overrideColor()
fun colorIcon() = QSColorController.colorIcon()
 No newline at end of file
+0 −8
Original line number Diff line number Diff line
@@ -90,8 +90,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
    private int mCurrentUser;
    private final Optional<StatusBar> mStatusBarOptional;

    private QSColorController mQSColorController = QSColorController.Companion.getInstance();

    @Inject
    public QSTileHost(Context context,
            StatusBarIconController iconController,
@@ -127,8 +125,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
            // AutoTileManager can modify mTiles so make sure mTiles has already been initialized.
            mAutoTiles = autoTiles.get();
        });

        mQSColorController.initQSTileHost(this);
    }

    public StatusBarIconController getIconController() {
@@ -142,8 +138,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
        mServices.destroy();
        mPluginManager.removePluginListener(this);
        mDumpController.unregisterDumpable(this);

        mQSColorController.destroy();
    }

    @Override
@@ -280,8 +274,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
                mCallbacks.get(i).onTilesChanged();
            }
        }

        mQSColorController.applyColorToAllTiles();
    }

    @Override
+3 −45
Original line number Diff line number Diff line
@@ -14,12 +14,10 @@

package com.android.systemui.qs.tileimpl;

import static com.android.systemui.qs.QSColorControllerKt.colorIcon;
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -150,15 +148,10 @@ public class QSIconViewImpl extends QSIconView {
            iv.clearColorFilter();
        }
        if (state.state != mState) {
            int color = getColor(state.state, state.colorActive);
            int color = getColor(state.state);
            mState = state.state;
            if (mTint != 0 && allowAnimations && shouldAnimate(iv)) {
                if (colorIcon()) {
                    animateColor(mTint, color, iv, () -> updateIcon(iv, state, allowAnimations));
                } else {
                    animateGrayScale(mTint, color, iv,
                            () -> updateIcon(iv, state, allowAnimations));
                }
                animateGrayScale(mTint, color, iv, () -> updateIcon(iv, state, allowAnimations));
                mTint = color;
            } else {
                if (iv instanceof AlphaControlledSlashImageView) {
@@ -175,12 +168,8 @@ public class QSIconViewImpl extends QSIconView {
        }
    }

    protected int getColor(int state, int colorActive) {
        return getColorForState(getContext(), state, colorActive);
    }

    protected int getColor(int state) {
        return getColor(state, -1);
        return getColorForState(getContext(), state);
    }

    private void animateGrayScale(int fromColor, int toColor, ImageView iv,
@@ -217,37 +206,6 @@ public class QSIconViewImpl extends QSIconView {
        }
    }

    private void animateColor(int fromColor, int toColor, ImageView iv,
            final Runnable endRunnable) {
        if (iv instanceof AlphaControlledSlashImageView) {
            ((AlphaControlledSlashImageView) iv)
                    .setFinalImageTintList(ColorStateList.valueOf(toColor));
        }
        if (mAnimationEnabled && ValueAnimator.areAnimatorsEnabled()) {


            ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
            anim.setDuration(QS_ANIM_LENGTH);
            anim.addUpdateListener(animation -> {
                float fraction = animation.getAnimatedFraction();
                int color = (int) ArgbEvaluator.getInstance().evaluate(fraction, fromColor,
                        toColor);

                setTint(iv, color);
            });
            anim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    endRunnable.run();
                }
            });
            anim.start();
        } else {
            setTint(iv, toColor);
            endRunnable.run();
        }
    }

    public static void setTint(ImageView iv, int color) {
        iv.setImageTintList(ColorStateList.valueOf(color));
    }
+3 −12
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@
 */
package com.android.systemui.qs.tileimpl;

import static com.android.systemui.qs.QSColorControllerKt.colorIcon;
import static com.android.systemui.qs.QSColorControllerKt.overrideColor;
import static com.android.systemui.qs.tileimpl.QSIconViewImpl.QS_ANIM_LENGTH;

import android.animation.ValueAnimator;
@@ -76,8 +74,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
    private int mCircleColor;
    private int mBgSize;

    private final boolean mQsColors = overrideColor();
    private final boolean mQSIcons = colorIcon();

    public QSTileBaseView(Context context, QSIconView icon) {
        this(context, icon, false);
@@ -212,7 +208,7 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
    }

    protected void handleStateChanged(QSTile.State state) {
        int circleColor = getCircleColor(state.state, mQsColors ? state.colorActive : -1);
        int circleColor = getCircleColor(state.state);
        boolean allowAnimations = animationsEnabled();
        if (circleColor != mCircleColor) {
            if (allowAnimations) {
@@ -259,11 +255,10 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
        return mLocInScreen[1] >= -getHeight();
    }

    private int getCircleColor(int state, int colorActive) {
    private int getCircleColor(int state) {
        switch (state) {
            case Tile.STATE_ACTIVE:
                int color = (colorActive == -1) ? mColorActive : colorActive;
                return mQsColors && mQSIcons ? Utils.applyAlpha(0.5f, color) : color;
                return mColorActive;
            case Tile.STATE_INACTIVE:
            case Tile.STATE_UNAVAILABLE:
                return mColorDisabled;
@@ -273,10 +268,6 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView {
        }
    }

    private int getCircleColor(int state) {
        return getCircleColor(state, -1);
    }

    @Override
    public void setClickable(boolean clickable) {
        super.setClickable(clickable);
Loading