blob: f894a22d4acbc6199feaa44e236e20ef57ac95f0 [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;
John Spurlockbceed062014-08-10 18:04:16 -0400117
John Spurlockaf8d6c42014-05-07 17:49:08 -0400118 public QSTileHost(Context context, PhoneStatusBar statusBar,
Jason Monk46dbfb42016-02-25 14:59:20 -0500119 BluetoothController bluetooth, LocationController location,
120 RotationLockController rotation, NetworkController network,
121 ZenModeController zen, HotspotController hotspot,
122 CastController cast, FlashlightController flashlight,
123 UserSwitcherController userSwitcher, UserInfoController userInfo,
124 KeyguardMonitor keyguard, SecurityController security,
125 BatteryController battery, StatusBarIconController iconController,
126 NextAlarmController nextAlarmController) {
John Spurlockaf8d6c42014-05-07 17:49:08 -0400127 mContext = context;
128 mStatusBar = statusBar;
129 mBluetooth = bluetooth;
130 mLocation = location;
131 mRotation = rotation;
132 mNetwork = network;
133 mZen = zen;
Jason Monk51e4dc02014-07-22 12:00:47 -0400134 mHotspot = hotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400135 mCast = cast;
Adrian Roosb83777b2014-06-30 15:11:53 +0200136 mFlashlight = flashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200137 mUserSwitcherController = userSwitcher;
Jason Monkabe19742015-09-29 09:47:06 -0400138 mUserInfoController = userInfo;
John Spurlock657c62c2014-07-22 12:18:09 -0400139 mKeyguard = keyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400140 mSecurity = security;
Jason Monkabe19742015-09-29 09:47:06 -0400141 mBattery = battery;
Jason Monk66c89c12016-01-06 08:51:26 -0500142 mIconController = iconController;
Jason Monk46dbfb42016-02-25 14:59:20 -0500143 mNextAlarmController = nextAlarmController;
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500144 mNightModeController = new NightModeController(mContext, true);
Jason Monkc3f42c12016-02-05 12:33:13 -0500145 mProfileController = new ManagedProfileController(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400146
Jorim Jaggi1ecd7cd2014-11-03 16:18:03 +0100147 final HandlerThread ht = new HandlerThread(QSTileHost.class.getSimpleName(),
148 Process.THREAD_PRIORITY_BACKGROUND);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400149 ht.start();
150 mLooper = ht.getLooper();
151
Jason Monkd5a204f2015-12-21 08:50:01 -0500152 mServices = new TileServices(this, mLooper);
153
Jason Monk5e745172015-06-02 19:14:44 -0400154 TunerService.get(mContext).addTunable(this, TILES_SETTING);
Rubin Xucedcd282016-02-15 14:44:44 +0000155 // AutoTileManager can modify mTiles so make sure mTiles has already been initialized.
156 mAutoTiles = new AutoTileManager(context, this);
Jason Monk5e745172015-06-02 19:14:44 -0400157 }
John Spurlockbceed062014-08-10 18:04:16 -0400158
Jason Monk46dbfb42016-02-25 14:59:20 -0500159 public NextAlarmController getNextAlarmController() {
160 return mNextAlarmController;
161 }
162
Jason Monkca894a02016-01-12 15:30:22 -0500163 public void setHeaderView(View view) {
164 mHeader = view;
165 }
166
Jason Monkdeba7a42015-12-08 16:14:10 -0500167 public PhoneStatusBar getPhoneStatusBar() {
Jason Monkc34befb2015-10-07 16:40:02 -0400168 return mStatusBar;
169 }
170
Jason Monk5e745172015-06-02 19:14:44 -0400171 public void destroy() {
Jason Monkc3f42c12016-02-05 12:33:13 -0500172 mAutoTiles.destroy();
Jason Monk5e745172015-06-02 19:14:44 -0400173 TunerService.get(mContext).removeTunable(this);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400174 }
175
176 @Override
Jason Monkbbadff82015-11-06 15:47:26 -0500177 public void addCallback(Callback callback) {
178 mCallbacks.add(callback);
John Spurlockbceed062014-08-10 18:04:16 -0400179 }
180
181 @Override
Jason Monk46dbfb42016-02-25 14:59:20 -0500182 public void removeCallback(Callback callback) {
183 mCallbacks.remove(callback);
184 }
185
186 @Override
John Spurlockbceed062014-08-10 18:04:16 -0400187 public Collection<QSTile<?>> getTiles() {
188 return mTiles.values();
John Spurlockaf8d6c42014-05-07 17:49:08 -0400189 }
190
191 @Override
Jason Monkee43cdf2015-06-19 14:20:46 -0400192 public void startActivityDismissingKeyguard(final Intent intent) {
193 mStatusBar.postStartActivityDismissingKeyguard(intent, 0);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400194 }
195
196 @Override
Adrian Roos62692b22015-09-11 17:46:23 -0700197 public void startActivityDismissingKeyguard(PendingIntent intent) {
198 mStatusBar.postStartActivityDismissingKeyguard(intent);
199 }
200
201 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500202 public void startRunnableDismissingKeyguard(Runnable runnable) {
203 mStatusBar.postQSRunnableDismissingKeyguard(runnable);
204 }
205
206 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400207 public void warn(String message, Throwable t) {
208 // already logged
209 }
210
Jason Monkca894a02016-01-12 15:30:22 -0500211 public void animateExpandQS() {
212 // TODO: Better path to animated panel expansion.
213 mHeader.performClick();
214 }
215
John Spurlockaf8d6c42014-05-07 17:49:08 -0400216 @Override
217 public void collapsePanels() {
218 mStatusBar.postAnimateCollapsePanels();
219 }
220
221 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500222 public void openPanels() {
223 mStatusBar.postAnimateOpenPanels();
224 }
225
226 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400227 public Looper getLooper() {
228 return mLooper;
229 }
230
231 @Override
232 public Context getContext() {
233 return mContext;
234 }
235
236 @Override
John Spurlockaf8d6c42014-05-07 17:49:08 -0400237 public BluetoothController getBluetoothController() {
238 return mBluetooth;
239 }
240
241 @Override
242 public LocationController getLocationController() {
243 return mLocation;
244 }
245
246 @Override
247 public RotationLockController getRotationLockController() {
248 return mRotation;
249 }
250
251 @Override
252 public NetworkController getNetworkController() {
253 return mNetwork;
254 }
255
256 @Override
257 public ZenModeController getZenModeController() {
258 return mZen;
259 }
260
261 @Override
Jason Monk51e4dc02014-07-22 12:00:47 -0400262 public HotspotController getHotspotController() {
263 return mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400264 }
265
266 @Override
267 public CastController getCastController() {
268 return mCast;
269 }
John Spurlock86005342014-05-23 11:58:00 -0400270
271 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400272 public FlashlightController getFlashlightController() {
273 return mFlashlight;
John Spurlock86005342014-05-23 11:58:00 -0400274 }
Adrian Roosb83777b2014-06-30 15:11:53 +0200275
276 @Override
John Spurlock657c62c2014-07-22 12:18:09 -0400277 public KeyguardMonitor getKeyguardMonitor() {
278 return mKeyguard;
Adrian Roosb83777b2014-06-30 15:11:53 +0200279 }
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200280
Jason Monkabe19742015-09-29 09:47:06 -0400281 @Override
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200282 public UserSwitcherController getUserSwitcherController() {
283 return mUserSwitcherController;
284 }
Jason Monk3d5f5512014-07-25 11:17:28 -0400285
Jason Monkabe19742015-09-29 09:47:06 -0400286 @Override
287 public UserInfoController getUserInfoController() {
288 return mUserInfoController;
289 }
290
291 @Override
292 public BatteryController getBatteryController() {
293 return mBattery;
294 }
295
Jason Monk3d5f5512014-07-25 11:17:28 -0400296 public SecurityController getSecurityController() {
297 return mSecurity;
298 }
Jason Monkbbadff82015-11-06 15:47:26 -0500299
Jason Monkd5a204f2015-12-21 08:50:01 -0500300 public TileServices getTileServices() {
301 return mServices;
302 }
303
Jason Monk66c89c12016-01-06 08:51:26 -0500304 public StatusBarIconController getIconController() {
305 return mIconController;
306 }
307
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500308 public NightModeController getNightModeController() {
309 return mNightModeController;
Jason Monkf0c6f642016-01-20 22:24:50 -0500310 }
311
Jason Monkc3f42c12016-02-05 12:33:13 -0500312 public ManagedProfileController getManagedProfileController() {
313 return mProfileController;
314 }
315
Jason Monk5e745172015-06-02 19:14:44 -0400316 @Override
317 public void onTuningChanged(String key, String newValue) {
318 if (!TILES_SETTING.equals(key)) {
319 return;
320 }
John Spurlockbceed062014-08-10 18:04:16 -0400321 if (DEBUG) Log.d(TAG, "Recreating tiles");
Jason Monkbbadff82015-11-06 15:47:26 -0500322 final List<String> tileSpecs = loadTileSpecs(mContext, newValue);
Jason Monk11a77442015-05-12 19:29:02 -0400323 if (tileSpecs.equals(mTileSpecs)) return;
John Spurlockbceed062014-08-10 18:04:16 -0400324 for (Map.Entry<String, QSTile<?>> tile : mTiles.entrySet()) {
325 if (!tileSpecs.contains(tile.getKey())) {
326 if (DEBUG) Log.d(TAG, "Destroying tile: " + tile.getKey());
327 tile.getValue().destroy();
328 }
329 }
330 final LinkedHashMap<String, QSTile<?>> newTiles = new LinkedHashMap<>();
331 for (String tileSpec : tileSpecs) {
332 if (mTiles.containsKey(tileSpec)) {
Jason Monkbbadff82015-11-06 15:47:26 -0500333 QSTile<?> tile = mTiles.get(tileSpec);
334 if (DEBUG) Log.d(TAG, "Adding " + tile);
Jason Monk9d02a432016-01-20 16:33:46 -0500335 tile.removeCallbacks();
Jason Monkbbadff82015-11-06 15:47:26 -0500336 newTiles.put(tileSpec, tile);
John Spurlockbceed062014-08-10 18:04:16 -0400337 } else {
338 if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec);
339 try {
Jason Monkbbadff82015-11-06 15:47:26 -0500340 QSTile<?> tile = createTile(tileSpec);
Jason Monkc3f42c12016-02-05 12:33:13 -0500341 if (tile != null && tile.isAvailable()) {
Jason Monkba2318e2015-12-08 09:04:23 -0500342 tile.setTileSpec(tileSpec);
343 newTiles.put(tileSpec, tile);
344 }
John Spurlockbceed062014-08-10 18:04:16 -0400345 } catch (Throwable t) {
346 Log.w(TAG, "Error creating tile for spec: " + tileSpec, t);
347 }
348 }
349 }
Jason Monk11a77442015-05-12 19:29:02 -0400350 mTileSpecs.clear();
351 mTileSpecs.addAll(tileSpecs);
John Spurlockbceed062014-08-10 18:04:16 -0400352 mTiles.clear();
353 mTiles.putAll(newTiles);
Jason Monkbbadff82015-11-06 15:47:26 -0500354 for (int i = 0; i < mCallbacks.size(); i++) {
355 mCallbacks.get(i).onTilesChanged();
John Spurlockbceed062014-08-10 18:04:16 -0400356 }
357 }
358
Jason Monkbbadff82015-11-06 15:47:26 -0500359 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500360 public void removeTile(String tileSpec) {
361 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
362 specs.remove(tileSpec);
363 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
364 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
365 }
366
Jason Monkc3f42c12016-02-05 12:33:13 -0500367 public void addTile(String spec) {
368 if (mTileSpecs.contains(spec)) {
369 return;
370 }
371 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
372 specs.add(spec);
373 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
374 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
375 }
376
Jason Monk7e53f202016-01-28 10:40:20 -0500377 public void addTile(ComponentName tile) {
378 List<String> newSpecs = new ArrayList<>(mTileSpecs);
379 newSpecs.add(0, CustomTile.toSpec(tile));
380 changeTiles(mTileSpecs, newSpecs);
381 }
382
383 public void removeTile(ComponentName tile) {
384 List<String> newSpecs = new ArrayList<>(mTileSpecs);
385 newSpecs.remove(CustomTile.toSpec(tile));
386 changeTiles(mTileSpecs, newSpecs);
387 }
388
389 public void changeTiles(List<String> previousTiles, List<String> newTiles) {
390 final int NP = previousTiles.size();
391 final int NA = newTiles.size();
392 for (int i = 0; i < NP; i++) {
393 String tileSpec = previousTiles.get(i);
394 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
395 if (!newTiles.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.onStopListening();
401 lifecycleManager.onTileRemoved();
402 lifecycleManager.flushMessagesAndUnbind();
403 }
404 }
405 for (int i = 0; i < NA; i++) {
406 String tileSpec = newTiles.get(i);
407 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
408 if (!previousTiles.contains(tileSpec)) {
409 Intent intent = new Intent().setComponent(
410 CustomTile.getComponentFromSpec(tileSpec));
411 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
412 mContext, intent, new UserHandle(ActivityManager.getCurrentUser()));
413 lifecycleManager.onTileAdded();
414 lifecycleManager.flushMessagesAndUnbind();
415 }
416 }
417 if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles);
418 Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
419 TextUtils.join(",", newTiles), ActivityManager.getCurrentUser());
420 }
421
Jason Monk5db8a412015-10-21 15:16:23 -0700422 public QSTile<?> createTile(String tileSpec) {
Jason Monkc3f42c12016-02-05 12:33:13 -0500423 if (tileSpec.equals("wifi")) return new WifiTile(this);
424 else if (tileSpec.equals("bt")) return new BluetoothTile(this);
425 else if (tileSpec.equals("cell")) return new CellularTile(this);
426 else if (tileSpec.equals("dnd")) return new DndTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400427 else if (tileSpec.equals("inversion")) return new ColorInversionTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400428 else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this);
Rubin Xu1205fb12015-11-04 17:45:03 +0000429 else if (tileSpec.equals("work")) return new WorkModeTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400430 else if (tileSpec.equals("rotation")) return new RotationLockTile(this);
431 else if (tileSpec.equals("flashlight")) return new FlashlightTile(this);
432 else if (tileSpec.equals("location")) return new LocationTile(this);
433 else if (tileSpec.equals("cast")) return new CastTile(this);
434 else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
Jason Monkabe19742015-09-29 09:47:06 -0400435 else if (tileSpec.equals("user")) return new UserTile(this);
436 else if (tileSpec.equals("battery")) return new BatteryTile(this);
Jason Monk9a4ce132016-01-21 15:27:17 -0500437 else if (tileSpec.equals("saver")) return new DataSaverTile(this);
Jason Monk5dbd4aa2016-02-07 13:13:39 -0500438 else if (tileSpec.equals(NightModeTile.NIGHT_MODE_SPEC))
439 return new NightModeTile(this);
Jason Monkcaf37622015-08-18 12:33:50 -0400440 // Intent tiles.
John Spurlockbceed062014-08-10 18:04:16 -0400441 else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
Jason Monk5db8a412015-10-21 15:16:23 -0700442 else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec);
Jason Monk2b37190f2016-01-06 10:19:04 -0500443 else {
444 Log.w(TAG, "Bad tile spec: " + tileSpec);
445 return null;
446 }
John Spurlockbceed062014-08-10 18:04:16 -0400447 }
448
Jason Monkbbadff82015-11-06 15:47:26 -0500449 public static List<String> loadTileSpecs(Context context, String tileList) {
450 final Resources res = context.getResources();
John Spurlockbceed062014-08-10 18:04:16 -0400451 final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
John Spurlockbceed062014-08-10 18:04:16 -0400452 if (tileList == null) {
453 tileList = res.getString(R.string.quick_settings_tiles);
454 if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
455 } else {
456 if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList);
457 }
458 final ArrayList<String> tiles = new ArrayList<String>();
459 boolean addedDefault = false;
460 for (String tile : tileList.split(",")) {
461 tile = tile.trim();
462 if (tile.isEmpty()) continue;
463 if (tile.equals("default")) {
464 if (!addedDefault) {
465 tiles.addAll(Arrays.asList(defaultTileList.split(",")));
466 addedDefault = true;
467 }
468 } else {
469 tiles.add(tile);
470 }
471 }
472 return tiles;
473 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400474}