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