QuickSettings.java revision 3ed6f9456a60cb3a2cf4166a7fa19e30b9bbd972
1/* 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 19import android.app.AlertDialog; 20import android.app.Dialog; 21import android.app.PendingIntent; 22import android.content.BroadcastReceiver; 23import android.content.ComponentName; 24import android.content.Context; 25import android.content.CursorLoader; 26import android.content.DialogInterface; 27import android.content.DialogInterface.OnClickListener; 28import android.content.Intent; 29import android.content.IntentFilter; 30import android.content.Loader; 31import android.content.res.Resources; 32import android.database.Cursor; 33import android.graphics.drawable.Drawable; 34import android.graphics.drawable.LevelListDrawable; 35import android.hardware.display.DisplayManager; 36import android.hardware.display.WifiDisplayStatus; 37import android.net.Uri; 38import android.os.Handler; 39import android.os.SystemProperties; 40import android.provider.ContactsContract; 41import android.provider.Settings; 42import android.view.LayoutInflater; 43import android.view.View; 44import android.view.ViewGroup; 45import android.view.Window; 46import android.view.WindowManager; 47import android.widget.ImageView; 48import android.widget.TextView; 49 50import com.android.internal.view.RotationPolicy; 51import com.android.systemui.R; 52import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState; 53import com.android.systemui.statusbar.phone.QuickSettingsModel.State; 54import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState; 55import com.android.systemui.statusbar.policy.BatteryController; 56import com.android.systemui.statusbar.policy.BluetoothController; 57import com.android.systemui.statusbar.policy.BrightnessController; 58import com.android.systemui.statusbar.policy.LocationController; 59import com.android.systemui.statusbar.policy.NetworkController; 60import com.android.systemui.statusbar.policy.ToggleSlider; 61 62import java.util.ArrayList; 63 64 65/** 66 * 67 */ 68class QuickSettings { 69 70 private Context mContext; 71 private PanelBar mBar; 72 private QuickSettingsModel mModel; 73 private QuickSettingsContainerView mContainerView; 74 75 private DisplayManager mDisplayManager; 76 private WifiDisplayStatus mWifiDisplayStatus; 77 78 private BrightnessController mBrightnessController; 79 private BluetoothController mBluetoothController; 80 81 private Dialog mBrightnessDialog; 82 private int mBrightnessDialogShortTimeout; 83 private int mBrightnessDialogLongTimeout; 84 85 private CursorLoader mUserInfoLoader; 86 87 private LevelListDrawable mBatteryLevels; 88 private LevelListDrawable mChargingBatteryLevels; 89 90 private Handler mHandler; 91 92 // The set of QuickSettingsTiles that have dynamic spans (and need to be updated on 93 // configuration change) 94 private final ArrayList<QuickSettingsTileView> mDynamicSpannedTiles = 95 new ArrayList<QuickSettingsTileView>(); 96 97 private final RotationPolicy.RotationPolicyListener mRotationPolicyListener = 98 new RotationPolicy.RotationPolicyListener() { 99 @Override 100 public void onChange() { 101 mModel.onRotationLockChanged(); 102 } 103 }; 104 105 public QuickSettings(Context context, QuickSettingsContainerView container) { 106 mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); 107 mContext = context; 108 mContainerView = container; 109 mModel = new QuickSettingsModel(context); 110 mWifiDisplayStatus = new WifiDisplayStatus(); 111 mHandler = new Handler(); 112 113 Resources r = mContext.getResources(); 114 mBatteryLevels = (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery); 115 mChargingBatteryLevels = 116 (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery_charging); 117 mBrightnessDialogLongTimeout = 118 r.getInteger(R.integer.quick_settings_brightness_dialog_long_timeout); 119 mBrightnessDialogShortTimeout = 120 r.getInteger(R.integer.quick_settings_brightness_dialog_short_timeout); 121 122 IntentFilter filter = new IntentFilter(); 123 filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED); 124 mContext.registerReceiver(mReceiver, filter); 125 } 126 127 void setBar(PanelBar bar) { 128 mBar = bar; 129 } 130 131 public void setImeWindowStatus(boolean visible) { 132 mModel.onImeWindowStatusChanged(visible); 133 } 134 135 void setup(NetworkController networkController, BluetoothController bluetoothController, 136 BatteryController batteryController, LocationController locationController) { 137 mBluetoothController = bluetoothController; 138 139 setupQuickSettings(); 140 updateWifiDisplayStatus(); 141 updateResources(); 142 143 networkController.addNetworkSignalChangedCallback(mModel); 144 bluetoothController.addStateChangedCallback(mModel); 145 batteryController.addStateChangedCallback(mModel); 146 locationController.addStateChangedCallback(mModel); 147 RotationPolicy.registerRotationPolicyListener(mContext, mRotationPolicyListener); 148 } 149 150 private void queryForUserInformation() { 151 Uri userContactUri = Uri.withAppendedPath( 152 ContactsContract.Profile.CONTENT_URI, 153 ContactsContract.Contacts.Data.CONTENT_DIRECTORY); 154 155 String[] selectArgs = { 156 ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 157 ContactsContract.CommonDataKinds.Photo.PHOTO 158 }; 159 String where = String.format("(%s = ? OR %s = ?) AND %s IS NULL", 160 ContactsContract.Contacts.Data.MIMETYPE, 161 ContactsContract.Contacts.Data.MIMETYPE, 162 ContactsContract.RawContacts.ACCOUNT_TYPE); 163 String[] whereArgs = { 164 ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, 165 ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE 166 }; 167 168 mUserInfoLoader = new CursorLoader(mContext, userContactUri, selectArgs, where, whereArgs, 169 null); 170 mUserInfoLoader.registerListener(0, 171 new Loader.OnLoadCompleteListener<Cursor>() { 172 @Override 173 public void onLoadComplete(Loader<Cursor> loader, 174 Cursor cursor) { 175 if (cursor != null && cursor.moveToFirst()) { 176 String name = cursor.getString(0); // DISPLAY_NAME 177 mModel.setUserTileInfo(name, null); 178 /* 179 byte[] photoData = cursor.getBlob(0); 180 Bitmap b = 181 BitmapFactory.decodeByteArray(photoData, 0, photoData.length); 182 */ 183 } 184 mUserInfoLoader.stopLoading(); 185 } 186 }); 187 mUserInfoLoader.startLoading(); 188 } 189 190 private void setupQuickSettings() { 191 // Setup the tiles that we are going to be showing (including the temporary ones) 192 LayoutInflater inflater = LayoutInflater.from(mContext); 193 194 addUserTiles(mContainerView, inflater); 195 addSystemTiles(mContainerView, inflater); 196 addTemporaryTiles(mContainerView, inflater); 197 198 queryForUserInformation(); 199 } 200 201 private void startSettingsActivity(String action) { 202 Intent intent = new Intent(action); 203 startSettingsActivity(intent); 204 } 205 private void startSettingsActivity(Intent intent) { 206 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 207 mBar.collapseAllPanels(true); 208 mContext.startActivity(intent); 209 } 210 211 private void addUserTiles(ViewGroup parent, LayoutInflater inflater) { 212 QuickSettingsTileView userTile = (QuickSettingsTileView) 213 inflater.inflate(R.layout.quick_settings_tile, parent, false); 214 userTile.setContent(R.layout.quick_settings_tile_user, inflater); 215 userTile.setOnClickListener(new View.OnClickListener() { 216 @Override 217 public void onClick(View v) { 218 mBar.collapseAllPanels(true); 219 ContactsContract.QuickContact.showQuickContact(mContext, v, 220 ContactsContract.Profile.CONTENT_URI, 221 ContactsContract.QuickContact.MODE_LARGE, null); 222 } 223 }); 224 mModel.addUserTile(userTile, new QuickSettingsModel.RefreshCallback() { 225 @Override 226 public void refreshView(QuickSettingsTileView view, State state) { 227 UserState us = (UserState) state; 228 TextView tv = (TextView) view.findViewById(R.id.user_textview); 229 tv.setText(state.label); 230 if (us.avatar != null) { 231 tv.setCompoundDrawables(null, us.avatar, null, null); 232 } 233 } 234 }); 235 parent.addView(userTile); 236 mDynamicSpannedTiles.add(userTile); 237 238 // Time tile 239 QuickSettingsTileView timeTile = (QuickSettingsTileView) 240 inflater.inflate(R.layout.quick_settings_tile, parent, false); 241 timeTile.setContent(R.layout.quick_settings_tile_time, inflater); 242 timeTile.setOnClickListener(new View.OnClickListener() { 243 @Override 244 public void onClick(View v) { 245 // TODO: Jump into the alarm application 246 Intent intent = new Intent(); 247 intent.setComponent(new ComponentName( 248 "com.google.android.deskclock", 249 "com.android.deskclock.AlarmClock")); 250 startSettingsActivity(intent); 251 } 252 }); 253 mModel.addTimeTile(timeTile, new QuickSettingsModel.RefreshCallback() { 254 @Override 255 public void refreshView(QuickSettingsTileView view, State alarmState) { 256 TextView tv = (TextView) view.findViewById(R.id.alarm_textview); 257 tv.setText(alarmState.label); 258 tv.setVisibility(alarmState.enabled ? View.VISIBLE : View.GONE); 259 } 260 }); 261 parent.addView(timeTile); 262 mDynamicSpannedTiles.add(timeTile); 263 264 // Settings tile 265 QuickSettingsTileView settingsTile = (QuickSettingsTileView) 266 inflater.inflate(R.layout.quick_settings_tile, parent, false); 267 settingsTile.setContent(R.layout.quick_settings_tile_settings, inflater); 268 settingsTile.setOnClickListener(new View.OnClickListener() { 269 @Override 270 public void onClick(View v) { 271 startSettingsActivity(android.provider.Settings.ACTION_SETTINGS); 272 } 273 }); 274 parent.addView(settingsTile); 275 mDynamicSpannedTiles.add(settingsTile); 276 } 277 278 private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) { 279 // Wi-fi 280 QuickSettingsTileView wifiTile = (QuickSettingsTileView) 281 inflater.inflate(R.layout.quick_settings_tile, parent, false); 282 wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater); 283 wifiTile.setOnClickListener(new View.OnClickListener() { 284 @Override 285 public void onClick(View v) { 286 startSettingsActivity(android.provider.Settings.ACTION_WIFI_SETTINGS); 287 } 288 }); 289 mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() { 290 @Override 291 public void refreshView(QuickSettingsTileView view, State state) { 292 TextView tv = (TextView) view.findViewById(R.id.wifi_textview); 293 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); 294 tv.setText(state.label); 295 } 296 }); 297 parent.addView(wifiTile); 298 299 if (mModel.deviceSupportsTelephony()) { 300 // RSSI 301 QuickSettingsTileView rssiTile = (QuickSettingsTileView) 302 inflater.inflate(R.layout.quick_settings_tile, parent, false); 303 rssiTile.setContent(R.layout.quick_settings_tile_rssi, inflater); 304 rssiTile.setOnClickListener(new View.OnClickListener() { 305 @Override 306 public void onClick(View v) { 307 Intent intent = new Intent(); 308 intent.setComponent(new ComponentName( 309 "com.android.settings", 310 "com.android.settings.Settings$DataUsageSummaryActivity")); 311 startSettingsActivity(intent); 312 } 313 }); 314 mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() { 315 @Override 316 public void refreshView(QuickSettingsTileView view, State state) { 317 RSSIState rssiState = (RSSIState) state; 318 ImageView iv = (ImageView) view.findViewById(R.id.rssi_image); 319 ImageView iov = (ImageView) view.findViewById(R.id.rssi_overlay_image); 320 TextView tv = (TextView) view.findViewById(R.id.rssi_textview); 321 iv.setImageResource(rssiState.signalIconId); 322 if (rssiState.dataTypeIconId > 0) { 323 iov.setImageResource(rssiState.dataTypeIconId); 324 } else { 325 iov.setImageDrawable(null); 326 } 327 tv.setText(state.label); 328 } 329 }); 330 parent.addView(rssiTile); 331 } 332 333 // Rotation Lock 334 if (mContext.getResources().getBoolean(R.bool.quick_settings_show_rotation_lock)) { 335 QuickSettingsTileView rotationLockTile = (QuickSettingsTileView) 336 inflater.inflate(R.layout.quick_settings_tile, parent, false); 337 rotationLockTile.setContent(R.layout.quick_settings_tile_rotation_lock, inflater); 338 rotationLockTile.setOnClickListener(new View.OnClickListener() { 339 @Override 340 public void onClick(View v) { 341 boolean locked = RotationPolicy.isRotationLocked(mContext); 342 RotationPolicy.setRotationLock(mContext, !locked); 343 } 344 }); 345 mModel.addRotationLockTile(rotationLockTile, new QuickSettingsModel.RefreshCallback() { 346 @Override 347 public void refreshView(QuickSettingsTileView view, State state) { 348 TextView tv = (TextView) view.findViewById(R.id.rotation_lock_textview); 349 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); 350 tv.setText(state.label); 351 } 352 }); 353 parent.addView(rotationLockTile); 354 } 355 356 // Battery 357 QuickSettingsTileView batteryTile = (QuickSettingsTileView) 358 inflater.inflate(R.layout.quick_settings_tile, parent, false); 359 batteryTile.setContent(R.layout.quick_settings_tile_battery, inflater); 360 batteryTile.setOnClickListener(new View.OnClickListener() { 361 @Override 362 public void onClick(View v) { 363 startSettingsActivity(Intent.ACTION_POWER_USAGE_SUMMARY); 364 } 365 }); 366 mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() { 367 @Override 368 public void refreshView(QuickSettingsTileView view, State state) { 369 QuickSettingsModel.BatteryState batteryState = 370 (QuickSettingsModel.BatteryState) state; 371 TextView tv = (TextView) view.findViewById(R.id.battery_textview); 372 ImageView iv = (ImageView) view.findViewById(R.id.battery_image); 373 Drawable d = batteryState.pluggedIn 374 ? mChargingBatteryLevels 375 : mBatteryLevels; 376 String t; 377 if (batteryState.batteryLevel == 100) { 378 t = mContext.getString(R.string.quick_settings_battery_charged_label); 379 } else { 380 t = batteryState.pluggedIn 381 ? mContext.getString(R.string.quick_settings_battery_charging_label, 382 batteryState.batteryLevel) 383 : mContext.getString(R.string.status_bar_settings_battery_meter_format, 384 batteryState.batteryLevel); 385 } 386 iv.setImageDrawable(d); 387 iv.setImageLevel(batteryState.batteryLevel); 388 tv.setText(t); 389 } 390 }); 391 parent.addView(batteryTile); 392 393 // Airplane Mode 394 QuickSettingsTileView airplaneTile = (QuickSettingsTileView) 395 inflater.inflate(R.layout.quick_settings_tile, parent, false); 396 airplaneTile.setContent(R.layout.quick_settings_tile_airplane, inflater); 397 mModel.addAirplaneModeTile(airplaneTile, new QuickSettingsModel.RefreshCallback() { 398 @Override 399 public void refreshView(QuickSettingsTileView view, State state) { 400 TextView tv = (TextView) view.findViewById(R.id.airplane_mode_textview); 401 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); 402 } 403 }); 404 parent.addView(airplaneTile); 405 406 // Bluetooth 407 if (mModel.deviceSupportsBluetooth()) { 408 QuickSettingsTileView bluetoothTile = (QuickSettingsTileView) 409 inflater.inflate(R.layout.quick_settings_tile, parent, false); 410 bluetoothTile.setContent(R.layout.quick_settings_tile_bluetooth, inflater); 411 bluetoothTile.setOnClickListener(new View.OnClickListener() { 412 @Override 413 public void onClick(View v) { 414 startSettingsActivity(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); 415 } 416 }); 417 mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() { 418 @Override 419 public void refreshView(QuickSettingsTileView view, State state) { 420 TextView tv = (TextView) view.findViewById(R.id.bluetooth_textview); 421 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); 422 423 Resources r = mContext.getResources(); 424 String label = null; 425 /* 426 //TODO: Show connected bluetooth device label 427 Set<BluetoothDevice> btDevices = 428 mBluetoothController.getBondedBluetoothDevices(); 429 if (btDevices.size() == 1) { 430 // Show the name of the bluetooth device you are connected to 431 label = btDevices.iterator().next().getName(); 432 } else if (btDevices.size() > 1) { 433 // Show a generic label about the number of bluetooth devices 434 label = r.getString(R.string.quick_settings_bluetooth_multiple_devices_label, 435 btDevices.size()); 436 } 437 */ 438 if (label == null) { 439 label = r.getString(R.string.quick_settings_bluetooth_label); 440 } 441 tv.setText(label); 442 } 443 }); 444 parent.addView(bluetoothTile); 445 } 446 447 // Brightness 448 QuickSettingsTileView brightnessTile = (QuickSettingsTileView) 449 inflater.inflate(R.layout.quick_settings_tile, parent, false); 450 brightnessTile.setContent(R.layout.quick_settings_tile_brightness, inflater); 451 brightnessTile.setOnClickListener(new View.OnClickListener() { 452 @Override 453 public void onClick(View v) { 454 mBar.collapseAllPanels(true); 455 showBrightnessDialog(); 456 } 457 }); 458 mModel.addBrightnessTile(brightnessTile, new QuickSettingsModel.RefreshCallback() { 459 @Override 460 public void refreshView(QuickSettingsTileView view, State state) { 461 TextView tv = (TextView) view.findViewById(R.id.brightness_textview); 462 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); 463 dismissBrightnessDialog(mBrightnessDialogShortTimeout); 464 } 465 }); 466 parent.addView(brightnessTile); 467 } 468 469 private void addTemporaryTiles(final ViewGroup parent, final LayoutInflater inflater) { 470 // Location 471 QuickSettingsTileView locationTile = (QuickSettingsTileView) 472 inflater.inflate(R.layout.quick_settings_tile, parent, false); 473 locationTile.setContent(R.layout.quick_settings_tile_location, inflater); 474 locationTile.setOnClickListener(new View.OnClickListener() { 475 @Override 476 public void onClick(View v) { 477 startSettingsActivity(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 478 } 479 }); 480 mModel.addLocationTile(locationTile, new QuickSettingsModel.RefreshCallback() { 481 @Override 482 public void refreshView(QuickSettingsTileView view, State state) { 483 TextView tv = (TextView) view.findViewById(R.id.location_textview); 484 tv.setText(state.label); 485 view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); 486 } 487 }); 488 parent.addView(locationTile); 489 490 // Wifi Display 491 QuickSettingsTileView wifiDisplayTile = (QuickSettingsTileView) 492 inflater.inflate(R.layout.quick_settings_tile, parent, false); 493 wifiDisplayTile.setContent(R.layout.quick_settings_tile_wifi_display, inflater); 494 wifiDisplayTile.setOnClickListener(new View.OnClickListener() { 495 @Override 496 public void onClick(View v) { 497 startSettingsActivity(android.provider.Settings.ACTION_WIFI_DISPLAY_SETTINGS); 498 } 499 }); 500 mModel.addWifiDisplayTile(wifiDisplayTile, new QuickSettingsModel.RefreshCallback() { 501 @Override 502 public void refreshView(QuickSettingsTileView view, State state) { 503 TextView tv = (TextView) view.findViewById(R.id.wifi_display_textview); 504 tv.setText(state.label); 505 view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); 506 } 507 }); 508 parent.addView(wifiDisplayTile); 509 510 // IME 511 QuickSettingsTileView imeTile = (QuickSettingsTileView) 512 inflater.inflate(R.layout.quick_settings_tile, parent, false); 513 imeTile.setContent(R.layout.quick_settings_tile_ime, inflater); 514 imeTile.setOnClickListener(new View.OnClickListener() { 515 @Override 516 public void onClick(View v) { 517 try { 518 mBar.collapseAllPanels(true); 519 Intent intent = new Intent(Settings.ACTION_SHOW_INPUT_METHOD_PICKER); 520 PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); 521 pendingIntent.send(); 522 } catch (Exception e) {} 523 } 524 }); 525 mModel.addImeTile(imeTile, new QuickSettingsModel.RefreshCallback() { 526 @Override 527 public void refreshView(QuickSettingsTileView view, State state) { 528 TextView tv = (TextView) view.findViewById(R.id.ime_textview); 529 if (state.label != null) { 530 tv.setText(state.label); 531 } 532 view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); 533 } 534 }); 535 parent.addView(imeTile); 536 537 // Bug reports 538 QuickSettingsTileView bugreportTile = (QuickSettingsTileView) 539 inflater.inflate(R.layout.quick_settings_tile, parent, false); 540 bugreportTile.setContent(R.layout.quick_settings_tile_bugreport, inflater); 541 bugreportTile.setOnClickListener(new View.OnClickListener() { 542 @Override 543 public void onClick(View v) { 544 mBar.collapseAllPanels(true); 545 showBugreportDialog(); 546 } 547 }); 548 mModel.addBugreportTile(bugreportTile, new QuickSettingsModel.RefreshCallback() { 549 @Override 550 public void refreshView(QuickSettingsTileView view, State state) { 551 view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); 552 } 553 }); 554 parent.addView(bugreportTile); 555 /* 556 QuickSettingsTileView mediaTile = (QuickSettingsTileView) 557 inflater.inflate(R.layout.quick_settings_tile, parent, false); 558 mediaTile.setContent(R.layout.quick_settings_tile_media, inflater); 559 parent.addView(mediaTile); 560 QuickSettingsTileView imeTile = (QuickSettingsTileView) 561 inflater.inflate(R.layout.quick_settings_tile, parent, false); 562 imeTile.setContent(R.layout.quick_settings_tile_ime, inflater); 563 imeTile.setOnClickListener(new View.OnClickListener() { 564 @Override 565 public void onClick(View v) { 566 parent.removeViewAt(0); 567 } 568 }); 569 parent.addView(imeTile); 570 */ 571 } 572 573 void updateResources() { 574 Resources r = mContext.getResources(); 575 576 // Update the User, Time, and Settings tiles spans, and reset everything else 577 int span = r.getInteger(R.integer.quick_settings_user_time_settings_tile_span); 578 for (QuickSettingsTileView v : mDynamicSpannedTiles) { 579 v.setColumnSpan(span); 580 } 581 mContainerView.requestLayout(); 582 583 // Reset the dialog 584 boolean isBrightnessDialogVisible = false; 585 if (mBrightnessDialog != null) { 586 removeAllBrightnessDialogCallbacks(); 587 588 isBrightnessDialogVisible = mBrightnessDialog.isShowing(); 589 mBrightnessDialog.dismiss(); 590 } 591 mBrightnessDialog = null; 592 if (isBrightnessDialogVisible) { 593 showBrightnessDialog(); 594 } 595 } 596 597 private void removeAllBrightnessDialogCallbacks() { 598 mHandler.removeCallbacks(mDismissBrightnessDialogRunnable); 599 } 600 601 private Runnable mDismissBrightnessDialogRunnable = new Runnable() { 602 public void run() { 603 if (mBrightnessDialog != null && mBrightnessDialog.isShowing()) { 604 mBrightnessDialog.dismiss(); 605 } 606 removeAllBrightnessDialogCallbacks(); 607 }; 608 }; 609 610 private void showBrightnessDialog() { 611 if (mBrightnessDialog == null) { 612 mBrightnessDialog = new Dialog(mContext); 613 mBrightnessDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 614 mBrightnessDialog.setContentView(R.layout.quick_settings_brightness_dialog); 615 mBrightnessDialog.setCanceledOnTouchOutside(true); 616 617 mBrightnessController = new BrightnessController(mContext, 618 (ToggleSlider) mBrightnessDialog.findViewById(R.id.brightness_slider)); 619 mBrightnessController.addStateChangedCallback(mModel); 620 mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 621 @Override 622 public void onDismiss(DialogInterface dialog) { 623 mBrightnessController = null; 624 } 625 }); 626 627 mBrightnessDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 628 mBrightnessDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 629 } 630 if (!mBrightnessDialog.isShowing()) { 631 mBrightnessDialog.show(); 632 dismissBrightnessDialog(mBrightnessDialogLongTimeout); 633 } 634 } 635 636 private void dismissBrightnessDialog(int timeout) { 637 if (mBrightnessDialog != null) { 638 mHandler.postDelayed(mDismissBrightnessDialogRunnable, timeout); 639 } 640 } 641 642 private void showBugreportDialog() { 643 final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 644 builder.setPositiveButton(com.android.internal.R.string.report, new OnClickListener() { 645 @Override 646 public void onClick(DialogInterface dialog, int which) { 647 if (which == DialogInterface.BUTTON_POSITIVE) { 648 SystemProperties.set("ctl.start", "bugreport"); 649 } 650 } 651 }); 652 builder.setMessage(com.android.internal.R.string.bugreport_message); 653 builder.setTitle(com.android.internal.R.string.bugreport_title); 654 builder.setCancelable(true); 655 final Dialog dialog = builder.create(); 656 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 657 dialog.show(); 658 } 659 660 private void updateWifiDisplayStatus() { 661 mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus(); 662 applyWifiDisplayStatus(); 663 } 664 665 private void applyWifiDisplayStatus() { 666 mModel.onWifiDisplayStateChanged(mWifiDisplayStatus); 667 } 668 669 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 670 @Override 671 public void onReceive(Context context, Intent intent) { 672 if (intent.getAction().equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) { 673 WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra( 674 DisplayManager.EXTRA_WIFI_DISPLAY_STATUS); 675 mWifiDisplayStatus = status; 676 applyWifiDisplayStatus(); 677 } 678 } 679 }; 680} 681