Home | History | Annotate | Download | only in policy
      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 
     26     void setIconsDarkArea(Rect r);
     27     LightBarTransitionsController getTransitionsController();
     28 
     29     void addDarkReceiver(DarkReceiver receiver);
     30     void addDarkReceiver(ImageView imageView);
     31 
     32     // Must have been previously been added through one of the addDarkReceive methods above.
     33     void removeDarkReceiver(DarkReceiver object);
     34     void removeDarkReceiver(ImageView object);
     35 
     36     // Used to reapply darkness on an object, must have previously been added through
     37     // addDarkReceiver.
     38     void applyDark(DarkReceiver 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      */
     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      */
     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      */
     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 {
     90         void onDarkChanged(Rect area, float darkIntensity, int tint);
     91     }
     92 }
     93