blob: 824960ee6f8308e7bc5deb39152015add338c169 [file] [log] [blame]
John Spurlock3c875662013-08-31 15:07:25 -04001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.statusbar.phone;
18
Evan Laird937d9fa2018-02-08 10:12:16 -080019import android.graphics.Rect;
Dan Sandlerd63f9322015-05-06 15:18:49 -040020import android.graphics.drawable.Icon;
John Spurlock3c875662013-08-31 15:07:25 -040021import android.os.Bundle;
22import android.os.UserHandle;
Evan Lairde1d13c92018-03-20 16:58:01 -040023import android.util.Log;
John Spurlock3c875662013-08-31 15:07:25 -040024import android.view.Gravity;
25import android.view.View;
26import android.view.ViewGroup;
27import android.widget.LinearLayout;
28
29import com.android.internal.statusbar.StatusBarIcon;
30import com.android.systemui.DemoMode;
31import com.android.systemui.R;
Evan Lairde1d13c92018-03-20 16:58:01 -040032import com.android.systemui.statusbar.StatusIconDisplayable;
John Spurlock3c875662013-08-31 15:07:25 -040033import com.android.systemui.statusbar.StatusBarIconView;
Evan Lairde1d13c92018-03-20 16:58:01 -040034import com.android.systemui.statusbar.StatusBarMobileView;
35import com.android.systemui.statusbar.StatusBarWifiView;
36import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
37import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
Evan Laird937d9fa2018-02-08 10:12:16 -080038import com.android.systemui.statusbar.policy.DarkIconDispatcher;
39import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
Evan Lairde1d13c92018-03-20 16:58:01 -040040import java.util.ArrayList;
John Spurlock3c875662013-08-31 15:07:25 -040041
Evan Laird937d9fa2018-02-08 10:12:16 -080042public class DemoStatusIcons extends StatusIconContainer implements DemoMode, DarkReceiver {
Evan Lairde1d13c92018-03-20 16:58:01 -040043 private static final String TAG = "DemoStatusIcons";
44
John Spurlock3c875662013-08-31 15:07:25 -040045 private final LinearLayout mStatusIcons;
Evan Lairde1d13c92018-03-20 16:58:01 -040046 private final ArrayList<StatusBarMobileView> mMobileViews = new ArrayList<>();
John Spurlock3c875662013-08-31 15:07:25 -040047 private final int mIconSize;
48
Evan Lairde1d13c92018-03-20 16:58:01 -040049 private StatusBarWifiView mWifiView;
John Spurlock3c875662013-08-31 15:07:25 -040050 private boolean mDemoMode;
Evan Laird937d9fa2018-02-08 10:12:16 -080051 private int mColor;
John Spurlock3c875662013-08-31 15:07:25 -040052
53 public DemoStatusIcons(LinearLayout statusIcons, int iconSize) {
54 super(statusIcons.getContext());
55 mStatusIcons = statusIcons;
56 mIconSize = iconSize;
Evan Laird937d9fa2018-02-08 10:12:16 -080057 mColor = DarkIconDispatcher.DEFAULT_ICON_TINT;
John Spurlock3c875662013-08-31 15:07:25 -040058
59 setLayoutParams(mStatusIcons.getLayoutParams());
60 setOrientation(mStatusIcons.getOrientation());
61 setGravity(Gravity.CENTER_VERTICAL); // no LL.getGravity()
62 ViewGroup p = (ViewGroup) mStatusIcons.getParent();
63 p.addView(this, p.indexOfChild(mStatusIcons));
64 }
65
Evan Laird937d9fa2018-02-08 10:12:16 -080066 public void remove() {
Evan Lairde1d13c92018-03-20 16:58:01 -040067 mMobileViews.clear();
Evan Laird937d9fa2018-02-08 10:12:16 -080068 ((ViewGroup) getParent()).removeView(this);
69 }
70
71 public void setColor(int color) {
72 mColor = color;
73 updateColors();
74 }
75
76 private void updateColors() {
77 for (int i = 0; i < getChildCount(); i++) {
Evan Lairde1d13c92018-03-20 16:58:01 -040078 StatusIconDisplayable child = (StatusIconDisplayable) getChildAt(i);
Evan Laird937d9fa2018-02-08 10:12:16 -080079 child.setStaticDrawableColor(mColor);
80 }
81 }
82
John Spurlock3c875662013-08-31 15:07:25 -040083 @Override
84 public void dispatchDemoCommand(String command, Bundle args) {
85 if (!mDemoMode && command.equals(COMMAND_ENTER)) {
86 mDemoMode = true;
87 mStatusIcons.setVisibility(View.GONE);
88 setVisibility(View.VISIBLE);
89 } else if (mDemoMode && command.equals(COMMAND_EXIT)) {
90 mDemoMode = false;
91 mStatusIcons.setVisibility(View.VISIBLE);
92 setVisibility(View.GONE);
93 } else if (mDemoMode && command.equals(COMMAND_STATUS)) {
94 String volume = args.getString("volume");
95 if (volume != null) {
John Spurlockad494bc2014-07-19 15:56:19 -040096 int iconId = volume.equals("vibrate") ? R.drawable.stat_sys_ringer_vibrate
John Spurlock3c875662013-08-31 15:07:25 -040097 : 0;
98 updateSlot("volume", null, iconId);
99 }
John Spurlockad494bc2014-07-19 15:56:19 -0400100 String zen = args.getString("zen");
101 if (zen != null) {
102 int iconId = zen.equals("important") ? R.drawable.stat_sys_zen_important
103 : zen.equals("none") ? R.drawable.stat_sys_zen_none
104 : 0;
105 updateSlot("zen", null, iconId);
106 }
John Spurlock3c875662013-08-31 15:07:25 -0400107 String bt = args.getString("bluetooth");
108 if (bt != null) {
109 int iconId = bt.equals("disconnected") ? R.drawable.stat_sys_data_bluetooth
110 : bt.equals("connected") ? R.drawable.stat_sys_data_bluetooth_connected
111 : 0;
112 updateSlot("bluetooth", null, iconId);
113 }
114 String location = args.getString("location");
115 if (location != null) {
Jason Monk359bb742017-04-13 10:40:40 -0400116 int iconId = location.equals("show") ? PhoneStatusBarPolicy.LOCATION_STATUS_ICON_ID
John Spurlock3c875662013-08-31 15:07:25 -0400117 : 0;
Jason Monk3e189872016-01-12 09:10:34 -0500118 updateSlot("location", null, iconId);
John Spurlock3c875662013-08-31 15:07:25 -0400119 }
120 String alarm = args.getString("alarm");
121 if (alarm != null) {
122 int iconId = alarm.equals("show") ? R.drawable.stat_sys_alarm
123 : 0;
124 updateSlot("alarm_clock", null, iconId);
125 }
John Spurlock3c875662013-08-31 15:07:25 -0400126 String tty = args.getString("tty");
127 if (tty != null) {
128 int iconId = tty.equals("show") ? R.drawable.stat_sys_tty_mode
129 : 0;
130 updateSlot("tty", null, iconId);
131 }
John Spurlock3c875662013-08-31 15:07:25 -0400132 String mute = args.getString("mute");
133 if (mute != null) {
134 int iconId = mute.equals("show") ? android.R.drawable.stat_notify_call_mute
135 : 0;
136 updateSlot("mute", null, iconId);
137 }
138 String speakerphone = args.getString("speakerphone");
139 if (speakerphone != null) {
140 int iconId = speakerphone.equals("show") ? android.R.drawable.stat_sys_speakerphone
141 : 0;
142 updateSlot("speakerphone", null, iconId);
143 }
John Spurlock96fe98d2014-08-27 09:36:02 -0400144 String cast = args.getString("cast");
145 if (cast != null) {
Jason Monk952d5d82014-10-27 15:28:22 -0400146 int iconId = cast.equals("show") ? R.drawable.stat_sys_cast : 0;
John Spurlock96fe98d2014-08-27 09:36:02 -0400147 updateSlot("cast", null, iconId);
148 }
Jason Monk952d5d82014-10-27 15:28:22 -0400149 String hotspot = args.getString("hotspot");
150 if (hotspot != null) {
151 int iconId = hotspot.equals("show") ? R.drawable.stat_sys_hotspot : 0;
152 updateSlot("hotspot", null, iconId);
153 }
John Spurlock3c875662013-08-31 15:07:25 -0400154 }
155 }
156
Evan Lairde1d13c92018-03-20 16:58:01 -0400157 /// Can only be used to update non-signal related slots
John Spurlock3c875662013-08-31 15:07:25 -0400158 private void updateSlot(String slot, String iconPkg, int iconId) {
159 if (!mDemoMode) return;
Jason Monk259e06f2015-06-18 14:07:26 -0400160 if (iconPkg == null) {
161 iconPkg = mContext.getPackageName();
162 }
John Spurlock3c875662013-08-31 15:07:25 -0400163 int removeIndex = -1;
164 for (int i = 0; i < getChildCount(); i++) {
Evan Lairde1d13c92018-03-20 16:58:01 -0400165 View child = getChildAt(i);
166 if (!(child instanceof StatusBarIconView)) {
167 continue;
168 }
169 StatusBarIconView v = (StatusBarIconView) child;
John Spurlock3c875662013-08-31 15:07:25 -0400170 if (slot.equals(v.getTag())) {
171 if (iconId == 0) {
172 removeIndex = i;
173 break;
174 } else {
175 StatusBarIcon icon = v.getStatusBarIcon();
Evan Laird937d9fa2018-02-08 10:12:16 -0800176 icon.visible = true;
Dan Sandlerd63f9322015-05-06 15:18:49 -0400177 icon.icon = Icon.createWithResource(icon.icon.getResPackage(), iconId);
John Spurlock3c875662013-08-31 15:07:25 -0400178 v.set(icon);
179 v.updateDrawable();
180 return;
181 }
182 }
183 }
184 if (iconId == 0) {
185 if (removeIndex != -1) {
186 removeViewAt(removeIndex);
John Spurlock3c875662013-08-31 15:07:25 -0400187 }
Jason Monk259e06f2015-06-18 14:07:26 -0400188 return;
John Spurlock3c875662013-08-31 15:07:25 -0400189 }
Xiaohui Chen87d0e252015-07-30 15:38:16 -0700190 StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.SYSTEM, iconId, 0, 0, "Demo");
Evan Laird937d9fa2018-02-08 10:12:16 -0800191 icon.visible = true;
John Spurlockfd9aa5f2014-10-31 10:28:11 -0400192 StatusBarIconView v = new StatusBarIconView(getContext(), null, null);
John Spurlock3c875662013-08-31 15:07:25 -0400193 v.setTag(slot);
194 v.set(icon);
Evan Laird937d9fa2018-02-08 10:12:16 -0800195 v.setStaticDrawableColor(mColor);
John Spurlock3c875662013-08-31 15:07:25 -0400196 addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize));
197 }
Evan Laird937d9fa2018-02-08 10:12:16 -0800198
Evan Lairde1d13c92018-03-20 16:58:01 -0400199 public void addDemoWifiView(WifiIconState state) {
200 Log.d(TAG, "addDemoWifiView: ");
Evan Laird20b87bf2018-04-12 09:54:11 -0400201 StatusBarWifiView view = StatusBarWifiView.fromContext(mContext, state.slot);
Evan Lairde1d13c92018-03-20 16:58:01 -0400202
203 int viewIndex = getChildCount();
204 // If we have mobile views, put wifi before them
205 for (int i = 0; i < getChildCount(); i++) {
206 View child = getChildAt(i);
207 if (child instanceof StatusBarMobileView) {
208 viewIndex = i;
209 break;
210 }
211 }
212
213 mWifiView = view;
214 mWifiView.applyWifiState(state);
215 mWifiView.setStaticDrawableColor(mColor);
216 addView(view, viewIndex);
217 }
218
219 public void updateWifiState(WifiIconState state) {
220 Log.d(TAG, "updateWifiState: ");
221 if (mWifiView == null) {
222 addDemoWifiView(state);
223 } else {
224 mWifiView.applyWifiState(state);
225 }
226 }
227
228 public void addMobileView(MobileIconState state) {
229 Log.d(TAG, "addMobileView: ");
230 StatusBarMobileView view = StatusBarMobileView.fromContext(mContext);
231
232 view.setSlot(state.slot);
233 view.applyMobileState(state);
234 view.setStaticDrawableColor(mColor);
235
236 // mobile always goes at the end
237 mMobileViews.add(view);
238 addView(view, getChildCount());
239 }
240
241 public void updateMobileState(MobileIconState state) {
242 Log.d(TAG, "updateMobileState: ");
243 // If the view for this subId exists already, use it
244 for (int i = 0; i < mMobileViews.size(); i++) {
245 StatusBarMobileView view = mMobileViews.get(i);
246 if (view.getState().subId == state.subId) {
247 view.applyMobileState(state);
248 return;
249 }
250 }
251
252 // Else we have to add it
253 addMobileView(state);
254 }
255
256 public void onRemoveIcon(StatusIconDisplayable view) {
257 if (view.getSlot().equals("wifi")) {
258 removeView(mWifiView);
259 mWifiView = null;
260 } else {
261 StatusBarMobileView mobileView = matchingMobileView(view);
262 if (mobileView != null) {
263 removeView(mobileView);
264 mMobileViews.remove(mobileView);
265 }
266 }
267 }
268
269 private StatusBarMobileView matchingMobileView(StatusIconDisplayable otherView) {
270 if (!(otherView instanceof StatusBarMobileView)) {
271 return null;
272 }
273
274 StatusBarMobileView v = (StatusBarMobileView) otherView;
275 for (StatusBarMobileView view : mMobileViews) {
276 if (view.getState().subId == v.getState().subId) {
277 return view;
278 }
279 }
280
281 return null;
282 }
283
Evan Laird937d9fa2018-02-08 10:12:16 -0800284 @Override
285 public void onDarkChanged(Rect area, float darkIntensity, int tint) {
286 setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint));
Evan Lairde1d13c92018-03-20 16:58:01 -0400287
288 if (mWifiView != null) {
289 mWifiView.onDarkChanged(area, darkIntensity, tint);
290 }
291 for (StatusBarMobileView view : mMobileViews) {
292 view.onDarkChanged(area, darkIntensity, tint);
293 }
Evan Laird937d9fa2018-02-08 10:12:16 -0800294 }
Dan Sandlerd63f9322015-05-06 15:18:49 -0400295}