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

Commit e87ef4d9 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Remove prototype for color QS tiles.

This removes the prototype added in ag/9363655

Test: build
Test: toggle settings and observe
Change-Id: I48785ea90b039793591d048fcbd330ab1caf6cd7
parent 144034cf
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