blob: a3ef91d95149a895427a0f41b569dc2bb3b57e1c [file] [log] [blame]
Jorim Jaggi66ac1332015-01-21 19:22:26 +01001/*
Jason Monkaa573e92017-01-27 17:00:29 -05002 * Copyright (C) 2017 The Android Open Source Project
Jorim Jaggi66ac1332015-01-21 19:22:26 +01003 *
Jason Monkaa573e92017-01-27 17:00:29 -05004 * 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
Jorim Jaggi66ac1332015-01-21 19:22:26 +01006 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
Jason Monkaa573e92017-01-27 17:00:29 -05009 * 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.
Jorim Jaggi66ac1332015-01-21 19:22:26 +010013 */
14
15package com.android.systemui.statusbar.phone;
16
Jorim Jaggi66ac1332015-01-21 19:22:26 +010017import android.content.Context;
Jason Monk6eb906e2017-03-29 15:04:25 -040018import android.support.annotation.VisibleForTesting;
Jason Monk3b230072015-05-29 11:11:29 -040019import android.text.TextUtils;
20import android.util.ArraySet;
Jason Monk6d6672f2016-02-05 14:18:21 -050021import android.view.Gravity;
Jorim Jaggi66ac1332015-01-21 19:22:26 +010022import android.view.View;
23import android.view.ViewGroup;
Jorim Jaggidd0107a2015-01-21 22:23:48 +010024import android.widget.ImageView;
Jorim Jaggi66ac1332015-01-21 19:22:26 +010025import android.widget.LinearLayout;
Jason Monk6eb906e2017-03-29 15:04:25 -040026import android.widget.LinearLayout.LayoutParams;
Jason Monkaa573e92017-01-27 17:00:29 -050027
Jorim Jaggi66ac1332015-01-21 19:22:26 +010028import com.android.internal.statusbar.StatusBarIcon;
Jason Monkde850bb2017-02-01 19:26:30 -050029import com.android.systemui.Dependency;
Jorim Jaggi66ac1332015-01-21 19:22:26 +010030import com.android.systemui.R;
Jorim Jaggi66ac1332015-01-21 19:22:26 +010031import com.android.systemui.statusbar.StatusBarIconView;
Jason Monkaa573e92017-01-27 17:00:29 -050032import com.android.systemui.statusbar.policy.DarkIconDispatcher;
Jorim Jaggi66ac1332015-01-21 19:22:26 +010033
Jason Monkaa573e92017-01-27 17:00:29 -050034public interface StatusBarIconController {
Jorim Jaggi66ac1332015-01-21 19:22:26 +010035
Jason Monkaa573e92017-01-27 17:00:29 -050036 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);
Jorim Jaggi66ac1332015-01-21 19:22:26 +010043
Jason Monk3b230072015-05-29 11:11:29 -040044 public static final String ICON_BLACKLIST = "icon_blacklist";
Jorim Jaggidd0107a2015-01-21 22:23:48 +010045
Jason Monk5e745172015-06-02 19:14:44 -040046 public static ArraySet<String> getIconBlacklist(String blackListStr) {
Jason Monkaa573e92017-01-27 17:00:29 -050047 ArraySet<String> ret = new ArraySet<>();
Jason Monk3e189872016-01-12 09:10:34 -050048 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);
Jason Monk3b230072015-05-29 11:11:29 -040055 }
56 }
57 return ret;
58 }
Selim Cinek3e7592d2016-04-11 09:35:54 +080059
Jason Monkaa573e92017-01-27 17:00:29 -050060
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
Jason Monk6eb906e2017-03-29 15:04:25 -040076 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() {
Selim Cinek3e7592d2016-04-11 09:35:54 +080084 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
85 ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize);
86 lp.setMargins(mIconHPadding, 0, mIconHPadding, 0);
Jason Monk6eb906e2017-03-29 15:04:25 -040087 return lp;
Selim Cinek3e7592d2016-04-11 09:35:54 +080088 }
Jason Monkaa573e92017-01-27 17:00:29 -050089
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();
Selim Cinek3e7592d2016-04-11 09:35:54 +080096 }
Jason Monkaa573e92017-01-27 17:00:29 -050097
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 }
Selim Cinek3e7592d2016-04-11 09:35:54 +0800109 }
110
Jason Monkaa573e92017-01-27 17:00:29 -0500111 /**
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
Jason Monk6eb906e2017-03-29 15:04:25 -0400126 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);
Jason Monkaa573e92017-01-27 17:00:29 -0500134 view.set(icon);
Jason Monk6eb906e2017-03-29 15:04:25 -0400135 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);
Jason Monkaa573e92017-01-27 17:00:29 -0500146 }
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 }
Selim Cinek3e7592d2016-04-11 09:35:54 +0800185 }
Jorim Jaggi66ac1332015-01-21 19:22:26 +0100186}