blob: da698d8a95d4976425fa3fae6a81445870cab8ba [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;
Sudheer Shankaad790492016-06-03 10:48:27 -070030import android.os.UserManager;
Jason Monkba2318e2015-12-08 09:04:23 -050031import android.provider.Settings;
Jason Monk7e53f202016-01-28 10:40:20 -050032import android.provider.Settings.Secure;
Jason Monka3453b8b2016-06-17 12:42:59 -040033import android.service.quicksettings.Tile;
Jason Monkba2318e2015-12-08 09:04:23 -050034import android.text.TextUtils;
John Spurlockbceed062014-08-10 18:04:16 -040035import android.util.Log;
Jason Monkca894a02016-01-12 15:30:22 -050036import android.view.View;
Winsonc0d70582016-01-29 10:24:39 -080037
John Spurlockbceed062014-08-10 18:04:16 -040038import com.android.systemui.R;
John Spurlockaf8d6c42014-05-07 17:49:08 -040039import com.android.systemui.qs.QSTile;
Jason Monkd5a204f2015-12-21 08:50:01 -050040import com.android.systemui.qs.external.CustomTile;
Jason Monk7e53f202016-01-28 10:40:20 -050041import com.android.systemui.qs.external.TileLifecycleManager;
Jason Monkd5a204f2015-12-21 08:50:01 -050042import com.android.systemui.qs.external.TileServices;
Jason Monkbbadff82015-11-06 15:47:26 -050043import com.android.systemui.qs.tiles.AirplaneModeTile;
44import com.android.systemui.qs.tiles.BatteryTile;
45import com.android.systemui.qs.tiles.BluetoothTile;
46import com.android.systemui.qs.tiles.CastTile;
47import com.android.systemui.qs.tiles.CellularTile;
48import com.android.systemui.qs.tiles.ColorInversionTile;
Jason Monk9a4ce132016-01-21 15:27:17 -050049import com.android.systemui.qs.tiles.DataSaverTile;
Jason Monkbbadff82015-11-06 15:47:26 -050050import com.android.systemui.qs.tiles.DndTile;
51import com.android.systemui.qs.tiles.FlashlightTile;
52import com.android.systemui.qs.tiles.HotspotTile;
53import com.android.systemui.qs.tiles.IntentTile;
54import com.android.systemui.qs.tiles.LocationTile;
Justin Klaassen13790902016-06-21 20:28:12 -070055import com.android.systemui.qs.tiles.NightDisplayTile;
Jason Monkbbadff82015-11-06 15:47:26 -050056import com.android.systemui.qs.tiles.RotationLockTile;
57import com.android.systemui.qs.tiles.UserTile;
58import com.android.systemui.qs.tiles.WifiTile;
Rubin Xu1205fb12015-11-04 17:45:03 +000059import com.android.systemui.qs.tiles.WorkModeTile;
Jason Monkbbadff82015-11-06 15:47:26 -050060import com.android.systemui.statusbar.policy.BatteryController;
61import com.android.systemui.statusbar.policy.BluetoothController;
62import com.android.systemui.statusbar.policy.CastController;
Jason Monk46dbfb42016-02-25 14:59:20 -050063import com.android.systemui.statusbar.policy.NextAlarmController;
Jason Monkbbadff82015-11-06 15:47:26 -050064import com.android.systemui.statusbar.policy.FlashlightController;
65import com.android.systemui.statusbar.policy.HotspotController;
66import com.android.systemui.statusbar.policy.KeyguardMonitor;
67import com.android.systemui.statusbar.policy.LocationController;
68import com.android.systemui.statusbar.policy.NetworkController;
69import com.android.systemui.statusbar.policy.RotationLockController;
70import com.android.systemui.statusbar.policy.SecurityController;
71import com.android.systemui.statusbar.policy.UserInfoController;
72import com.android.systemui.statusbar.policy.UserSwitcherController;
73import com.android.systemui.statusbar.policy.ZenModeController;
Jason Monk5e745172015-06-02 19:14:44 -040074import com.android.systemui.tuner.TunerService;
75import com.android.systemui.tuner.TunerService.Tunable;
John Spurlockaf8d6c42014-05-07 17:49:08 -040076
77import java.util.ArrayList;
John Spurlockbceed062014-08-10 18:04:16 -040078import java.util.Arrays;
79import java.util.Collection;
80import java.util.LinkedHashMap;
John Spurlockaf8d6c42014-05-07 17:49:08 -040081import java.util.List;
John Spurlockbceed062014-08-10 18:04:16 -040082import java.util.Map;
John Spurlockaf8d6c42014-05-07 17:49:08 -040083
84/** Platform implementation of the quick settings tile host **/
Xiaohui Chen311b98e2016-03-30 11:55:54 -070085public class QSTileHost implements QSTile.Host, Tunable {
John Spurlockbceed062014-08-10 18:04:16 -040086 private static final String TAG = "QSTileHost";
87 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
88
Jason Monkbaade752016-08-25 15:57:14 -040089 public static final String TILES_SETTING = Secure.QS_TILES;
John Spurlockaf8d6c42014-05-07 17:49:08 -040090
91 private final Context mContext;
92 private final PhoneStatusBar mStatusBar;
John Spurlockbceed062014-08-10 18:04:16 -040093 private final LinkedHashMap<String, QSTile<?>> mTiles = new LinkedHashMap<>();
Jason Monk5e745172015-06-02 19:14:44 -040094 protected final ArrayList<String> mTileSpecs = new ArrayList<>();
John Spurlockaf8d6c42014-05-07 17:49:08 -040095 private final BluetoothController mBluetooth;
96 private final LocationController mLocation;
97 private final RotationLockController mRotation;
98 private final NetworkController mNetwork;
99 private final ZenModeController mZen;
Jason Monk51e4dc02014-07-22 12:00:47 -0400100 private final HotspotController mHotspot;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400101 private final CastController mCast;
102 private final Looper mLooper;
Adrian Roosb83777b2014-06-30 15:11:53 +0200103 private final FlashlightController mFlashlight;
Adrian Roos00a0b1f2014-07-16 16:44:49 +0200104 private final UserSwitcherController mUserSwitcherController;
Jason Monkabe19742015-09-29 09:47:06 -0400105 private final UserInfoController mUserInfoController;
John Spurlock657c62c2014-07-22 12:18:09 -0400106 private final KeyguardMonitor mKeyguard;
Jason Monk3d5f5512014-07-25 11:17:28 -0400107 private final SecurityController mSecurity;
Jason Monkabe19742015-09-29 09:47:06 -0400108 private final BatteryController mBattery;
Jason Monk66c89c12016-01-06 08:51:26 -0500109 private final StatusBarIconController mIconController;
Jason Monkd5a204f2015-12-21 08:50:01 -0500110 private final TileServices mServices;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400111
Jason Monkbbadff82015-11-06 15:47:26 -0500112 private final List<Callback> mCallbacks = new ArrayList<>();
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 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 Monk8b54cad2016-04-19 11:38:03 -0400211 public void animateToggleQSExpansion() {
Jason Monkca894a02016-01-12 15:30:22 -0500212 // TODO: Better path to animated panel expansion.
Jason Monkc33f3282016-05-23 14:40:27 -0400213 mHeader.callOnClick();
Jason Monkca894a02016-01-12 15:30:22 -0500214 }
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 Monkc3f42c12016-02-05 12:33:13 -0500308 public ManagedProfileController getManagedProfileController() {
309 return mProfileController;
310 }
311
Jason Monk5e745172015-06-02 19:14:44 -0400312 @Override
313 public void onTuningChanged(String key, String newValue) {
314 if (!TILES_SETTING.equals(key)) {
315 return;
316 }
John Spurlockbceed062014-08-10 18:04:16 -0400317 if (DEBUG) Log.d(TAG, "Recreating tiles");
Sudheer Shankaad790492016-06-03 10:48:27 -0700318 if (newValue == null && UserManager.isDeviceInDemoMode(mContext)) {
319 newValue = mContext.getResources().getString(R.string.quick_settings_tiles_retail_mode);
320 }
Jason Monkbbadff82015-11-06 15:47:26 -0500321 final List<String> tileSpecs = loadTileSpecs(mContext, newValue);
Jason Monk1ffa11b2016-03-08 14:44:23 -0500322 int currentUser = ActivityManager.getCurrentUser();
323 if (tileSpecs.equals(mTileSpecs) && currentUser == mCurrentUser) 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) {
Jason Monk1ffa11b2016-03-08 14:44:23 -0500332 QSTile<?> tile = mTiles.get(tileSpec);
333 if (tile != null && (!(tile instanceof CustomTile)
334 || ((CustomTile) tile).getUser() == currentUser)) {
Jason Monkbbadff82015-11-06 15:47:26 -0500335 if (DEBUG) Log.d(TAG, "Adding " + tile);
Jason Monk9d02a432016-01-20 16:33:46 -0500336 tile.removeCallbacks();
Justin Klaassendd32d902016-07-31 10:25:36 -0700337 if (!(tile instanceof CustomTile) && mCurrentUser != currentUser) {
338 tile.userSwitch(currentUser);
339 }
Jason Monkbbadff82015-11-06 15:47:26 -0500340 newTiles.put(tileSpec, tile);
John Spurlockbceed062014-08-10 18:04:16 -0400341 } else {
342 if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec);
343 try {
Jason Monk1ffa11b2016-03-08 14:44:23 -0500344 tile = createTile(tileSpec);
Jason Monkc3f42c12016-02-05 12:33:13 -0500345 if (tile != null && tile.isAvailable()) {
Jason Monkba2318e2015-12-08 09:04:23 -0500346 tile.setTileSpec(tileSpec);
347 newTiles.put(tileSpec, tile);
348 }
John Spurlockbceed062014-08-10 18:04:16 -0400349 } catch (Throwable t) {
350 Log.w(TAG, "Error creating tile for spec: " + tileSpec, t);
351 }
352 }
353 }
Jason Monk1ffa11b2016-03-08 14:44:23 -0500354 mCurrentUser = currentUser;
Jason Monk11a77442015-05-12 19:29:02 -0400355 mTileSpecs.clear();
356 mTileSpecs.addAll(tileSpecs);
John Spurlockbceed062014-08-10 18:04:16 -0400357 mTiles.clear();
358 mTiles.putAll(newTiles);
Jason Monkbbadff82015-11-06 15:47:26 -0500359 for (int i = 0; i < mCallbacks.size(); i++) {
360 mCallbacks.get(i).onTilesChanged();
John Spurlockbceed062014-08-10 18:04:16 -0400361 }
362 }
363
Jason Monkbbadff82015-11-06 15:47:26 -0500364 @Override
Jason Monkba2318e2015-12-08 09:04:23 -0500365 public void removeTile(String tileSpec) {
366 ArrayList<String> specs = new ArrayList<>(mTileSpecs);
367 specs.remove(tileSpec);
368 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
369 TextUtils.join(",", specs), ActivityManager.getCurrentUser());
370 }
371
Jason Monkc3f42c12016-02-05 12:33:13 -0500372 public void addTile(String spec) {
Ricky Waib96c1eac2016-06-02 11:42:16 +0100373 final String setting = Settings.Secure.getStringForUser(mContext.getContentResolver(),
374 TILES_SETTING, ActivityManager.getCurrentUser());
375 final List<String> tileSpecs = loadTileSpecs(mContext, setting);
376 if (tileSpecs.contains(spec)) {
Jason Monkc3f42c12016-02-05 12:33:13 -0500377 return;
378 }
Ricky Waib96c1eac2016-06-02 11:42:16 +0100379 tileSpecs.add(spec);
Jason Monkc3f42c12016-02-05 12:33:13 -0500380 Settings.Secure.putStringForUser(mContext.getContentResolver(), TILES_SETTING,
Ricky Waib96c1eac2016-06-02 11:42:16 +0100381 TextUtils.join(",", tileSpecs), ActivityManager.getCurrentUser());
Jason Monkc3f42c12016-02-05 12:33:13 -0500382 }
383
Jason Monk7e53f202016-01-28 10:40:20 -0500384 public void addTile(ComponentName tile) {
385 List<String> newSpecs = new ArrayList<>(mTileSpecs);
386 newSpecs.add(0, CustomTile.toSpec(tile));
387 changeTiles(mTileSpecs, newSpecs);
388 }
389
390 public void removeTile(ComponentName tile) {
391 List<String> newSpecs = new ArrayList<>(mTileSpecs);
392 newSpecs.remove(CustomTile.toSpec(tile));
393 changeTiles(mTileSpecs, newSpecs);
394 }
395
396 public void changeTiles(List<String> previousTiles, List<String> newTiles) {
397 final int NP = previousTiles.size();
398 final int NA = newTiles.size();
399 for (int i = 0; i < NP; i++) {
400 String tileSpec = previousTiles.get(i);
401 if (!tileSpec.startsWith(CustomTile.PREFIX)) continue;
402 if (!newTiles.contains(tileSpec)) {
Jason Monka3453b8b2016-06-17 12:42:59 -0400403 ComponentName component = CustomTile.getComponentFromSpec(tileSpec);
404 Intent intent = new Intent().setComponent(component);
Jason Monk7e53f202016-01-28 10:40:20 -0500405 TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(),
Jason Monkee68fd82016-06-23 13:12:23 -0400406 mContext, mServices, new Tile(), intent,
Jason Monka3453b8b2016-06-17 12:42:59 -0400407 new UserHandle(ActivityManager.getCurrentUser()));
Jason Monk7e53f202016-01-28 10:40:20 -0500408 lifecycleManager.onStopListening();
409 lifecycleManager.onTileRemoved();
Jason Monkbaade752016-08-25 15:57:14 -0400410 TileLifecycleManager.setTileAdded(mContext, component, false);
Jason Monk7e53f202016-01-28 10:40:20 -0500411 lifecycleManager.flushMessagesAndUnbind();
412 }
413 }
414 if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles);
415 Secure.putStringForUser(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
416 TextUtils.join(",", newTiles), ActivityManager.getCurrentUser());
417 }
418
Jason Monk5db8a412015-10-21 15:16:23 -0700419 public QSTile<?> createTile(String tileSpec) {
Jason Monkc3f42c12016-02-05 12:33:13 -0500420 if (tileSpec.equals("wifi")) return new WifiTile(this);
421 else if (tileSpec.equals("bt")) return new BluetoothTile(this);
422 else if (tileSpec.equals("cell")) return new CellularTile(this);
423 else if (tileSpec.equals("dnd")) return new DndTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400424 else if (tileSpec.equals("inversion")) return new ColorInversionTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400425 else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this);
Rubin Xu1205fb12015-11-04 17:45:03 +0000426 else if (tileSpec.equals("work")) return new WorkModeTile(this);
John Spurlockbceed062014-08-10 18:04:16 -0400427 else if (tileSpec.equals("rotation")) return new RotationLockTile(this);
428 else if (tileSpec.equals("flashlight")) return new FlashlightTile(this);
429 else if (tileSpec.equals("location")) return new LocationTile(this);
430 else if (tileSpec.equals("cast")) return new CastTile(this);
431 else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
Jason Monkabe19742015-09-29 09:47:06 -0400432 else if (tileSpec.equals("user")) return new UserTile(this);
433 else if (tileSpec.equals("battery")) return new BatteryTile(this);
Jason Monk9a4ce132016-01-21 15:27:17 -0500434 else if (tileSpec.equals("saver")) return new DataSaverTile(this);
Justin Klaassen13790902016-06-21 20:28:12 -0700435 else if (tileSpec.equals("night")) return new NightDisplayTile(this);
Jason Monkcaf37622015-08-18 12:33:50 -0400436 // Intent tiles.
John Spurlockbceed062014-08-10 18:04:16 -0400437 else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);
Jason Monk5db8a412015-10-21 15:16:23 -0700438 else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(this,tileSpec);
Jason Monk2b37190f2016-01-06 10:19:04 -0500439 else {
440 Log.w(TAG, "Bad tile spec: " + tileSpec);
441 return null;
442 }
John Spurlockbceed062014-08-10 18:04:16 -0400443 }
444
Xiaohui Chen311b98e2016-03-30 11:55:54 -0700445 protected List<String> loadTileSpecs(Context context, String tileList) {
Jason Monkbbadff82015-11-06 15:47:26 -0500446 final Resources res = context.getResources();
John Spurlockbceed062014-08-10 18:04:16 -0400447 final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
John Spurlockbceed062014-08-10 18:04:16 -0400448 if (tileList == null) {
449 tileList = res.getString(R.string.quick_settings_tiles);
450 if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
451 } else {
452 if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList);
453 }
454 final ArrayList<String> tiles = new ArrayList<String>();
455 boolean addedDefault = false;
456 for (String tile : tileList.split(",")) {
457 tile = tile.trim();
458 if (tile.isEmpty()) continue;
459 if (tile.equals("default")) {
460 if (!addedDefault) {
461 tiles.addAll(Arrays.asList(defaultTileList.split(",")));
462 addedDefault = true;
463 }
464 } else {
465 tiles.add(tile);
466 }
467 }
468 return tiles;
469 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400470}