blob: 80afb9a3c7058af997bec85f363fa0cc739a62d0 [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 Monk5dbd4aa2016-02-07 13:13:39 -050060import com.android.systemui.statusbar.policy.NightModeController;
Jason Monkbbadff82015-11-06 15:47:26 -050061import com.android.systemui.statusbar.policy.FlashlightController;
62import com.android.systemui.statusbar.policy.HotspotController;
63import com.android.systemui.statusbar.policy.KeyguardMonitor;
64import com.android.systemui.statusbar.policy.LocationController;
65import com.android.systemui.statusbar.policy.NetworkController;
66import com.android.systemui.statusbar.policy.RotationLockController;
67import com.android.systemui.statusbar.policy.SecurityController;
68import com.android.systemui.statusbar.policy.UserInfoController;
69import com.android.systemui.statusbar.policy.UserSwitcherController;
70import com.android.systemui.statusbar.policy.ZenModeController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -050071import com.android.systemui.tuner.NightModeTile;
Jason Monk5e745172015-06-02 19:14:44 -040072import com.android.systemui.tuner.TunerService;
73import com.android.systemui.tuner.TunerService.Tunable;
John Spurlockaf8d6c42014-05-07 17:49:08 -040074
75import java.util.ArrayList;
John Spurlockbceed062014-08-10 18:04:16 -040076import java.util.Arrays;
77import java.util.Collection;
78import java.util.LinkedHashMap;
John Spurlockaf8d6c42014-05-07 17:49:08 -040079import java.util.List;
John Spurlockbceed062014-08-10 18:04:16 -040080import java.util.Map;
John Spurlockaf8d6c42014-05-07 17:49:08 -040081
82/** Platform implementation of the quick settings tile host **/
Jason Monkd5a204f2015-12-21 08:50:01 -050083public final class QSTileHost implements QSTile.Host, Tunable {
John Spurlockbceed062014-08-10 18:04:16 -040084 private static final String TAG = "QSTileHost";
85 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
86
Jason Monkcaf37622015-08-18 12:33:50 -040087 public static final String TILES_SETTING = "sysui_qs_tiles";
John Spurlockaf8d6c42014-05-07 17:49:08 -040088
89 private final Context mContext;
90 private final PhoneStatusBar mStatusBar;
John Spurlockbceed062014-08-10 18:04:16 -040091 private final LinkedHashMap<String, QSTile<?>> mTiles = new LinkedHashMap<>();
Jason Monk5e745172015-06-02 19:14:44 -040092 protected final ArrayList<String> mTileSpecs = new ArrayList<>();
John Spurlockaf8d6c42014-05-07 17:49:08 -040093 private final BluetoothController mBluetooth;
94 private final LocationController mLocation;
95 private final RotationLockController mRotation;
96 private final NetworkController mNetwork;
97 private final ZenModeController mZen;
Jason Monk51e4dc02014-07-22 12:00:47 -040098 private final HotspotController mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -040099 private final CastController mCast;
100 private final Looper mLooper;
Adrian Roosb83777b2014-06-30 15:11:53 +0200101 private final FlashlightController mFlashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200102 private final UserSwitcherController mUserSwitcherController;
Jason Monkabe19742015-09-29 09:47:06 -0400103 private final UserInfoController mUserInfoController;
John Spurlock657c62c2014-07-22 12:18:09 -0400104 private final KeyguardMonitor mKeyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400105 private final SecurityController mSecurity;
Jason Monkabe19742015-09-29 09:47:06 -0400106 private final BatteryController mBattery;
Jason Monk66c89c12016-01-06 08:51:26 -0500107 private final StatusBarIconController mIconController;
Jason Monkd5a204f2015-12-21 08:50:01 -0500108 private final TileServices mServices;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400109
Jason Monkbbadff82015-11-06 15:47:26 -0500110 private final List<Callback> mCallbacks = new ArrayList<>();
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500111 private final NightModeController mNightModeController;
Jason Monkc3f42c12016-02-05 12:33:13 -0500112 private final AutoTileManager mAutoTiles;
113 private final ManagedProfileController mProfileController;
Jason Monkca894a02016-01-12 15:30:22 -0500114 private View mHeader;
John Spurlockbceed062014-08-10 18:04:16 -0400115
John Spurlockaf8d6c42014-05-07 17:49:08 -0400116 public QSTileHost(Context context, PhoneStatusBar statusBar,
Jason Monk66c89c12016-01-06 08:51:26 -0500117 BluetoothController bluetooth, LocationController location,
118 RotationLockController rotation, NetworkController network,
119 ZenModeController zen, HotspotController hotspot,
120 CastController cast, FlashlightController flashlight,
121 UserSwitcherController userSwitcher, UserInfoController userInfo,
122 KeyguardMonitor keyguard, SecurityController security,
123 BatteryController battery, StatusBarIconController iconController) {
John Spurlockaf8d6c42014-05-07 17:49:08 -0400124 mContext = context;
125 mStatusBar = statusBar;
126 mBluetooth = bluetooth;
127 mLocation = location;
128 mRotation = rotation;
129 mNetwork = network;
130 mZen = zen;
Jason Monk51e4dc02014-07-22 12:00:47 -0400131 mHotspot = hotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400132 mCast = cast;
Adrian Roosb83777b2014-06-30 15:11:53 +0200133 mFlashlight = flashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200134 mUserSwitcherController = userSwitcher;
Jason Monkabe19742015-09-29 09:47:06 -0400135 mUserInfoController = userInfo;
John Spurlock657c62c2014-07-22 12:18:09 -0400136 mKeyguard = keyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400137 mSecurity = security;
Jason Monkabe19742015-09-29 09:47:06 -0400138 mBattery = battery;
Jason Monk66c89c12016-01-06 08:51:26 -0500139 mIconController = iconController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500140 mNightModeController = new NightModeController(mContext, true);
Jason Monkc3f42c12016-02-05 12:33:13 -0500141 mProfileController = new ManagedProfileController(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400142
Jorim Jaggi1ecd7cd2014-11-03 16:18:03 +0100143 final HandlerThread ht = new HandlerThread(QSTileHost.class.getSimpleName(),
144 Process.THREAD_PRIORITY_BACKGROUND);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400145 ht.start();
146 mLooper = ht.getLooper();
147
Jason Monkd5a204f2015-12-21 08:50:01 -0500148 mServices = new TileServices(this, mLooper);
149
Jason Monk5e745172015-06-02 19:14:44 -0400150 TunerService.get(mContext).addTunable(this, TILES_SETTING);
Rubin Xucedcd282016-02-15 14:44:44 +0000151 // AutoTileManager can modify mTiles so make sure mTiles has already been initialized.
152 mAutoTiles = new AutoTileManager(context, this);
Jason Monk5e745172015-06-02 19:14:44 -0400153 }
John Spurlockbceed062014-08-10 18:04:16 -0400154
Jason Monkca894a02016-01-12 15:30:22 -0500155 public void setHeaderView(View view) {
156 mHeader = view;
157 }
158
Jason Monkdeba7a42015-12-08 16:14:10 -0500159 public PhoneStatusBar getPhoneStatusBar() {
Jason Monkc34befb2015-10-07 16:40:02 -0400160 return mStatusBar;
161 }
162
Jason Monk5e745172015-06-02 19:14:44 -0400163 public void destroy() {
Jason Monkc3f42c12016-02-05 12:33:13 -0500164 mAutoTiles.destroy();
Jason Monk5e745172015-06-02 19:14:44 -0400165 TunerService.get(mContext).removeTunable(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400166 }
167
168 @Override
Jason Monkbbadff82015-11-06 15:47:26 -0500169 public void addCallback(Callback callback) {
170 mCallbacks.add(callback);
John Spurlockbceed062014-08-10 18:04:16 -0400171 }
172
173 @Override
174 public Collection<QSTile<?>> getTiles() {
175 return mTiles.values();
John Spurlockaf8d6c42014-05-07 17:49:08 -0400176 }
177
178 @Override
Jason Monkee43cdf2015-06-19 14:20:46 -0400179 public void startActivityDismissingKeyguard(final Intent intent) {
180 mStatusBar.postStartActivityDismissingKeyguard(intent, 0);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400181 }
182
183 @Override
Adrian Roos62692b22015-09-11 17:46:23 -0700184 public void startActivityDismissingKeyguard(PendingIntent intent) {
185 mStatusBar.postStartActivityDismissingKeyguard(intent);
186 }
187
188 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500189 public void startRunnableDismissingKeyguard(Runnable runnable) {
190 mStatusBar.postQSRunnableDismissingKeyguard(runnable);
191 }
192
193 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400194 public void warn(String message, Throwable t) {
195 // already logged
196 }
197
Jason Monkca894a02016-01-12 15:30:22 -0500198 public void animateExpandQS() {
199 // TODO: Better path to animated panel expansion.
200 mHeader.performClick();
201 }
202
John Spurlockaf8d6c42014-05-07 17:49:08 -0400203 @Override
204 public void collapsePanels() {
205 mStatusBar.postAnimateCollapsePanels();
206 }
207
208 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500209 public void openPanels() {
210 mStatusBar.postAnimateOpenPanels();
211 }
212
213 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400214 public Looper getLooper() {
215 return mLooper;
216 }
217
218 @Override
219 public Context getContext() {
220 return mContext;
221 }
222
223 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400224 public BluetoothController getBluetoothController() {
225 return mBluetooth;
226 }
227
228 @Override
229 public LocationController getLocationController() {
230 return mLocation;
231 }
232
233 @Override
234 public RotationLockController getRotationLockController() {
235 return mRotation;
236 }
237
238 @Override
239 public NetworkController getNetworkController() {
240 return mNetwork;
241 }
242
243 @Override
244 public ZenModeController getZenModeController() {
245 return mZen;
246 }
247
248 @Override
Jason Monk51e4dc02014-07-22 12:00:47 -0400249 public HotspotController getHotspotController() {
250 return mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400251 }
252
253 @Override
254 public CastController getCastController() {
255 return mCast;
256 }
John Spurlock86005342014-05-23 11:58:00 -0400257
258 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400259 public FlashlightController getFlashlightController() {
260 return mFlashlight;
John Spurlock86005342014-05-23 11:58:00 -0400261 }
Adrian Roosb83777b2014-06-30 15:11:53 +0200262
263 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400264 public KeyguardMonitor getKeyguardMonitor() {
265 return mKeyguard;
Adrian Roosb83777b2014-06-30 15:11:53 +0200266 }
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200267
Jason Monkabe19742015-09-29 09:47:06 -0400268 @Override
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200269 public UserSwitcherController getUserSwitcherController() {
270 return mUserSwitcherController;
271 }
Jason Monk3d5f5512014-07-25 11:17:28 -0400272
Jason Monkabe19742015-09-29 09:47:06 -0400273 @Override
274 public UserInfoController getUserInfoController() {
275 return mUserInfoController;
276 }
277
278 @Override
279 public BatteryController getBatteryController() {
280 return mBattery;
281 }
282
Jason Monk3d5f5512014-07-25 11:17:28 -0400283 public SecurityController getSecurityController() {
284 return mSecurity;
285 }
Jason Monkbbadff82015-11-06 15:47:26 -0500286
Jason Monkd5a204f2015-12-21 08:50:01 -0500287 public TileServices getTileServices() {
288 return mServices;
289 }
290
Jason Monk66c89c12016-01-06 08:51:26 -0500291 public StatusBarIconController getIconController() {
292 return mIconController;
293 }
294
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500295 public NightModeController getNightModeController() {
296 return mNightModeController;
Jason Monkf0c6f642016-01-20 22:24:50 -0500297 }
298
Jason Monkc3f42c12016-02-05 12:33:13 -0500299 public ManagedProfileController getManagedProfileController() {
300 return mProfileController;
301 }
302
Jason Monk5e745172015-06-02 19:14:44 -0400303 @Override
304 public void onTuningChanged(String key, String newValue) {
305 if (!TILES_SETTING.equals(key)) {
306 return;
307 }
John Spurlockbceed062014-08-10 18:04:16 -0400308 if (DEBUG) Log.d(TAG, "Recreating tiles");
Jason Monkbbadff82015-11-06 15:47:26 -0500309 final List<String> tileSpecs = loadTileSpecs(mContext, newValue);
Jason Monk11a77442015-05-12 19:29:02 -0400310 if (tileSpecs.equals(mTileSpecs)) return;
John Spurlockbceed062014-08-10 18:04:16 -0400311 for (Map.Entry<String, QSTile<?>> tile : mTiles.entrySet()) {
312 if (!tileSpecs.contains(tile.getKey())) {
313 if (DEBUG) Log.d(TAG, "Destroying tile: " + tile.getKey());
314 tile.getValue().destroy();
315 }
316 }
317 final LinkedHashMap<String, QSTile<?>> newTiles = new LinkedHashMap<>();
318 for (String tileSpec : tileSpecs) {
319 if (mTiles.containsKey(tileSpec)) {
Jason Monkbbadff82015-11-06 15:47:26 -0500320 QSTile<?> tile = mTiles.get(tileSpec);
321 if (DEBUG) Log.d(TAG, "Adding " + tile);
Jason Monk9d02a432016-01-20 16:33:46 -0500322 tile.removeCallbacks();
Jason Monkbbadff82015-11-06 15:47:26 -0500323 newTiles.put(tileSpec, tile);
John Spurlockbceed062014-08-10 18:04:16 -0400324 } else {
325 if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec);
326 try {
Jason Monkbbadff82015-11-06 15:47:26 -0500327 QSTile<?> tile = createTile(tileSpec);
Jason Monkc3f42c12016-02-05 12:33:13 -0500328 if (tile != null && tile.isAvailable()) {
Jason Monkba2318e2015-12-08 09:04:23 -0500329 tile.setTileSpec(tileSpec);
330 newTiles.put(tileSpec, tile);
331 }
John Spurlockbceed062014-08-10 18:04:16 -0400332 } catch (Throwable t) {
333 Log.w(TAG, "Error creating tile for spec: " + tileSpec, t);
334 }
335 }
336 }
Jason Monk11a77442015-05-12 19:29:02 -0400337 mTileSpecs.clear();
338 mTileSpecs.addAll(tileSpecs);
John Spurlockbceed062014-08-10 18:04:16 -0400339 mTiles.clear();
340 mTiles.putAll(newTiles);
Jason Monkbbadff82015-11-06 15:47:26 -0500341 for (int i = 0; i < mCallbacks.size(); i++) {
342 mCallbacks.get(i).onTilesChanged();
John Spurlockbceed062014-08-10 18:04:16 -0400343 }
344 }
345
Jason Monkbbadff82015-11-06 15:47:26 -0500346 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500347 public void removeTile(String tileSpec) {
348 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
349 specs.remove(tileSpec);
350 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
351 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
352 }
353
Jason Monkc3f42c12016-02-05 12:33:13 -0500354 public void addTile(String spec) {
355 if (mTileSpecs.contains(spec)) {
356 return;
357 }
358 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
359 specs.add(spec);
360 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
361 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
362 }
363
Jason Monk7e53f202016-01-28 10:40:20 -0500364 public void addTile(ComponentName tile) {
365 List<String> newSpecs = new ArrayList<>(mTileSpecs);
366 newSpecs.add(0, CustomTile.toSpec(tile));
367 changeTiles(mTileSpecs, newSpecs);
368 }
369
370 public void removeTile(ComponentName tile) {
371 List<String> newSpecs = new ArrayList<>(mTileSpecs);
372 newSpecs.remove(CustomTile.toSpec(tile));
373 changeTiles(mTileSpecs, newSpecs);
374 }
375
376 public void changeTiles(List<String> previousTiles, List<String> newTiles) {
377 final int NP = previousTiles.size();
378 final int NA = newTiles.size();
379 for (int i = 0; i < NP; i++) {
380 String tileSpec = previousTiles.get(i);
381 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
382 if (!newTiles.contains(tileSpec)) {
383 Intent intent = new Intent().setComponent(
384 CustomTile.getComponentFromSpec(tileSpec));
385 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
386 mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
387 lifecycleManager.onStopListening();
388 lifecycleManager.onTileRemoved();
389 lifecycleManager.flushMessagesAndUnbind();
390 }
391 }
392 for (int i = 0; i < NA; i++) {
393 String tileSpec = newTiles.get(i);
394 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
395 if (!previousTiles.contains(tileSpec)) {
396 Intent intent = new Intent().setComponent(
397 CustomTile.getComponentFromSpec(tileSpec));
398 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
399 mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
400 lifecycleManager.onTileAdded();
401 lifecycleManager.flushMessagesAndUnbind();
402 }
403 }
404 if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles);
405 Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
406 TextUtils.join(",", newTiles), ActivityManager.getCurrentUser());
407 }
408
Jason Monk5db8a412015-10-21 15:16:23 -0700409 public QSTile<?> createTile(String tileSpec) {
Jason Monkc3f42c12016-02-05 12:33:13 -0500410 if (tileSpec.equals("wifi")) return new WifiTile(this);
411 else if (tileSpec.equals("bt")) return new BluetoothTile(this);
412 else if (tileSpec.equals("cell")) return new CellularTile(this);
413 else if (tileSpec.equals("dnd")) return new DndTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400414 else if (tileSpec.equals("inversion")) return new ColorInversionTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400415 else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this);
Rubin Xu1205fb12015-11-04 17:45:03 +0000416 else if (tileSpec.equals("work")) return new WorkModeTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400417 else if (tileSpec.equals("rotation")) return new RotationLockTile(this);
418 else if (tileSpec.equals("flashlight")) return new FlashlightTile(this);
419 else if (tileSpec.equals("location")) return new LocationTile(this);
420 else if (tileSpec.equals("cast")) return new CastTile(this);
421 else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
Jason Monkabe19742015-09-29 09:47:06 -0400422 else if (tileSpec.equals("user")) return new UserTile(this);
423 else if (tileSpec.equals("battery")) return new BatteryTile(this);
Jason Monk9a4ce132016-01-21 15:27:17 -0500424 else if (tileSpec.equals("saver")) return new DataSaverTile(this);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500425 else if (tileSpec.equals(NightModeTile.NIGHT_MODE_SPEC))
426 return new NightModeTile(this);
Jason Monkcaf37622015-08-18 12:33:50 -0400427 // Intent tiles.
John Spurlockbceed062014-08-10 18:04:16 -0400428 else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
Jason Monk5db8a412015-10-21 15:16:23 -0700429 else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec);
Jason Monk2b37190f2016-01-06 10:19:04 -0500430 else {
431 Log.w(TAG, "Bad tile spec: " + tileSpec);
432 return null;
433 }
John Spurlockbceed062014-08-10 18:04:16 -0400434 }
435
Jason Monkbbadff82015-11-06 15:47:26 -0500436 public static List<String> loadTileSpecs(Context context, String tileList) {
437 final Resources res = context.getResources();
John Spurlockbceed062014-08-10 18:04:16 -0400438 final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
John Spurlockbceed062014-08-10 18:04:16 -0400439 if (tileList == null) {
440 tileList = res.getString(R.string.quick_settings_tiles);
441 if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
442 } else {
443 if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList);
444 }
445 final ArrayList<String> tiles = new ArrayList<String>();
446 boolean addedDefault = false;
447 for (String tile : tileList.split(",")) {
448 tile = tile.trim();
449 if (tile.isEmpty()) continue;
450 if (tile.equals("default")) {
451 if (!addedDefault) {
452 tiles.addAll(Arrays.asList(defaultTileList.split(",")));
453 addedDefault = true;
454 }
455 } else {
456 tiles.add(tile);
457 }
458 }
459 return tiles;
460 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400461}