Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
      5  * except in compliance with the License. You may obtain a copy of the License at
      6  *
      7  *      http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the
     10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     11  * KIND, either express or implied. See the License for the specific language governing
     12  * permissions and limitations under the License.
     13  */
     14 
     15 package com.android.systemui.statusbar.phone;
     16 
     17 import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
     18 
     19 import android.animation.ArgbEvaluator;
     20 import android.content.Context;
     21 import android.content.res.ColorStateList;
     22 import android.graphics.Rect;
     23 import android.util.ArrayMap;
     24 import android.widget.ImageView;
     25 
     26 import com.android.systemui.R;
     27 import com.android.systemui.statusbar.policy.DarkIconDispatcher;
     28 
     29 public class DarkIconDispatcherImpl implements DarkIconDispatcher {
     30 
     31     private final LightBarTransitionsController mTransitionsController;
     32     private final Rect mTintArea = new Rect();
     33     private final ArrayMap<Object, DarkReceiver> mReceivers = new ArrayMap<>();
     34 
     35     private int mIconTint = DEFAULT_ICON_TINT;
     36     private float mDarkIntensity;
     37     private int mDarkModeIconColorSingleTone;
     38     private int mLightModeIconColorSingleTone;
     39 
     40     public DarkIconDispatcherImpl(Context context) {
     41         mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
     42         mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
     43 
     44         mTransitionsController = new LightBarTransitionsController(context,
     45                 this::setIconTintInternal);
     46     }
     47 
     48     public LightBarTransitionsController getTransitionsController() {
     49         return mTransitionsController;
     50     }
     51 
     52     public void addDarkReceiver(DarkReceiver receiver) {
     53         mReceivers.put(receiver, receiver);
     54         receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
     55     }
     56 
     57     public void addDarkReceiver(ImageView imageView) {
     58         DarkReceiver receiver = (area, darkIntensity, tint) -> imageView.setImageTintList(
     59                 ColorStateList.valueOf(getTint(mTintArea, imageView, mIconTint)));
     60         mReceivers.put(imageView, receiver);
     61         receiver.onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
     62     }
     63 
     64     public void removeDarkReceiver(DarkReceiver object) {
     65         mReceivers.remove(object);
     66     }
     67 
     68     public void removeDarkReceiver(ImageView object) {
     69         mReceivers.remove(object);
     70     }
     71 
     72     public void applyDark(ImageView object) {
     73         mReceivers.get(object).onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
     74     }
     75 
     76     /**
     77      * Sets the dark area so {@link #setIconsDark} only affects the icons in the specified area.
     78      *
     79      * @param darkArea the area in which icons should change it's tint, in logical screen
     80      *                 coordinates
     81      */
     82     public void setIconsDarkArea(Rect darkArea) {
     83         if (darkArea == null && mTintArea.isEmpty()) {
     84             return;
     85         }
     86         if (darkArea == null) {
     87             mTintArea.setEmpty();
     88         } else {
     89             mTintArea.set(darkArea);
     90         }
     91         applyIconTint();
     92     }
     93 
     94     private void setIconTintInternal(float darkIntensity) {
     95         mDarkIntensity = darkIntensity;
     96         mIconTint = (int) ArgbEvaluator.getInstance().evaluate(darkIntensity,
     97                 mLightModeIconColorSingleTone, mDarkModeIconColorSingleTone);
     98         applyIconTint();
     99     }
    100 
    101     private void applyIconTint() {
    102         for (int i = 0; i < mReceivers.size(); i++) {
    103             mReceivers.valueAt(i).onDarkChanged(mTintArea, mDarkIntensity, mIconTint);
    104         }
    105     }
    106 }
    107