| /* |
| * Copyright (C) 2017 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.statusbar.phone; |
| |
| import static com.android.systemui.plugins.DarkIconDispatcher.DEFAULT_ICON_TINT; |
| import static com.android.systemui.plugins.DarkIconDispatcher.getTint; |
| |
| import android.animation.ArgbEvaluator; |
| import android.content.Context; |
| import android.content.res.ColorStateList; |
| import android.graphics.Rect; |
| import android.util.ArrayMap; |
| import android.widget.ImageView; |
| |
| import com.android.systemui.R; |
| import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; |
| |
| import java.io.FileDescriptor; |
| import java.io.PrintWriter; |
| |
| import javax.inject.Inject; |
| import javax.inject.Singleton; |
| |
| /** |
| */ |
| @Singleton |
| public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher { |
| |
| private final LightBarTransitionsController mTransitionsController; |
| private final Rect mTintArea = new Rect(); |
| private final ArrayMap<Object, DarkReceiver> mReceivers = new ArrayMap<>(); |
| |
| private int mIconTint = DEFAULT_ICON_TINT; |
| private float mDarkIntensity; |
| private int mDarkModeIconColorSingleTone; |
| private int mLightModeIconColorSingleTone; |
| |
| /** |
| */ |
| @Inject |
| public DarkIconDispatcherImpl(Context context) { |
| mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone); |
| mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone); |
| |
| mTransitionsController = new LightBarTransitionsController(context, |
| this::setIconTintInternal); |
| } |
| |
| public LightBarTransitionsController getTransitionsController() { |
| return mTransitionsController; |
| } |
| |
| public void addDarkReceiver(DarkReceiver receiver) { |
| mReceivers.put(receiver, receiver); |
| receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint); |
| } |
| |
| public void addDarkReceiver(ImageView imageView) { |
| DarkReceiver receiver = (area, darkIntensity, tint) -> imageView.setImageTintList( |
| ColorStateList.valueOf(getTint(mTintArea, imageView, mIconTint))); |
| mReceivers.put(imageView, receiver); |
| receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint); |
| } |
| |
| public void removeDarkReceiver(DarkReceiver object) { |
| mReceivers.remove(object); |
| } |
| |
| public void removeDarkReceiver(ImageView object) { |
| mReceivers.remove(object); |
| } |
| |
| public void applyDark(DarkReceiver object) { |
| mReceivers.get(object).onDarkChanged(mTintArea, mDarkIntensity, mIconTint); |
| } |
| |
| /** |
| * Sets the dark area so {@link #applyDark} only affects the icons in the specified area. |
| * |
| * @param darkArea the area in which icons should change it's tint, in logical screen |
| * coordinates |
| */ |
| public void setIconsDarkArea(Rect darkArea) { |
| if (darkArea == null && mTintArea.isEmpty()) { |
| return; |
| } |
| if (darkArea == null) { |
| mTintArea.setEmpty(); |
| } else { |
| mTintArea.set(darkArea); |
| } |
| applyIconTint(); |
| } |
| |
| private void setIconTintInternal(float darkIntensity) { |
| mDarkIntensity = darkIntensity; |
| mIconTint = (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, |
| mLightModeIconColorSingleTone, mDarkModeIconColorSingleTone); |
| applyIconTint(); |
| } |
| |
| private void applyIconTint() { |
| for (int i = 0; i < mReceivers.size(); i++) { |
| mReceivers.valueAt(i).onDarkChanged(mTintArea, mDarkIntensity, mIconTint); |
| } |
| } |
| |
| @Override |
| public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { |
| pw.println("DarkIconDispatcher: "); |
| pw.println(" mIconTint: 0x" + Integer.toHexString(mIconTint)); |
| pw.println(" mDarkIntensity: " + mDarkIntensity + "f"); |
| pw.println(" mTintArea: " + mTintArea); |
| } |
| } |