blob: a9c5c79b7d0c013b5c26897ad03d21d87d37edf5 [file] [log] [blame]
Winson Chungd63c59782012-09-05 17:34:41 -07001/*
2 * Copyright (C) 2012 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
Daniel Sandler3ffdcc72012-09-23 14:31:48 -040019import android.app.ActivityManagerNative;
Daniel Sandlerc19d4482012-09-19 16:26:39 -040020import android.app.AlertDialog;
Jeff Brown508257b2012-09-08 23:15:12 -070021import android.app.Dialog;
Winson Chung43229d72012-09-12 18:04:18 -070022import android.app.PendingIntent;
Chris Wrenb2a7d272012-10-03 10:16:51 -040023import android.bluetooth.BluetoothAdapter;
Jeff Brown508257b2012-09-08 23:15:12 -070024import android.content.BroadcastReceiver;
Winson Chunge641b6a2012-09-10 17:30:27 -070025import android.content.ComponentName;
Winson Chungd63c59782012-09-05 17:34:41 -070026import android.content.Context;
Winson Chung1679b362012-09-10 20:08:01 -070027import android.content.DialogInterface;
Daniel Sandlerc19d4482012-09-19 16:26:39 -040028import android.content.DialogInterface.OnClickListener;
Winson Chungd63c59782012-09-05 17:34:41 -070029import android.content.Intent;
Jeff Brown508257b2012-09-08 23:15:12 -070030import android.content.IntentFilter;
Adam Powell6f2a3d22012-10-05 22:32:04 -070031import android.content.pm.PackageManager.NameNotFoundException;
32import android.content.pm.UserInfo;
Winson Chungd63c59782012-09-05 17:34:41 -070033import android.content.res.Resources;
34import android.database.Cursor;
Adam Powell6f2a3d22012-10-05 22:32:04 -070035import android.graphics.Bitmap;
Winson Chungefba3232012-09-27 16:56:42 -070036import android.graphics.drawable.BitmapDrawable;
Winson Chungeaa5ab02012-09-13 16:36:41 -070037import android.graphics.drawable.Drawable;
38import android.graphics.drawable.LevelListDrawable;
Jeff Brown508257b2012-09-08 23:15:12 -070039import android.hardware.display.DisplayManager;
Jeff Brown508257b2012-09-08 23:15:12 -070040import android.hardware.display.WifiDisplayStatus;
Daniel Sandlerab510022012-10-22 22:13:35 -040041import android.net.wifi.WifiManager;
Adam Powell6f2a3d22012-10-05 22:32:04 -070042import android.os.AsyncTask;
Winson Chung3ed6f942012-09-20 16:07:11 -070043import android.os.Handler;
Daniel Sandler3ffdcc72012-09-23 14:31:48 -040044import android.os.RemoteException;
Winson Chung34563e22012-09-21 17:19:49 -070045import android.os.UserHandle;
Winson Chungefba3232012-09-27 16:56:42 -070046import android.os.UserManager;
Satoshi Kataokac44f7a22013-05-22 08:54:56 +090047import android.provider.AlarmClock;
Winson Chungd63c59782012-09-05 17:34:41 -070048import android.provider.ContactsContract;
Adam Powell6f2a3d22012-10-05 22:32:04 -070049import android.provider.ContactsContract.CommonDataKinds.Phone;
50import android.provider.ContactsContract.Profile;
Winson Chung43229d72012-09-12 18:04:18 -070051import android.provider.Settings;
Adam Powell6f2a3d22012-10-05 22:32:04 -070052import android.util.Log;
53import android.util.Pair;
Winson Chungd63c59782012-09-05 17:34:41 -070054import android.view.LayoutInflater;
55import android.view.View;
56import android.view.ViewGroup;
Jeff Brown508257b2012-09-08 23:15:12 -070057import android.view.WindowManager;
Adam Powell6f2a3d22012-10-05 22:32:04 -070058import android.view.WindowManagerGlobal;
Winson Chungeaa5ab02012-09-13 16:36:41 -070059import android.widget.ImageView;
Winson Chungd63c59782012-09-05 17:34:41 -070060import android.widget.TextView;
61
John Spurlockde84f0e2013-06-12 12:41:00 -040062import com.android.systemui.R;
63import com.android.systemui.statusbar.phone.QuickSettingsModel.BluetoothState;
64import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState;
65import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
66import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState;
67import com.android.systemui.statusbar.phone.QuickSettingsModel.WifiState;
68import com.android.systemui.statusbar.policy.BatteryController;
69import com.android.systemui.statusbar.policy.BluetoothController;
70import com.android.systemui.statusbar.policy.LocationController;
71import com.android.systemui.statusbar.policy.NetworkController;
72import com.android.systemui.statusbar.policy.RotationLockController;
73
Winson Chunge641b6a2012-09-10 17:30:27 -070074import java.util.ArrayList;
Winson Chungd63c59782012-09-05 17:34:41 -070075
Winson Chungd63c59782012-09-05 17:34:41 -070076/**
77 *
78 */
79class QuickSettings {
Daniel Sandlerb5538e62013-04-12 15:16:53 -040080 static final boolean DEBUG_GONE_TILES = false;
Adam Powell6f2a3d22012-10-05 22:32:04 -070081 private static final String TAG = "QuickSettings";
Daniel Sandlerdd68da82012-10-01 10:19:09 -040082 public static final boolean SHOW_IME_TILE = false;
Winson Chungd63c59782012-09-05 17:34:41 -070083
Daniel Sandlerab510022012-10-22 22:13:35 -040084 public static final boolean LONG_PRESS_TOGGLES = true;
85
Winson Chungd63c59782012-09-05 17:34:41 -070086 private Context mContext;
87 private PanelBar mBar;
88 private QuickSettingsModel mModel;
Daniel Sandler101784e2012-10-15 13:39:38 -040089 private ViewGroup mContainerView;
Winson Chungd63c59782012-09-05 17:34:41 -070090
Jeff Brown508257b2012-09-08 23:15:12 -070091 private DisplayManager mDisplayManager;
92 private WifiDisplayStatus mWifiDisplayStatus;
Daniel Sandler3ffdcc72012-09-23 14:31:48 -040093 private PhoneStatusBar mStatusBarService;
Casey Burkhardtbac221f2012-10-03 18:13:58 -070094 private BluetoothState mBluetoothState;
Daniel Sandlerab510022012-10-22 22:13:35 -040095 private BluetoothAdapter mBluetoothAdapter;
96 private WifiManager mWifiManager;
Jeff Brown89d55462012-09-19 11:33:42 -070097
Winson Chung5f623012012-09-14 14:58:43 -070098 private BluetoothController mBluetoothController;
Svetoslav79578b22013-04-29 16:55:57 -070099 private RotationLockController mRotationLockController;
Winson Chung3ed6f942012-09-20 16:07:11 -0700100
Winson Chung7a6355b2012-10-08 18:19:09 -0700101 private AsyncTask<Void, Void, Pair<String, Drawable>> mUserInfoTask;
Winson Chungd63c59782012-09-05 17:34:41 -0700102
Winson Chungeaa5ab02012-09-13 16:36:41 -0700103 private LevelListDrawable mBatteryLevels;
104 private LevelListDrawable mChargingBatteryLevels;
105
Adam Powell6f2a3d22012-10-05 22:32:04 -0700106 boolean mTilesSetUp = false;
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700107 boolean mUseDefaultAvatar = false;
Adam Powell6f2a3d22012-10-05 22:32:04 -0700108
Winson Chung3ed6f942012-09-20 16:07:11 -0700109 private Handler mHandler;
110
Winson Chungd63c59782012-09-05 17:34:41 -0700111 // The set of QuickSettingsTiles that have dynamic spans (and need to be updated on
112 // configuration change)
113 private final ArrayList<QuickSettingsTileView> mDynamicSpannedTiles =
114 new ArrayList<QuickSettingsTileView>();
115
116 public QuickSettings(Context context, QuickSettingsContainerView container) {
Jeff Brown508257b2012-09-08 23:15:12 -0700117 mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
Winson Chungd63c59782012-09-05 17:34:41 -0700118 mContext = context;
Winson Chungd63c59782012-09-05 17:34:41 -0700119 mContainerView = container;
Jeff Brown508257b2012-09-08 23:15:12 -0700120 mModel = new QuickSettingsModel(context);
121 mWifiDisplayStatus = new WifiDisplayStatus();
Chris Wrenb2a7d272012-10-03 10:16:51 -0400122 mBluetoothState = new QuickSettingsModel.BluetoothState();
Daniel Sandlerab510022012-10-22 22:13:35 -0400123 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
124 mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
125
Winson Chung3ed6f942012-09-20 16:07:11 -0700126 mHandler = new Handler();
Jeff Brown508257b2012-09-08 23:15:12 -0700127
Winson Chungeaa5ab02012-09-13 16:36:41 -0700128 Resources r = mContext.getResources();
129 mBatteryLevels = (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery);
130 mChargingBatteryLevels =
131 (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery_charging);
132
Jeff Brown508257b2012-09-08 23:15:12 -0700133 IntentFilter filter = new IntentFilter();
134 filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
Chris Wrenb2a7d272012-10-03 10:16:51 -0400135 filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
Daniel Sandlerebaefec2012-10-17 11:37:42 -0400136 filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
Adam Powell6f2a3d22012-10-05 22:32:04 -0700137 filter.addAction(Intent.ACTION_USER_SWITCHED);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700138 filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
Jeff Brown508257b2012-09-08 23:15:12 -0700139 mContext.registerReceiver(mReceiver, filter);
Adam Powell6f2a3d22012-10-05 22:32:04 -0700140
141 IntentFilter profileFilter = new IntentFilter();
142 profileFilter.addAction(ContactsContract.Intents.ACTION_PROFILE_CHANGED);
143 profileFilter.addAction(Intent.ACTION_USER_INFO_CHANGED);
144 mContext.registerReceiverAsUser(mProfileReceiver, UserHandle.ALL, profileFilter,
145 null, null);
Winson Chungd63c59782012-09-05 17:34:41 -0700146 }
147
148 void setBar(PanelBar bar) {
149 mBar = bar;
150 }
151
Daniel Sandler3ffdcc72012-09-23 14:31:48 -0400152 public void setService(PhoneStatusBar phoneStatusBar) {
153 mStatusBarService = phoneStatusBar;
154 }
155
156 public PhoneStatusBar getService() {
157 return mStatusBarService;
158 }
159
Winson Chung43229d72012-09-12 18:04:18 -0700160 public void setImeWindowStatus(boolean visible) {
161 mModel.onImeWindowStatusChanged(visible);
162 }
163
Winson Chungd63c59782012-09-05 17:34:41 -0700164 void setup(NetworkController networkController, BluetoothController bluetoothController,
Svetoslav79578b22013-04-29 16:55:57 -0700165 BatteryController batteryController, LocationController locationController,
166 RotationLockController rotationLockController) {
Winson Chung5f623012012-09-14 14:58:43 -0700167 mBluetoothController = bluetoothController;
Svetoslav79578b22013-04-29 16:55:57 -0700168 mRotationLockController = rotationLockController;
Winson Chung5f623012012-09-14 14:58:43 -0700169
170 setupQuickSettings();
171 updateWifiDisplayStatus();
172 updateResources();
173
Winson Chungd63c59782012-09-05 17:34:41 -0700174 networkController.addNetworkSignalChangedCallback(mModel);
175 bluetoothController.addStateChangedCallback(mModel);
176 batteryController.addStateChangedCallback(mModel);
177 locationController.addStateChangedCallback(mModel);
Svetoslav79578b22013-04-29 16:55:57 -0700178 rotationLockController.addRotationLockControllerCallback(mModel);
Winson Chungd63c59782012-09-05 17:34:41 -0700179 }
180
181 private void queryForUserInformation() {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700182 Context currentUserContext = null;
183 UserInfo userInfo = null;
184 try {
185 userInfo = ActivityManagerNative.getDefault().getCurrentUser();
186 currentUserContext = mContext.createPackageContextAsUser("android", 0,
187 new UserHandle(userInfo.id));
188 } catch (NameNotFoundException e) {
189 Log.e(TAG, "Couldn't create user context", e);
190 throw new RuntimeException(e);
191 } catch (RemoteException e) {
192 Log.e(TAG, "Couldn't get user info", e);
193 }
194 final int userId = userInfo.id;
Amith Yamasani7277d5d2012-10-30 14:32:45 -0700195 final String userName = userInfo.name;
Winson Chungefba3232012-09-27 16:56:42 -0700196
Adam Powell6f2a3d22012-10-05 22:32:04 -0700197 final Context context = currentUserContext;
Winson Chung7a6355b2012-10-08 18:19:09 -0700198 mUserInfoTask = new AsyncTask<Void, Void, Pair<String, Drawable>>() {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700199 @Override
Winson Chung7a6355b2012-10-08 18:19:09 -0700200 protected Pair<String, Drawable> doInBackground(Void... params) {
Amith Yamasani27db4682013-03-30 17:07:47 -0700201 final UserManager um = UserManager.get(mContext);
Winson Chungd63c59782012-09-05 17:34:41 -0700202
Winson Chung7a6355b2012-10-08 18:19:09 -0700203 // Fall back to the UserManager nickname if we can't read the name from the local
204 // profile below.
Amith Yamasani7277d5d2012-10-30 14:32:45 -0700205 String name = userName;
Winson Chung7a6355b2012-10-08 18:19:09 -0700206 Drawable avatar = null;
207 Bitmap rawAvatar = um.getUserIcon(userId);
208 if (rawAvatar != null) {
209 avatar = new BitmapDrawable(mContext.getResources(), rawAvatar);
210 } else {
211 avatar = mContext.getResources().getDrawable(R.drawable.ic_qs_default_user);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700212 mUseDefaultAvatar = true;
Adam Powelldb43f472012-10-07 15:40:00 -0700213 }
214
Amith Yamasani7277d5d2012-10-30 14:32:45 -0700215 // If it's a single-user device, get the profile name, since the nickname is not
216 // usually valid
217 if (um.getUsers().size() <= 1) {
218 // Try and read the display name from the local profile
219 final Cursor cursor = context.getContentResolver().query(
220 Profile.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME},
221 null, null, null);
222 if (cursor != null) {
223 try {
224 if (cursor.moveToFirst()) {
225 name = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
226 }
227 } finally {
228 cursor.close();
Winson Chung7a6355b2012-10-08 18:19:09 -0700229 }
Winson Chungd63c59782012-09-05 17:34:41 -0700230 }
Adam Powell6f2a3d22012-10-05 22:32:04 -0700231 }
Winson Chung7a6355b2012-10-08 18:19:09 -0700232 return new Pair<String, Drawable>(name, avatar);
Adam Powell6f2a3d22012-10-05 22:32:04 -0700233 }
234
235 @Override
Winson Chung7a6355b2012-10-08 18:19:09 -0700236 protected void onPostExecute(Pair<String, Drawable> result) {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700237 super.onPostExecute(result);
238 mModel.setUserTileInfo(result.first, result.second);
239 mUserInfoTask = null;
240 }
241 };
242 mUserInfoTask.execute();
Winson Chungd63c59782012-09-05 17:34:41 -0700243 }
244
245 private void setupQuickSettings() {
246 // Setup the tiles that we are going to be showing (including the temporary ones)
247 LayoutInflater inflater = LayoutInflater.from(mContext);
248
249 addUserTiles(mContainerView, inflater);
250 addSystemTiles(mContainerView, inflater);
251 addTemporaryTiles(mContainerView, inflater);
252
253 queryForUserInformation();
Adam Powell6f2a3d22012-10-05 22:32:04 -0700254 mTilesSetUp = true;
Winson Chungd63c59782012-09-05 17:34:41 -0700255 }
256
Winson Chunge641b6a2012-09-10 17:30:27 -0700257 private void startSettingsActivity(String action) {
258 Intent intent = new Intent(action);
259 startSettingsActivity(intent);
260 }
Daniel Sandler3ffdcc72012-09-23 14:31:48 -0400261
Winson Chunge641b6a2012-09-10 17:30:27 -0700262 private void startSettingsActivity(Intent intent) {
Daniel Sandler3ffdcc72012-09-23 14:31:48 -0400263 startSettingsActivity(intent, true);
264 }
265
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400266 private void collapsePanels() {
267 getService().animateCollapsePanels();
268 }
269
Daniel Sandler3ffdcc72012-09-23 14:31:48 -0400270 private void startSettingsActivity(Intent intent, boolean onlyProvisioned) {
271 if (onlyProvisioned && !getService().isDeviceProvisioned()) return;
272 try {
273 // Dismiss the lock screen when Settings starts.
274 ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
275 } catch (RemoteException e) {
276 }
Winson Chung6072b002012-09-11 17:10:10 -0700277 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Michael Jurka09885242012-09-24 14:42:01 -0700278 mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400279 collapsePanels();
Winson Chunge641b6a2012-09-10 17:30:27 -0700280 }
281
Winson Chungd63c59782012-09-05 17:34:41 -0700282 private void addUserTiles(ViewGroup parent, LayoutInflater inflater) {
283 QuickSettingsTileView userTile = (QuickSettingsTileView)
284 inflater.inflate(R.layout.quick_settings_tile, parent, false);
285 userTile.setContent(R.layout.quick_settings_tile_user, inflater);
Winson Chung3ed6f942012-09-20 16:07:11 -0700286 userTile.setOnClickListener(new View.OnClickListener() {
287 @Override
288 public void onClick(View v) {
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400289 collapsePanels();
Amith Yamasani27db4682013-03-30 17:07:47 -0700290 final UserManager um = UserManager.get(mContext);
Winson Chungada86cb2012-10-11 12:48:36 -0700291 if (um.getUsers(true).size() > 1) {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700292 try {
Winson Chungf7614fc2012-11-26 14:43:24 -0800293 WindowManagerGlobal.getWindowManagerService().lockNow(null);
Adam Powell6f2a3d22012-10-05 22:32:04 -0700294 } catch (RemoteException e) {
295 Log.e(TAG, "Couldn't show user switcher", e);
296 }
297 } else {
298 Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent(
299 mContext, v, ContactsContract.Profile.CONTENT_URI,
300 ContactsContract.QuickContact.MODE_LARGE, null);
301 mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
302 }
Winson Chung3ed6f942012-09-20 16:07:11 -0700303 }
304 });
Winson Chungd63c59782012-09-05 17:34:41 -0700305 mModel.addUserTile(userTile, new QuickSettingsModel.RefreshCallback() {
306 @Override
307 public void refreshView(QuickSettingsTileView view, State state) {
Winson Chungeaa5ab02012-09-13 16:36:41 -0700308 UserState us = (UserState) state;
Winson Chungefba3232012-09-27 16:56:42 -0700309 ImageView iv = (ImageView) view.findViewById(R.id.user_imageview);
Winson Chungd63c59782012-09-05 17:34:41 -0700310 TextView tv = (TextView) view.findViewById(R.id.user_textview);
311 tv.setText(state.label);
Winson Chung7a6355b2012-10-08 18:19:09 -0700312 iv.setImageDrawable(us.avatar);
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700313 view.setContentDescription(mContext.getString(
314 R.string.accessibility_quick_settings_user, state.label));
Winson Chungd63c59782012-09-05 17:34:41 -0700315 }
316 });
317 parent.addView(userTile);
318 mDynamicSpannedTiles.add(userTile);
319
Daniel Sandler3679bf52012-10-16 21:30:28 -0400320 // Brightness
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400321 final QuickSettingsBasicTile brightnessTile
322 = new QuickSettingsBasicTile(mContext);
323 brightnessTile.setImageResource(R.drawable.ic_qs_brightness_auto_off);
Daniel Sandler3679bf52012-10-16 21:30:28 -0400324 brightnessTile.setOnClickListener(new View.OnClickListener() {
325 @Override
326 public void onClick(View v) {
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400327 collapsePanels();
Daniel Sandler3679bf52012-10-16 21:30:28 -0400328 showBrightnessDialog();
329 }
330 });
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400331 mModel.addBrightnessTile(brightnessTile,
332 new QuickSettingsModel.BasicRefreshCallback(brightnessTile));
Daniel Sandler3679bf52012-10-16 21:30:28 -0400333 parent.addView(brightnessTile);
334 mDynamicSpannedTiles.add(brightnessTile);
335
Winson Chungd63c59782012-09-05 17:34:41 -0700336 // Time tile
Daniel Sandler3679bf52012-10-16 21:30:28 -0400337 /*
Winson Chungd63c59782012-09-05 17:34:41 -0700338 QuickSettingsTileView timeTile = (QuickSettingsTileView)
339 inflater.inflate(R.layout.quick_settings_tile, parent, false);
340 timeTile.setContent(R.layout.quick_settings_tile_time, inflater);
Winson Chunge641b6a2012-09-10 17:30:27 -0700341 timeTile.setOnClickListener(new View.OnClickListener() {
342 @Override
343 public void onClick(View v) {
Daniel Sandler2e7d25b2012-10-01 16:43:26 -0400344 // Quick. Clock. Quick. Clock. Quick. Clock.
345 startSettingsActivity(Intent.ACTION_QUICK_CLOCK);
Winson Chunge641b6a2012-09-10 17:30:27 -0700346 }
347 });
348 mModel.addTimeTile(timeTile, new QuickSettingsModel.RefreshCallback() {
349 @Override
Winson Chungc86b23b2012-09-24 11:24:28 -0700350 public void refreshView(QuickSettingsTileView view, State alarmState) {}
Winson Chunge641b6a2012-09-10 17:30:27 -0700351 });
Winson Chungd63c59782012-09-05 17:34:41 -0700352 parent.addView(timeTile);
353 mDynamicSpannedTiles.add(timeTile);
Daniel Sandler3679bf52012-10-16 21:30:28 -0400354 */
Winson Chungd63c59782012-09-05 17:34:41 -0700355
356 // Settings tile
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400357 final QuickSettingsBasicTile settingsTile = new QuickSettingsBasicTile(mContext);
358 settingsTile.setImageResource(R.drawable.ic_qs_settings);
Winson Chungd63c59782012-09-05 17:34:41 -0700359 settingsTile.setOnClickListener(new View.OnClickListener() {
360 @Override
361 public void onClick(View v) {
Winson Chunge641b6a2012-09-10 17:30:27 -0700362 startSettingsActivity(android.provider.Settings.ACTION_SETTINGS);
Winson Chungd63c59782012-09-05 17:34:41 -0700363 }
364 });
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400365 mModel.addSettingsTile(settingsTile,
366 new QuickSettingsModel.BasicRefreshCallback(settingsTile));
Winson Chungd63c59782012-09-05 17:34:41 -0700367 parent.addView(settingsTile);
368 mDynamicSpannedTiles.add(settingsTile);
369 }
370
371 private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
372 // Wi-fi
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400373 final QuickSettingsBasicTile wifiTile
374 = new QuickSettingsBasicTile(mContext);
Winson Chungd63c59782012-09-05 17:34:41 -0700375 wifiTile.setOnClickListener(new View.OnClickListener() {
376 @Override
377 public void onClick(View v) {
Winson Chunge641b6a2012-09-10 17:30:27 -0700378 startSettingsActivity(android.provider.Settings.ACTION_WIFI_SETTINGS);
Winson Chungd63c59782012-09-05 17:34:41 -0700379 }
380 });
Daniel Sandlerab510022012-10-22 22:13:35 -0400381 if (LONG_PRESS_TOGGLES) {
382 wifiTile.setOnLongClickListener(new View.OnLongClickListener() {
383 @Override
384 public boolean onLongClick(View v) {
385 final boolean enable =
386 (mWifiManager.getWifiState() != WifiManager.WIFI_STATE_ENABLED);
387 new AsyncTask<Void, Void, Void>() {
388 @Override
389 protected Void doInBackground(Void... args) {
390 // Disable tethering if enabling Wifi
391 final int wifiApState = mWifiManager.getWifiApState();
392 if (enable && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) ||
393 (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) {
394 mWifiManager.setWifiApEnabled(null, false);
395 }
396
397 mWifiManager.setWifiEnabled(enable);
398 return null;
399 }
400 }.execute();
401 wifiTile.setPressed(false);
402 return true;
403 }} );
404 }
Winson Chungd63c59782012-09-05 17:34:41 -0700405 mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() {
406 @Override
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400407 public void refreshView(QuickSettingsTileView unused, State state) {
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700408 WifiState wifiState = (WifiState) state;
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400409 wifiTile.setImageResource(wifiState.iconId);
410 wifiTile.setText(wifiState.label);
411 wifiTile.setContentDescription(mContext.getString(
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700412 R.string.accessibility_quick_settings_wifi,
413 wifiState.signalContentDescription,
414 (wifiState.connected) ? wifiState.label : ""));
Winson Chungd63c59782012-09-05 17:34:41 -0700415 }
416 });
417 parent.addView(wifiTile);
418
Daniel Sandler50528052012-11-07 23:39:41 -0500419 if (mModel.deviceHasMobileData()) {
Winson Chung43229d72012-09-12 18:04:18 -0700420 // RSSI
421 QuickSettingsTileView rssiTile = (QuickSettingsTileView)
422 inflater.inflate(R.layout.quick_settings_tile, parent, false);
423 rssiTile.setContent(R.layout.quick_settings_tile_rssi, inflater);
424 rssiTile.setOnClickListener(new View.OnClickListener() {
425 @Override
426 public void onClick(View v) {
427 Intent intent = new Intent();
428 intent.setComponent(new ComponentName(
429 "com.android.settings",
430 "com.android.settings.Settings$DataUsageSummaryActivity"));
431 startSettingsActivity(intent);
432 }
433 });
434 mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() {
435 @Override
436 public void refreshView(QuickSettingsTileView view, State state) {
Winson Chung4f49d942012-09-14 14:01:40 -0700437 RSSIState rssiState = (RSSIState) state;
438 ImageView iv = (ImageView) view.findViewById(R.id.rssi_image);
439 ImageView iov = (ImageView) view.findViewById(R.id.rssi_overlay_image);
Winson Chung43229d72012-09-12 18:04:18 -0700440 TextView tv = (TextView) view.findViewById(R.id.rssi_textview);
Fabrice Di Meglio16b9f072013-01-11 15:06:31 -0800441 // Force refresh
442 iv.setImageDrawable(null);
Winson Chung4f49d942012-09-14 14:01:40 -0700443 iv.setImageResource(rssiState.signalIconId);
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700444
Winson Chung4f49d942012-09-14 14:01:40 -0700445 if (rssiState.dataTypeIconId > 0) {
446 iov.setImageResource(rssiState.dataTypeIconId);
447 } else {
448 iov.setImageDrawable(null);
449 }
Winson Chung43229d72012-09-12 18:04:18 -0700450 tv.setText(state.label);
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700451 view.setContentDescription(mContext.getResources().getString(
452 R.string.accessibility_quick_settings_mobile,
453 rssiState.signalContentDescription, rssiState.dataContentDescription,
454 state.label));
Winson Chung43229d72012-09-12 18:04:18 -0700455 }
456 });
457 parent.addView(rssiTile);
458 }
Winson Chungd63c59782012-09-05 17:34:41 -0700459
Winson Chungd4726d02012-09-14 12:27:29 -0700460 // Rotation Lock
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400461 if (mContext.getResources().getBoolean(R.bool.quick_settings_show_rotation_lock)
462 || DEBUG_GONE_TILES) {
463 final QuickSettingsBasicTile rotationLockTile
464 = new QuickSettingsBasicTile(mContext);
Winson Chungd4726d02012-09-14 12:27:29 -0700465 rotationLockTile.setOnClickListener(new View.OnClickListener() {
466 @Override
Svetoslav79578b22013-04-29 16:55:57 -0700467 public void onClick(View view) {
468 final boolean locked = mRotationLockController.isRotationLocked();
469 mRotationLockController.setRotationLocked(!locked);
Winson Chungd4726d02012-09-14 12:27:29 -0700470 }
471 });
Svetoslav79578b22013-04-29 16:55:57 -0700472 mModel.addRotationLockTile(rotationLockTile, mRotationLockController,
473 new QuickSettingsModel.RefreshCallback() {
474 @Override
475 public void refreshView(QuickSettingsTileView view, State state) {
476 QuickSettingsModel.RotationLockState rotationLockState =
477 (QuickSettingsModel.RotationLockState) state;
478 view.setVisibility(rotationLockState.visible
479 ? View.VISIBLE : View.GONE);
480 if (state.iconId != 0) {
481 // needed to flush any cached IDs
482 rotationLockTile.setImageDrawable(null);
483 rotationLockTile.setImageResource(state.iconId);
484 }
485 if (state.label != null) {
486 rotationLockTile.setText(state.label);
487 }
488 }
489 });
Winson Chungd4726d02012-09-14 12:27:29 -0700490 parent.addView(rotationLockTile);
491 }
492
Winson Chungd63c59782012-09-05 17:34:41 -0700493 // Battery
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400494 final QuickSettingsBasicTile batteryTile = new QuickSettingsBasicTile(mContext);
Winson Chungd63c59782012-09-05 17:34:41 -0700495 batteryTile.setOnClickListener(new View.OnClickListener() {
496 @Override
497 public void onClick(View v) {
Winson Chunge641b6a2012-09-10 17:30:27 -0700498 startSettingsActivity(Intent.ACTION_POWER_USAGE_SUMMARY);
Winson Chungd63c59782012-09-05 17:34:41 -0700499 }
500 });
501 mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() {
502 @Override
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400503 public void refreshView(QuickSettingsTileView unused, State state) {
Winson Chungd63c59782012-09-05 17:34:41 -0700504 QuickSettingsModel.BatteryState batteryState =
505 (QuickSettingsModel.BatteryState) state;
Winson Chungeaa5ab02012-09-13 16:36:41 -0700506 Drawable d = batteryState.pluggedIn
507 ? mChargingBatteryLevels
508 : mBatteryLevels;
509 String t;
510 if (batteryState.batteryLevel == 100) {
511 t = mContext.getString(R.string.quick_settings_battery_charged_label);
512 } else {
513 t = batteryState.pluggedIn
514 ? mContext.getString(R.string.quick_settings_battery_charging_label,
515 batteryState.batteryLevel)
516 : mContext.getString(R.string.status_bar_settings_battery_meter_format,
517 batteryState.batteryLevel);
518 }
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400519 batteryTile.setImageDrawable(d);
John Spurlockd3fc9562013-05-10 12:46:44 -0400520 batteryTile.getImageView().setImageLevel(batteryState.batteryLevel);
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400521 batteryTile.setText(t);
522 batteryTile.setContentDescription(
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700523 mContext.getString(R.string.accessibility_quick_settings_battery, t));
Winson Chungd63c59782012-09-05 17:34:41 -0700524 }
525 });
526 parent.addView(batteryTile);
527
528 // Airplane Mode
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400529 final QuickSettingsBasicTile airplaneTile
530 = new QuickSettingsBasicTile(mContext);
Winson Chungd63c59782012-09-05 17:34:41 -0700531 mModel.addAirplaneModeTile(airplaneTile, new QuickSettingsModel.RefreshCallback() {
532 @Override
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400533 public void refreshView(QuickSettingsTileView unused, State state) {
534 airplaneTile.setImageResource(state.iconId);
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700535
536 String airplaneState = mContext.getString(
537 (state.enabled) ? R.string.accessibility_desc_on
538 : R.string.accessibility_desc_off);
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400539 airplaneTile.setContentDescription(
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700540 mContext.getString(R.string.accessibility_quick_settings_airplane, airplaneState));
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400541 airplaneTile.setText(state.label);
Winson Chungd63c59782012-09-05 17:34:41 -0700542 }
543 });
544 parent.addView(airplaneTile);
545
546 // Bluetooth
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400547 if (mModel.deviceSupportsBluetooth()
548 || DEBUG_GONE_TILES) {
549 final QuickSettingsBasicTile bluetoothTile
550 = new QuickSettingsBasicTile(mContext);
Winson Chung6072b002012-09-11 17:10:10 -0700551 bluetoothTile.setOnClickListener(new View.OnClickListener() {
552 @Override
553 public void onClick(View v) {
554 startSettingsActivity(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS);
555 }
556 });
Daniel Sandlerab510022012-10-22 22:13:35 -0400557 if (LONG_PRESS_TOGGLES) {
558 bluetoothTile.setOnLongClickListener(new View.OnLongClickListener() {
559 @Override
560 public boolean onLongClick(View v) {
561 if (mBluetoothAdapter.isEnabled()) {
562 mBluetoothAdapter.disable();
563 } else {
564 mBluetoothAdapter.enable();
565 }
566 bluetoothTile.setPressed(false);
567 return true;
568 }});
569 }
Winson Chung6072b002012-09-11 17:10:10 -0700570 mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() {
571 @Override
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400572 public void refreshView(QuickSettingsTileView unused, State state) {
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700573 BluetoothState bluetoothState = (BluetoothState) state;
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400574 bluetoothTile.setImageResource(state.iconId);
Winson Chung5f623012012-09-14 14:58:43 -0700575
Winson Chung5f623012012-09-14 14:58:43 -0700576 /*
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400577 Resources r = mContext.getResources();
Winson Chung5f623012012-09-14 14:58:43 -0700578 //TODO: Show connected bluetooth device label
579 Set<BluetoothDevice> btDevices =
580 mBluetoothController.getBondedBluetoothDevices();
581 if (btDevices.size() == 1) {
582 // Show the name of the bluetooth device you are connected to
583 label = btDevices.iterator().next().getName();
584 } else if (btDevices.size() > 1) {
585 // Show a generic label about the number of bluetooth devices
586 label = r.getString(R.string.quick_settings_bluetooth_multiple_devices_label,
587 btDevices.size());
588 }
589 */
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400590 bluetoothTile.setContentDescription(mContext.getString(
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700591 R.string.accessibility_quick_settings_bluetooth,
592 bluetoothState.stateContentDescription));
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400593 bluetoothTile.setText(state.label);
Winson Chung6072b002012-09-11 17:10:10 -0700594 }
595 });
596 parent.addView(bluetoothTile);
597 }
Winson Chungd63c59782012-09-05 17:34:41 -0700598
Winson Chungd63c59782012-09-05 17:34:41 -0700599 }
600
601 private void addTemporaryTiles(final ViewGroup parent, final LayoutInflater inflater) {
Winson Chungc86b23b2012-09-24 11:24:28 -0700602 // Alarm tile
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400603 final QuickSettingsBasicTile alarmTile
604 = new QuickSettingsBasicTile(mContext);
605 alarmTile.setImageResource(R.drawable.ic_qs_alarm_on);
Winson Chungc86b23b2012-09-24 11:24:28 -0700606 alarmTile.setOnClickListener(new View.OnClickListener() {
607 @Override
608 public void onClick(View v) {
Satoshi Kataokac44f7a22013-05-22 08:54:56 +0900609 startSettingsActivity(AlarmClock.ACTION_SET_ALARM);
Winson Chungc86b23b2012-09-24 11:24:28 -0700610 }
611 });
612 mModel.addAlarmTile(alarmTile, new QuickSettingsModel.RefreshCallback() {
613 @Override
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400614 public void refreshView(QuickSettingsTileView unused, State alarmState) {
615 alarmTile.setText(alarmState.label);
616 alarmTile.setVisibility(alarmState.enabled ? View.VISIBLE : View.GONE);
617 alarmTile.setContentDescription(mContext.getString(
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700618 R.string.accessibility_quick_settings_alarm, alarmState.label));
Winson Chungc86b23b2012-09-24 11:24:28 -0700619 }
620 });
621 parent.addView(alarmTile);
622
Winson Chungd63c59782012-09-05 17:34:41 -0700623 // Location
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400624 final QuickSettingsBasicTile locationTile
625 = new QuickSettingsBasicTile(mContext);
626 locationTile.setImageResource(R.drawable.ic_qs_location);
627 locationTile.setTextResource(R.string.quick_settings_location_label);
Winson Chungd63c59782012-09-05 17:34:41 -0700628 locationTile.setOnClickListener(new View.OnClickListener() {
629 @Override
630 public void onClick(View v) {
Winson Chunge641b6a2012-09-10 17:30:27 -0700631 startSettingsActivity(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
Winson Chungd63c59782012-09-05 17:34:41 -0700632 }
633 });
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400634 mModel.addLocationTile(locationTile,
635 new QuickSettingsModel.BasicRefreshCallback(locationTile)
636 .setShowWhenEnabled(true));
Winson Chungd63c59782012-09-05 17:34:41 -0700637 parent.addView(locationTile);
638
Jeff Brown508257b2012-09-08 23:15:12 -0700639 // Wifi Display
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400640 QuickSettingsBasicTile wifiDisplayTile
641 = new QuickSettingsBasicTile(mContext);
642 wifiDisplayTile.setImageResource(R.drawable.ic_qs_remote_display);
Jeff Brown508257b2012-09-08 23:15:12 -0700643 wifiDisplayTile.setOnClickListener(new View.OnClickListener() {
644 @Override
645 public void onClick(View v) {
Jeff Brown89d55462012-09-19 11:33:42 -0700646 startSettingsActivity(android.provider.Settings.ACTION_WIFI_DISPLAY_SETTINGS);
Jeff Brown508257b2012-09-08 23:15:12 -0700647 }
648 });
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400649 mModel.addWifiDisplayTile(wifiDisplayTile,
650 new QuickSettingsModel.BasicRefreshCallback(wifiDisplayTile)
651 .setShowWhenEnabled(true));
Jeff Brown508257b2012-09-08 23:15:12 -0700652 parent.addView(wifiDisplayTile);
653
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400654 if (SHOW_IME_TILE || DEBUG_GONE_TILES) {
Daniel Sandlerdd68da82012-10-01 10:19:09 -0400655 // IME
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400656 final QuickSettingsBasicTile imeTile
657 = new QuickSettingsBasicTile(mContext);
658 imeTile.setImageResource(R.drawable.ic_qs_ime);
Daniel Sandlerdd68da82012-10-01 10:19:09 -0400659 imeTile.setOnClickListener(new View.OnClickListener() {
660 @Override
661 public void onClick(View v) {
662 try {
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400663 collapsePanels();
Daniel Sandlerdd68da82012-10-01 10:19:09 -0400664 Intent intent = new Intent(Settings.ACTION_SHOW_INPUT_METHOD_PICKER);
665 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
666 pendingIntent.send();
667 } catch (Exception e) {}
Winson Chung2a4057d2012-09-12 18:30:06 -0700668 }
Daniel Sandlerdd68da82012-10-01 10:19:09 -0400669 });
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400670 mModel.addImeTile(imeTile,
671 new QuickSettingsModel.BasicRefreshCallback(imeTile)
672 .setShowWhenEnabled(true));
Daniel Sandlerdd68da82012-10-01 10:19:09 -0400673 parent.addView(imeTile);
674 }
Winson Chung43229d72012-09-12 18:04:18 -0700675
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400676 // Bug reports
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400677 final QuickSettingsBasicTile bugreportTile
678 = new QuickSettingsBasicTile(mContext);
679 bugreportTile.setImageResource(com.android.internal.R.drawable.stat_sys_adb);
680 bugreportTile.setTextResource(com.android.internal.R.string.bugreport_title);
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400681 bugreportTile.setOnClickListener(new View.OnClickListener() {
682 @Override
683 public void onClick(View v) {
Daniel Sandlerb5538e62013-04-12 15:16:53 -0400684 collapsePanels();
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400685 showBugreportDialog();
686 }
687 });
688 mModel.addBugreportTile(bugreportTile, new QuickSettingsModel.RefreshCallback() {
689 @Override
690 public void refreshView(QuickSettingsTileView view, State state) {
691 view.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
692 }
693 });
694 parent.addView(bugreportTile);
Winson Chungd63c59782012-09-05 17:34:41 -0700695 /*
696 QuickSettingsTileView mediaTile = (QuickSettingsTileView)
697 inflater.inflate(R.layout.quick_settings_tile, parent, false);
698 mediaTile.setContent(R.layout.quick_settings_tile_media, inflater);
699 parent.addView(mediaTile);
700 QuickSettingsTileView imeTile = (QuickSettingsTileView)
701 inflater.inflate(R.layout.quick_settings_tile, parent, false);
702 imeTile.setContent(R.layout.quick_settings_tile_ime, inflater);
703 imeTile.setOnClickListener(new View.OnClickListener() {
704 @Override
705 public void onClick(View v) {
706 parent.removeViewAt(0);
707 }
708 });
709 parent.addView(imeTile);
710 */
711 }
712
713 void updateResources() {
714 Resources r = mContext.getResources();
715
Winson Chungefba3232012-09-27 16:56:42 -0700716 // Update the model
717 mModel.updateResources();
718
Winson Chungd63c59782012-09-05 17:34:41 -0700719 // Update the User, Time, and Settings tiles spans, and reset everything else
720 int span = r.getInteger(R.integer.quick_settings_user_time_settings_tile_span);
721 for (QuickSettingsTileView v : mDynamicSpannedTiles) {
722 v.setColumnSpan(span);
723 }
Daniel Sandler101784e2012-10-15 13:39:38 -0400724 ((QuickSettingsContainerView)mContainerView).updateResources();
Winson Chungd63c59782012-09-05 17:34:41 -0700725 mContainerView.requestLayout();
726 }
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700727
Winson Chung3ed6f942012-09-20 16:07:11 -0700728
Winson Chung1679b362012-09-10 20:08:01 -0700729 private void showBrightnessDialog() {
Michael Wright0087a142013-02-05 16:29:39 -0800730 Intent intent = new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);
731 mContext.sendBroadcast(intent);
Winson Chung1679b362012-09-10 20:08:01 -0700732 }
Jeff Brown508257b2012-09-08 23:15:12 -0700733
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400734 private void showBugreportDialog() {
735 final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
736 builder.setPositiveButton(com.android.internal.R.string.report, new OnClickListener() {
737 @Override
738 public void onClick(DialogInterface dialog, int which) {
739 if (which == DialogInterface.BUTTON_POSITIVE) {
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700740 // Add a little delay before executing, to give the
741 // dialog a chance to go away before it takes a
742 // screenshot.
743 mHandler.postDelayed(new Runnable() {
744 @Override public void run() {
745 try {
746 ActivityManagerNative.getDefault()
747 .requestBugReport();
748 } catch (RemoteException e) {
749 }
750 }
751 }, 500);
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400752 }
753 }
754 });
755 builder.setMessage(com.android.internal.R.string.bugreport_message);
756 builder.setTitle(com.android.internal.R.string.bugreport_title);
757 builder.setCancelable(true);
758 final Dialog dialog = builder.create();
759 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
Daniel Sandlerb64c3dd2012-10-09 00:37:53 -0400760 try {
761 WindowManagerGlobal.getWindowManagerService().dismissKeyguard();
762 } catch (RemoteException e) {
763 }
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400764 dialog.show();
765 }
766
Jeff Brown508257b2012-09-08 23:15:12 -0700767 private void updateWifiDisplayStatus() {
Jeff Brown89d55462012-09-19 11:33:42 -0700768 mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
769 applyWifiDisplayStatus();
Jeff Brown508257b2012-09-08 23:15:12 -0700770 }
771
Jeff Brown89d55462012-09-19 11:33:42 -0700772 private void applyWifiDisplayStatus() {
773 mModel.onWifiDisplayStateChanged(mWifiDisplayStatus);
Jeff Brown508257b2012-09-08 23:15:12 -0700774 }
775
Chris Wrenb2a7d272012-10-03 10:16:51 -0400776 private void applyBluetoothStatus() {
777 mModel.onBluetoothStateChange(mBluetoothState);
778 }
779
Adam Powell6f2a3d22012-10-05 22:32:04 -0700780 void reloadUserInfo() {
781 if (mUserInfoTask != null) {
782 mUserInfoTask.cancel(false);
783 mUserInfoTask = null;
784 }
785 if (mTilesSetUp) {
786 queryForUserInformation();
787 }
788 }
789
Jeff Brown508257b2012-09-08 23:15:12 -0700790 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
791 @Override
792 public void onReceive(Context context, Intent intent) {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700793 final String action = intent.getAction();
794 if (DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED.equals(action)) {
Jeff Brown508257b2012-09-08 23:15:12 -0700795 WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra(
796 DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
Jeff Brown89d55462012-09-19 11:33:42 -0700797 mWifiDisplayStatus = status;
798 applyWifiDisplayStatus();
Daniel Sandlerebaefec2012-10-17 11:37:42 -0400799 } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
800 int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
801 BluetoothAdapter.ERROR);
802 mBluetoothState.enabled = (state == BluetoothAdapter.STATE_ON);
803 applyBluetoothStatus();
Adam Powell6f2a3d22012-10-05 22:32:04 -0700804 } else if (BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
Chris Wrenb2a7d272012-10-03 10:16:51 -0400805 int status = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,
806 BluetoothAdapter.STATE_DISCONNECTED);
807 mBluetoothState.connected = (status == BluetoothAdapter.STATE_CONNECTED);
808 applyBluetoothStatus();
Adam Powell6f2a3d22012-10-05 22:32:04 -0700809 } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
810 reloadUserInfo();
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700811 } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
812 if (mUseDefaultAvatar) {
813 queryForUserInformation();
814 }
Adam Powell6f2a3d22012-10-05 22:32:04 -0700815 }
816 }
817 };
818
819 private final BroadcastReceiver mProfileReceiver = new BroadcastReceiver() {
820 @Override
821 public void onReceive(Context context, Intent intent) {
822 final String action = intent.getAction();
823 if (ContactsContract.Intents.ACTION_PROFILE_CHANGED.equals(action) ||
824 Intent.ACTION_USER_INFO_CHANGED.equals(action)) {
825 try {
Amith Yamasani6fc1d4e2013-05-08 16:43:58 -0700826 final int currentUser = ActivityManagerNative.getDefault().getCurrentUser().id;
827 final int changedUser =
828 intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId());
829 if (changedUser == currentUser) {
Adam Powell6f2a3d22012-10-05 22:32:04 -0700830 reloadUserInfo();
831 }
832 } catch (RemoteException e) {
833 Log.e(TAG, "Couldn't get current user id for profile change", e);
834 }
Chris Wrenb2a7d272012-10-03 10:16:51 -0400835 }
Casey Burkhardtbac221f2012-10-03 18:13:58 -0700836
Jeff Brown508257b2012-09-08 23:15:12 -0700837 }
838 };
Daniel Sandlerc19d4482012-09-19 16:26:39 -0400839}