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