• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.policy;
16 
17 import android.graphics.Color;
18 import android.graphics.Rect;
19 import android.view.View;
20 import android.widget.ImageView;
21 
22 import com.android.systemui.statusbar.phone.LightBarTransitionsController;
23 
24 public interface DarkIconDispatcher {
25 
setIconsDarkArea(Rect r)26     void setIconsDarkArea(Rect r);
getTransitionsController()27     LightBarTransitionsController getTransitionsController();
28 
addDarkReceiver(DarkReceiver receiver)29     void addDarkReceiver(DarkReceiver receiver);
addDarkReceiver(ImageView imageView)30     void addDarkReceiver(ImageView imageView);
31 
32     // Must have been previously been added through one of the addDarkReceive methods above.
removeDarkReceiver(DarkReceiver object)33     void removeDarkReceiver(DarkReceiver object);
removeDarkReceiver(ImageView object)34     void removeDarkReceiver(ImageView object);
35 
36     // Used to reapply darkness on an object, must have previously been added through
37     // addDarkReceiver.
applyDark(ImageView object)38     void applyDark(ImageView object);
39 
40     int DEFAULT_ICON_TINT = Color.WHITE;
41     Rect sTmpRect = new Rect();
42     int[] sTmpInt2 = new int[2];
43 
44     /**
45      * @return the tint to apply to {@param view} depending on the desired tint {@param color} and
46      *         the screen {@param tintArea} in which to apply that tint
47      */
getTint(Rect tintArea, View view, int color)48     static int getTint(Rect tintArea, View view, int color) {
49         if (isInArea(tintArea, view)) {
50             return color;
51         } else {
52             return DEFAULT_ICON_TINT;
53         }
54     }
55 
56     /**
57      * @return the dark intensity to apply to {@param view} depending on the desired dark
58      *         {@param intensity} and the screen {@param tintArea} in which to apply that intensity
59      */
getDarkIntensity(Rect tintArea, View view, float intensity)60     static float getDarkIntensity(Rect tintArea, View view, float intensity) {
61         if (isInArea(tintArea, view)) {
62             return intensity;
63         } else {
64             return 0f;
65         }
66     }
67 
68     /**
69      * @return true if more than half of the {@param view} area are in {@param area}, false
70      *         otherwise
71      */
isInArea(Rect area, View view)72     static boolean isInArea(Rect area, View view) {
73         if (area.isEmpty()) {
74             return true;
75         }
76         sTmpRect.set(area);
77         view.getLocationOnScreen(sTmpInt2);
78         int left = sTmpInt2[0];
79 
80         int intersectStart = Math.max(left, area.left);
81         int intersectEnd = Math.min(left + view.getWidth(), area.right);
82         int intersectAmount = Math.max(0, intersectEnd - intersectStart);
83 
84         boolean coversFullStatusBar = area.top <= 0;
85         boolean majorityOfWidth = 2 * intersectAmount > view.getWidth();
86         return majorityOfWidth && coversFullStatusBar;
87     }
88 
89     interface DarkReceiver {
onDarkChanged(Rect area, float darkIntensity, int tint)90         void onDarkChanged(Rect area, float darkIntensity, int tint);
91     }
92 }
93