blob: 5dcd393d2c06b45c4e713c342bde4a7301b623cf [file] [log] [blame]
John Spurlockaf8d6c42014-05-07 17:49:08 -04001/*
2 * Copyright (C) 2014 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
Jason Monkba2318e2015-12-08 09:04:23 -050019import android.app.ActivityManager;
Adrian Roos62692b22015-09-11 17:46:23 -070020import android.app.PendingIntent;
Jason Monk7e53f202016-01-28 10:40:20 -050021import android.content.ComponentName;
John Spurlockaf8d6c42014-05-07 17:49:08 -040022import android.content.Context;
23import android.content.Intent;
John Spurlockbceed062014-08-10 18:04:16 -040024import android.content.res.Resources;
Jason Monk7e53f202016-01-28 10:40:20 -050025import android.os.Handler;
John Spurlockaf8d6c42014-05-07 17:49:08 -040026import android.os.HandlerThread;
27import android.os.Looper;
Jason Monk5e745172015-06-02 19:14:44 -040028import android.os.Process;
Jason Monk7e53f202016-01-28 10:40:20 -050029import android.os.UserHandle;
Jason Monkba2318e2015-12-08 09:04:23 -050030import android.provider.Settings;
Jason Monk7e53f202016-01-28 10:40:20 -050031import android.provider.Settings.Secure;
Jason Monkba2318e2015-12-08 09:04:23 -050032import android.text.TextUtils;
John Spurlockbceed062014-08-10 18:04:16 -040033import android.util.Log;
Jason Monkca894a02016-01-12 15:30:22 -050034import android.view.View;
Winsonc0d70582016-01-29 10:24:39 -080035
John Spurlockbceed062014-08-10 18:04:16 -040036import com.android.systemui.R;
John Spurlockaf8d6c42014-05-07 17:49:08 -040037import com.android.systemui.qs.QSTile;
Jason Monkd5a204f2015-12-21 08:50:01 -050038import com.android.systemui.qs.external.CustomTile;
Jason Monk7e53f202016-01-28 10:40:20 -050039import com.android.systemui.qs.external.TileLifecycleManager;
Jason Monkd5a204f2015-12-21 08:50:01 -050040import com.android.systemui.qs.external.TileServices;
Jason Monkbbadff82015-11-06 15:47:26 -050041import com.android.systemui.qs.tiles.AirplaneModeTile;
42import com.android.systemui.qs.tiles.BatteryTile;
43import com.android.systemui.qs.tiles.BluetoothTile;
44import com.android.systemui.qs.tiles.CastTile;
45import com.android.systemui.qs.tiles.CellularTile;
46import com.android.systemui.qs.tiles.ColorInversionTile;
Jason Monk9a4ce132016-01-21 15:27:17 -050047import com.android.systemui.qs.tiles.DataSaverTile;
Jason Monkbbadff82015-11-06 15:47:26 -050048import com.android.systemui.qs.tiles.DndTile;
49import com.android.systemui.qs.tiles.FlashlightTile;
50import com.android.systemui.qs.tiles.HotspotTile;
51import com.android.systemui.qs.tiles.IntentTile;
52import com.android.systemui.qs.tiles.LocationTile;
Jason Monkbbadff82015-11-06 15:47:26 -050053import com.android.systemui.qs.tiles.RotationLockTile;
54import com.android.systemui.qs.tiles.UserTile;
55import com.android.systemui.qs.tiles.WifiTile;
Rubin Xu1205fb12015-11-04 17:45:03 +000056import com.android.systemui.qs.tiles.WorkModeTile;
Jason Monkbbadff82015-11-06 15:47:26 -050057import com.android.systemui.statusbar.policy.BatteryController;
58import com.android.systemui.statusbar.policy.BluetoothController;
59import com.android.systemui.statusbar.policy.CastController;
Jason Monk46dbfb42016-02-25 14:59:20 -050060import com.android.systemui.statusbar.policy.NextAlarmController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050061import com.android.systemui.statusbar.policy.NightModeController;
Jason Monkbbadff82015-11-06 15:47:26 -050062import com.android.systemui.statusbar.policy.FlashlightController;
63import com.android.systemui.statusbar.policy.HotspotController;
64import com.android.systemui.statusbar.policy.KeyguardMonitor;
65import com.android.systemui.statusbar.policy.LocationController;
66import com.android.systemui.statusbar.policy.NetworkController;
67import com.android.systemui.statusbar.policy.RotationLockController;
68import com.android.systemui.statusbar.policy.SecurityController;
69import com.android.systemui.statusbar.policy.UserInfoController;
70import com.android.systemui.statusbar.policy.UserSwitcherController;
71import com.android.systemui.statusbar.policy.ZenModeController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050072import com.android.systemui.tuner.NightModeTile;
Jason Monk5e745172015-06-02 19:14:44 -040073import com.android.systemui.tuner.TunerService;
74import com.android.systemui.tuner.TunerService.Tunable;
John Spurlockaf8d6c42014-05-07 17:49:08 -040075
76import java.util.ArrayList;
John Spurlockbceed062014-08-10 18:04:16 -040077import java.util.Arrays;
78import java.util.Collection;
79import java.util.LinkedHashMap;
John Spurlockaf8d6c42014-05-07 17:49:08 -040080import java.util.List;
John Spurlockbceed062014-08-10 18:04:16 -040081import java.util.Map;
John Spurlockaf8d6c42014-05-07 17:49:08 -040082
83/** Platform implementation of the quick settings tile host **/
Jason Monkd5a204f2015-12-21 08:50:01 -050084public final class QSTileHost implements QSTile.Host, Tunable {
John Spurlockbceed062014-08-10 18:04:16 -040085 private static final String TAG = "QSTileHost";
86 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
87
Jason Monkcaf37622015-08-18 12:33:50 -040088 public static final String TILES_SETTING = "sysui_qs_tiles";
John Spurlockaf8d6c42014-05-07 17:49:08 -040089
90 private final Context mContext;
91 private final PhoneStatusBar mStatusBar;
John Spurlockbceed062014-08-10 18:04:16 -040092 private final LinkedHashMap<String, QSTile<?>> mTiles = new LinkedHashMap<>();
Jason Monk5e745172015-06-02 19:14:44 -040093 protected final ArrayList<String> mTileSpecs = new ArrayList<>();
John Spurlockaf8d6c42014-05-07 17:49:08 -040094 private final BluetoothController mBluetooth;
95 private final LocationController mLocation;
96 private final RotationLockController mRotation;
97 private final NetworkController mNetwork;
98 private final ZenModeController mZen;
Jason Monk51e4dc02014-07-22 12:00:47 -040099 private final HotspotController mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400100 private final CastController mCast;
101 private final Looper mLooper;
Adrian Roosb83777b2014-06-30 15:11:53 +0200102 private final FlashlightController mFlashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200103 private final UserSwitcherController mUserSwitcherController;
Jason Monkabe19742015-09-29 09:47:06 -0400104 private final UserInfoController mUserInfoController;
John Spurlock657c62c2014-07-22 12:18:09 -0400105 private final KeyguardMonitor mKeyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400106 private final SecurityController mSecurity;
Jason Monkabe19742015-09-29 09:47:06 -0400107 private final BatteryController mBattery;
Jason Monk66c89c12016-01-06 08:51:26 -0500108 private final StatusBarIconController mIconController;
Jason Monkd5a204f2015-12-21 08:50:01 -0500109 private final TileServices mServices;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400110
Jason Monkbbadff82015-11-06 15:47:26 -0500111 private final List<Callback> mCallbacks = new ArrayList<>();
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500112 private final NightModeController mNightModeController;
Jason Monkc3f42c12016-02-05 12:33:13 -0500113 private final AutoTileManager mAutoTiles;
114 private final ManagedProfileController mProfileController;
Jason Monk46dbfb42016-02-25 14:59:20 -0500115 private final NextAlarmController mNextAlarmController;
Jason Monkca894a02016-01-12 15:30:22 -0500116 private View mHeader;
Jason Monk1ffa11b2016-03-08 14:44:23 -0500117 private int mCurrentUser;
John Spurlockbceed062014-08-10 18:04:16 -0400118
John Spurlockaf8d6c42014-05-07 17:49:08 -0400119 public QSTileHost(Context context, PhoneStatusBar statusBar,
Jason Monk46dbfb42016-02-25 14:59:20 -0500120 BluetoothController bluetooth, LocationController location,
121 RotationLockController rotation, NetworkController network,
122 ZenModeController zen, HotspotController hotspot,
123 CastController cast, FlashlightController flashlight,
124 UserSwitcherController userSwitcher, UserInfoController userInfo,
125 KeyguardMonitor keyguard, SecurityController security,
126 BatteryController battery, StatusBarIconController iconController,
127 NextAlarmController nextAlarmController) {
John Spurlockaf8d6c42014-05-07 17:49:08 -0400128 mContext = context;
129 mStatusBar = statusBar;
130 mBluetooth = bluetooth;
131 mLocation = location;
132 mRotation = rotation;
133 mNetwork = network;
134 mZen = zen;
Jason Monk51e4dc02014-07-22 12:00:47 -0400135 mHotspot = hotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400136 mCast = cast;
Adrian Roosb83777b2014-06-30 15:11:53 +0200137 mFlashlight = flashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200138 mUserSwitcherController = userSwitcher;
Jason Monkabe19742015-09-29 09:47:06 -0400139 mUserInfoController = userInfo;
John Spurlock657c62c2014-07-22 12:18:09 -0400140 mKeyguard = keyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400141 mSecurity = security;
Jason Monkabe19742015-09-29 09:47:06 -0400142 mBattery = battery;
Jason Monk66c89c12016-01-06 08:51:26 -0500143 mIconController = iconController;
Jason Monk46dbfb42016-02-25 14:59:20 -0500144 mNextAlarmController = nextAlarmController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500145 mNightModeController = new NightModeController(mContext, true);
Jason Monkc3f42c12016-02-05 12:33:13 -0500146 mProfileController = new ManagedProfileController(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400147
Jorim Jaggi1ecd7cd2014-11-03 16:18:03 +0100148 final HandlerThread ht = new HandlerThread(QSTileHost.class.getSimpleName(),
149 Process.THREAD_PRIORITY_BACKGROUND);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400150 ht.start();
151 mLooper = ht.getLooper();
152
Jason Monkd5a204f2015-12-21 08:50:01 -0500153 mServices = new TileServices(this, mLooper);
154
Jason Monk5e745172015-06-02 19:14:44 -0400155 TunerService.get(mContext).addTunable(this, TILES_SETTING);
Rubin Xucedcd282016-02-15 14:44:44 +0000156 // AutoTileManager can modify mTiles so make sure mTiles has already been initialized.
157 mAutoTiles = new AutoTileManager(context, this);
Jason Monk5e745172015-06-02 19:14:44 -0400158 }
John Spurlockbceed062014-08-10 18:04:16 -0400159
Jason Monk46dbfb42016-02-25 14:59:20 -0500160 public NextAlarmController getNextAlarmController() {
161 return mNextAlarmController;
162 }
163
Jason Monkca894a02016-01-12 15:30:22 -0500164 public void setHeaderView(View view) {
165 mHeader = view;
166 }
167
Jason Monkdeba7a42015-12-08 16:14:10 -0500168 public PhoneStatusBar getPhoneStatusBar() {
Jason Monkc34befb2015-10-07 16:40:02 -0400169 return mStatusBar;
170 }
171
Jason Monk5e745172015-06-02 19:14:44 -0400172 public void destroy() {
Jason Monkc3f42c12016-02-05 12:33:13 -0500173 mAutoTiles.destroy();
Jason Monk5e745172015-06-02 19:14:44 -0400174 TunerService.get(mContext).removeTunable(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400175 }
176
177 @Override
Jason Monkbbadff82015-11-06 15:47:26 -0500178 public void addCallback(Callback callback) {
179 mCallbacks.add(callback);
John Spurlockbceed062014-08-10 18:04:16 -0400180 }
181
182 @Override
Jason Monk46dbfb42016-02-25 14:59:20 -0500183 public void removeCallback(Callback callback) {
184 mCallbacks.remove(callback);
185 }
186
187 @Override
John Spurlockbceed062014-08-10 18:04:16 -0400188 public Collection<QSTile<?>> getTiles() {
189 return mTiles.values();
John Spurlockaf8d6c42014-05-07 17:49:08 -0400190 }
191
192 @Override
Jason Monkee43cdf2015-06-19 14:20:46 -0400193 public void startActivityDismissingKeyguard(final Intent intent) {
194 mStatusBar.postStartActivityDismissingKeyguard(intent, 0);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400195 }
196
197 @Override
Adrian Roos62692b22015-09-11 17:46:23 -0700198 public void startActivityDismissingKeyguard(PendingIntent intent) {
199 mStatusBar.postStartActivityDismissingKeyguard(intent);
200 }
201
202 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500203 public void startRunnableDismissingKeyguard(Runnable runnable) {
204 mStatusBar.postQSRunnableDismissingKeyguard(runnable);
205 }
206
207 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400208 public void warn(String message, Throwable t) {
209 // already logged
210 }
211
Jason Monkca894a02016-01-12 15:30:22 -0500212 public void animateExpandQS() {
213 // TODO: Better path to animated panel expansion.
214 mHeader.performClick();
215 }
216
John Spurlockaf8d6c42014-05-07 17:49:08 -0400217 @Override
218 public void collapsePanels() {
219 mStatusBar.postAnimateCollapsePanels();
220 }
221
222 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500223 public void openPanels() {
224 mStatusBar.postAnimateOpenPanels();
225 }
226
227 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400228 public Looper getLooper() {
229 return mLooper;
230 }
231
232 @Override
233 public Context getContext() {
234 return mContext;
235 }
236
237 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400238 public BluetoothController getBluetoothController() {
239 return mBluetooth;
240 }
241
242 @Override
243 public LocationController getLocationController() {
244 return mLocation;
245 }
246
247 @Override
248 public RotationLockController getRotationLockController() {
249 return mRotation;
250 }
251
252 @Override
253 public NetworkController getNetworkController() {
254 return mNetwork;
255 }
256
257 @Override
258 public ZenModeController getZenModeController() {
259 return mZen;
260 }
261
262 @Override
Jason Monk51e4dc02014-07-22 12:00:47 -0400263 public HotspotController getHotspotController() {
264 return mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400265 }
266
267 @Override
268 public CastController getCastController() {
269 return mCast;
270 }
John Spurlock86005342014-05-23 11:58:00 -0400271
272 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400273 public FlashlightController getFlashlightController() {
274 return mFlashlight;
John Spurlock86005342014-05-23 11:58:00 -0400275 }
Adrian Roosb83777b2014-06-30 15:11:53 +0200276
277 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400278 public KeyguardMonitor getKeyguardMonitor() {
279 return mKeyguard;
Adrian Roosb83777b2014-06-30 15:11:53 +0200280 }
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200281
Jason Monkabe19742015-09-29 09:47:06 -0400282 @Override
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200283 public UserSwitcherController getUserSwitcherController() {
284 return mUserSwitcherController;
285 }
Jason Monk3d5f5512014-07-25 11:17:28 -0400286
Jason Monkabe19742015-09-29 09:47:06 -0400287 @Override
288 public UserInfoController getUserInfoController() {
289 return mUserInfoController;
290 }
291
292 @Override
293 public BatteryController getBatteryController() {
294 return mBattery;
295 }
296
Jason Monk3d5f5512014-07-25 11:17:28 -0400297 public SecurityController getSecurityController() {
298 return mSecurity;
299 }
Jason Monkbbadff82015-11-06 15:47:26 -0500300
Jason Monkd5a204f2015-12-21 08:50:01 -0500301 public TileServices getTileServices() {
302 return mServices;
303 }
304
Jason Monk66c89c12016-01-06 08:51:26 -0500305 public StatusBarIconController getIconController() {
306 return mIconController;
307 }
308
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500309 public NightModeController getNightModeController() {
310 return mNightModeController;
Jason Monkf0c6f642016-01-20 22:24:50 -0500311 }
312
Jason Monkc3f42c12016-02-05 12:33:13 -0500313 public ManagedProfileController getManagedProfileController() {
314 return mProfileController;
315 }
316
Jason Monk5e745172015-06-02 19:14:44 -0400317 @Override
318 public void onTuningChanged(String key, String newValue) {
319 if (!TILES_SETTING.equals(key)) {
320 return;
321 }
John Spurlockbceed062014-08-10 18:04:16 -0400322 if (DEBUG) Log.d(TAG, "Recreating tiles");
Jason Monkbbadff82015-11-06 15:47:26 -0500323 final List<String> tileSpecs = loadTileSpecs(mContext, newValue);
Jason Monk1ffa11b2016-03-08 14:44:23 -0500324 int currentUser = ActivityManager.getCurrentUser();
325 if (tileSpecs.equals(mTileSpecs) && currentUser == mCurrentUser) return;
John Spurlockbceed062014-08-10 18:04:16 -0400326 for (Map.Entry<String, QSTile<?>> tile : mTiles.entrySet()) {
327 if (!tileSpecs.contains(tile.getKey())) {
328 if (DEBUG) Log.d(TAG, "Destroying tile: " + tile.getKey());
329 tile.getValue().destroy();
330 }
331 }
332 final LinkedHashMap<String, QSTile<?>> newTiles = new LinkedHashMap<>();
333 for (String tileSpec : tileSpecs) {
Jason Monk1ffa11b2016-03-08 14:44:23 -0500334 QSTile<?> tile = mTiles.get(tileSpec);
335 if (tile != null && (!(tile instanceof CustomTile)
336 || ((CustomTile) tile).getUser() == currentUser)) {
Jason Monkbbadff82015-11-06 15:47:26 -0500337 if (DEBUG) Log.d(TAG, "Adding " + tile);
Jason Monk9d02a432016-01-20 16:33:46 -0500338 tile.removeCallbacks();
Jason Monkbbadff82015-11-06 15:47:26 -0500339 newTiles.put(tileSpec, tile);
John Spurlockbceed062014-08-10 18:04:16 -0400340 } else {
341 if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec);
342 try {
Jason Monk1ffa11b2016-03-08 14:44:23 -0500343 tile = createTile(tileSpec);
Jason Monkc3f42c12016-02-05 12:33:13 -0500344 if (tile != null && tile.isAvailable()) {
Jason Monkba2318e2015-12-08 09:04:23 -0500345 tile.setTileSpec(tileSpec);
346 newTiles.put(tileSpec, tile);
347 }
John Spurlockbceed062014-08-10 18:04:16 -0400348 } catch (Throwable t) {
349 Log.w(TAG, "Error creating tile for spec: " + tileSpec, t);
350 }
351 }
352 }
Jason Monk1ffa11b2016-03-08 14:44:23 -0500353 mCurrentUser = currentUser;
Jason Monk11a77442015-05-12 19:29:02 -0400354 mTileSpecs.clear();
355 mTileSpecs.addAll(tileSpecs);
John Spurlockbceed062014-08-10 18:04:16 -0400356 mTiles.clear();
357 mTiles.putAll(newTiles);
Jason Monkbbadff82015-11-06 15:47:26 -0500358 for (int i = 0; i < mCallbacks.size(); i++) {
359 mCallbacks.get(i).onTilesChanged();
John Spurlockbceed062014-08-10 18:04:16 -0400360 }
361 }
362
Jason Monkbbadff82015-11-06 15:47:26 -0500363 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500364 public void removeTile(String tileSpec) {
365 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
366 specs.remove(tileSpec);
367 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
368 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
369 }
370
Jason Monkc3f42c12016-02-05 12:33:13 -0500371 public void addTile(String spec) {
372 if (mTileSpecs.contains(spec)) {
373 return;
374 }
375 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
376 specs.add(spec);
377 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
378 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
379 }
380
Jason Monk7e53f202016-01-28 10:40:20 -0500381 public void addTile(ComponentName tile) {
382 List<String> newSpecs = new ArrayList<>(mTileSpecs);
383 newSpecs.add(0, CustomTile.toSpec(tile));
384 changeTiles(mTileSpecs, newSpecs);
385 }
386
387 public void removeTile(ComponentName tile) {
388 List<String> newSpecs = new ArrayList<>(mTileSpecs);
389 newSpecs.remove(CustomTile.toSpec(tile));
390 changeTiles(mTileSpecs, newSpecs);
391 }
392
393 public void changeTiles(List<String> previousTiles, List<String> newTiles) {
394 final int NP = previousTiles.size();
395 final int NA = newTiles.size();
396 for (int i = 0; i < NP; i++) {
397 String tileSpec = previousTiles.get(i);
398 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
399 if (!newTiles.contains(tileSpec)) {
400 Intent intent = new Intent().setComponent(
401 CustomTile.getComponentFromSpec(tileSpec));
402 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
403 mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
404 lifecycleManager.onStopListening();
405 lifecycleManager.onTileRemoved();
406 lifecycleManager.flushMessagesAndUnbind();
407 }
408 }
409 for (int i = 0; i < NA; i++) {
410 String tileSpec = newTiles.get(i);
411 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
412 if (!previousTiles.contains(tileSpec)) {
413 Intent intent = new Intent().setComponent(
414 CustomTile.getComponentFromSpec(tileSpec));
415 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
416 mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
417 lifecycleManager.onTileAdded();
418 lifecycleManager.flushMessagesAndUnbind();
419 }
420 }
421 if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles);
422 Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
423 TextUtils.join(",", newTiles), ActivityManager.getCurrentUser());
424 }
425
Jason Monk5db8a412015-10-21 15:16:23 -0700426 public QSTile<?> createTile(String tileSpec) {
Jason Monkc3f42c12016-02-05 12:33:13 -0500427 if (tileSpec.equals("wifi")) return new WifiTile(this);
428 else if (tileSpec.equals("bt")) return new BluetoothTile(this);
429 else if (tileSpec.equals("cell")) return new CellularTile(this);
430 else if (tileSpec.equals("dnd")) return new DndTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400431 else if (tileSpec.equals("inversion")) return new ColorInversionTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400432 else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this);
Rubin Xu1205fb12015-11-04 17:45:03 +0000433 else if (tileSpec.equals("work")) return new WorkModeTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400434 else if (tileSpec.equals("rotation")) return new RotationLockTile(this);
435 else if (tileSpec.equals("flashlight")) return new FlashlightTile(this);
436 else if (tileSpec.equals("location")) return new LocationTile(this);
437 else if (tileSpec.equals("cast")) return new CastTile(this);
438 else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
Jason Monkabe19742015-09-29 09:47:06 -0400439 else if (tileSpec.equals("user")) return new UserTile(this);
440 else if (tileSpec.equals("battery")) return new BatteryTile(this);
Jason Monk9a4ce132016-01-21 15:27:17 -0500441 else if (tileSpec.equals("saver")) return new DataSaverTile(this);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500442 else if (tileSpec.equals(NightModeTile.NIGHT_MODE_SPEC))
443 return new NightModeTile(this);
Jason Monkcaf37622015-08-18 12:33:50 -0400444 // Intent tiles.
John Spurlockbceed062014-08-10 18:04:16 -0400445 else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
Jason Monk5db8a412015-10-21 15:16:23 -0700446 else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec);
Jason Monk2b37190f2016-01-06 10:19:04 -0500447 else {
448 Log.w(TAG, "Bad tile spec: " + tileSpec);
449 return null;
450 }
John Spurlockbceed062014-08-10 18:04:16 -0400451 }
452
Jason Monkbbadff82015-11-06 15:47:26 -0500453 public static List<String> loadTileSpecs(Context context, String tileList) {
454 final Resources res = context.getResources();
John Spurlockbceed062014-08-10 18:04:16 -0400455 final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
John Spurlockbceed062014-08-10 18:04:16 -0400456 if (tileList == null) {
457 tileList = res.getString(R.string.quick_settings_tiles);
458 if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
459 } else {
460 if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList);
461 }
462 final ArrayList<String> tiles = new ArrayList<String>();
463 boolean addedDefault = false;
464 for (String tile : tileList.split(",")) {
465 tile = tile.trim();
466 if (tile.isEmpty()) continue;
467 if (tile.equals("default")) {
468 if (!addedDefault) {
469 tiles.addAll(Arrays.asList(defaultTileList.split(",")));
470 addedDefault = true;
471 }
472 } else {
473 tiles.add(tile);
474 }
475 }
476 return tiles;
477 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400478}