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 android.content.Context;
     18 import android.support.annotation.VisibleForTesting;
     19 import android.text.TextUtils;
     20 import android.util.ArraySet;
     21 import android.view.Gravity;
     22 import android.view.View;
     23 import android.view.ViewGroup;
     24 import android.widget.ImageView;
     25 import android.widget.LinearLayout;
     26 import android.widget.LinearLayout.LayoutParams;
     27 
     28 import com.android.internal.statusbar.StatusBarIcon;
     29 import com.android.systemui.Dependency;
     30 import com.android.systemui.R;
     31 import com.android.systemui.statusbar.StatusBarIconView;
     32 import com.android.systemui.statusbar.policy.DarkIconDispatcher;
     33 
     34 public interface StatusBarIconController {
     35 
     36     public void addIconGroup(IconManager iconManager);
     37     public void removeIconGroup(IconManager iconManager);
     38     public void setExternalIcon(String slot);
     39     public void setIcon(String slot, int resourceId, CharSequence contentDescription);
     40     public void setIcon(String slot, StatusBarIcon icon);
     41     public void setIconVisibility(String slotTty, boolean b);
     42     public void removeIcon(String slot);
     43 
     44     public static final String ICON_BLACKLIST = "icon_blacklist";
     45 
     46     public static ArraySet<String> getIconBlacklist(String blackListStr) {
     47         ArraySet<String> ret = new ArraySet<>();
     48         if (blackListStr == null) {
     49             blackListStr = "rotate,headset";
     50         }
     51         String[] blacklist = blackListStr.split(",");
     52         for (String slot : blacklist) {
     53             if (!TextUtils.isEmpty(slot)) {
     54                 ret.add(slot);
     55             }
     56         }
     57         return ret;
     58     }
     59 
     60 
     61     /**
     62      * Version of ViewGroup that observers state from the DarkIconDispatcher.
     63      */
     64     public static class DarkIconManager extends IconManager {
     65         private final DarkIconDispatcher mDarkIconDispatcher;
     66         private int mIconHPadding;
     67 
     68         public DarkIconManager(LinearLayout linearLayout) {
     69             super(linearLayout);
     70             mIconHPadding = mContext.getResources().getDimensionPixelSize(
     71                     R.dimen.status_bar_icon_padding);
     72             mDarkIconDispatcher = Dependency.get(DarkIconDispatcher.class);
     73         }
     74 
     75         @Override
     76         protected void onIconAdded(int index, String slot, boolean blocked,
     77                 StatusBarIcon icon) {
     78             StatusBarIconView v = addIcon(index, slot, blocked, icon);
     79             mDarkIconDispatcher.addDarkReceiver(v);
     80         }
     81 
     82         @Override
     83         protected LayoutParams onCreateLayoutParams() {
     84             LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     85                     ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
     86             lp.setMargins(mIconHPadding, 0, mIconHPadding, 0);
     87             return lp;
     88         }
     89 
     90         @Override
     91         protected void destroy() {
     92             for (int i = 0; i < mGroup.getChildCount(); i++) {
     93                 mDarkIconDispatcher.removeDarkReceiver((ImageView) mGroup.getChildAt(i));
     94             }
     95             mGroup.removeAllViews();
     96         }
     97 
     98         @Override
     99         protected void onRemoveIcon(int viewIndex) {
    100             mDarkIconDispatcher.removeDarkReceiver((ImageView) mGroup.getChildAt(viewIndex));
    101             super.onRemoveIcon(viewIndex);
    102         }
    103 
    104         @Override
    105         public void onSetIcon(int viewIndex, StatusBarIcon icon) {
    106             super.onSetIcon(viewIndex, icon);
    107             mDarkIconDispatcher.applyDark((ImageView) mGroup.getChildAt(viewIndex));
    108         }
    109     }
    110 
    111     /**
    112      * Turns info from StatusBarIconController into ImageViews in a ViewGroup.
    113      */
    114     public static class IconManager {
    115         protected final ViewGroup mGroup;
    116         protected final Context mContext;
    117         protected final int mIconSize;
    118 
    119         public IconManager(ViewGroup group) {
    120             mGroup = group;
    121             mContext = group.getContext();
    122             mIconSize = mContext.getResources().getDimensionPixelSize(
    123                     com.android.internal.R.dimen.status_bar_icon_size);
    124         }
    125 
    126         protected void onIconAdded(int index, String slot, boolean blocked,
    127                 StatusBarIcon icon) {
    128             addIcon(index, slot, blocked, icon);
    129         }
    130 
    131         protected StatusBarIconView addIcon(int index, String slot, boolean blocked,
    132                 StatusBarIcon icon) {
    133             StatusBarIconView view = onCreateStatusBarIconView(slot, blocked);
    134             view.set(icon);
    135             mGroup.addView(view, index, onCreateLayoutParams());
    136             return view;
    137         }
    138 
    139         @VisibleForTesting
    140         protected StatusBarIconView onCreateStatusBarIconView(String slot, boolean blocked) {
    141             return new StatusBarIconView(mContext, slot, null, blocked);
    142         }
    143 
    144         protected LinearLayout.LayoutParams onCreateLayoutParams() {
    145             return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
    146         }
    147 
    148         protected void destroy() {
    149             mGroup.removeAllViews();
    150         }
    151 
    152         protected void onIconExternal(int viewIndex, int height) {
    153             ImageView imageView = (ImageView) mGroup.getChildAt(viewIndex);
    154             imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
    155             imageView.setAdjustViewBounds(true);
    156             setHeightAndCenter(imageView, height);
    157         }
    158 
    159         protected void onDensityOrFontScaleChanged() {
    160             for (int i = 0; i < mGroup.getChildCount(); i++) {
    161                 View child = mGroup.getChildAt(i);
    162                 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    163                         ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
    164                 child.setLayoutParams(lp);
    165             }
    166         }
    167 
    168         private void setHeightAndCenter(ImageView imageView, int height) {
    169             ViewGroup.LayoutParams params = imageView.getLayoutParams();
    170             params.height = height;
    171             if (params instanceof LinearLayout.LayoutParams) {
    172                 ((LinearLayout.LayoutParams) params).gravity = Gravity.CENTER_VERTICAL;
    173             }
    174             imageView.setLayoutParams(params);
    175         }
    176 
    177         protected void onRemoveIcon(int viewIndex) {
    178             mGroup.removeViewAt(viewIndex);
    179         }
    180 
    181         public void onSetIcon(int viewIndex, StatusBarIcon icon) {
    182             StatusBarIconView view = (StatusBarIconView) mGroup.getChildAt(viewIndex);
    183             view.set(icon);
    184         }
    185     }
    186 }
    187