| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.systemui.statusbar.phone; |
| |
| import com.android.internal.view.RotationPolicy; |
| import com.android.internal.widget.LockPatternUtils; |
| import com.android.systemui.R; |
| |
| import com.android.systemui.statusbar.phone.QuickSettingsModel.BluetoothState; |
| import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState; |
| import com.android.systemui.statusbar.phone.QuickSettingsModel.State; |
| import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState; |
| import com.android.systemui.statusbar.phone.QuickSettingsModel.WifiState; |
| import com.android.systemui.statusbar.policy.BatteryController; |
| import com.android.systemui.statusbar.policy.BluetoothController; |
| import com.android.systemui.statusbar.policy.BrightnessController; |
| import com.android.systemui.statusbar.policy.LocationController; |
| import com.android.systemui.statusbar.policy.NetworkController; |
| import com.android.systemui.statusbar.policy.ToggleSlider; |
| |
| import android.app.ActivityManagerNative; |
| import android.app.AlertDialog; |
| import android.app.Dialog; |
| import android.app.PendingIntent; |
| import android.bluetooth.BluetoothAdapter; |
| import android.content.BroadcastReceiver; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.CursorLoader; |
| import android.content.DialogInterface; |
| import android.content.DialogInterface.OnClickListener; |
| import android.content.Intent; |
| import android.content.IntentFilter; |
| import android.content.pm.PackageManager.NameNotFoundException; |
| import android.content.pm.UserInfo; |
| import android.content.res.Resources; |
| import android.database.Cursor; |
| import android.graphics.Bitmap; |
| import android.graphics.drawable.BitmapDrawable; |
| import android.graphics.drawable.Drawable; |
| import android.graphics.drawable.LevelListDrawable; |
| import android.hardware.display.DisplayManager; |
| import android.hardware.display.WifiDisplayStatus; |
| import android.os.AsyncTask; |
| import android.os.Handler; |
| import android.os.RemoteException; |
| import android.os.UserHandle; |
| import android.os.UserManager; |
| import android.provider.ContactsContract; |
| import android.provider.ContactsContract.CommonDataKinds.Phone; |
| import android.provider.ContactsContract.Profile; |
| import android.provider.Settings; |
| import android.util.Log; |
| import android.util.Pair; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.view.Window; |
| import android.view.WindowManager; |
| import android.view.WindowManagerGlobal; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| |
| import java.util.ArrayList; |
| |
| |
| /** |
| * |
| */ |
| class QuickSettings { |
| private static final String TAG = "QuickSettings"; |
| public static final boolean SHOW_IME_TILE = false; |
| |
| private Context mContext; |
| private PanelBar mBar; |
| private QuickSettingsModel mModel; |
| private ViewGroup mContainerView; |
| |
| private DisplayManager mDisplayManager; |
| private WifiDisplayStatus mWifiDisplayStatus; |
| private PhoneStatusBar mStatusBarService; |
| private BluetoothState mBluetoothState; |
| |
| private BrightnessController mBrightnessController; |
| private BluetoothController mBluetoothController; |
| |
| private Dialog mBrightnessDialog; |
| private int mBrightnessDialogShortTimeout; |
| private int mBrightnessDialogLongTimeout; |
| |
| private AsyncTask<Void, Void, Pair<String, Drawable>> mUserInfoTask; |
| |
| private LevelListDrawable mBatteryLevels; |
| private LevelListDrawable mChargingBatteryLevels; |
| |
| boolean mTilesSetUp = false; |
| |
| private Handler mHandler; |
| |
| // The set of QuickSettingsTiles that have dynamic spans (and need to be updated on |
| // configuration change) |
| private final ArrayList<QuickSettingsTileView> mDynamicSpannedTiles = |
| new ArrayList<QuickSettingsTileView>(); |
| |
| private final RotationPolicy.RotationPolicyListener mRotationPolicyListener = |
| new RotationPolicy.RotationPolicyListener() { |
| @Override |
| public void onChange() { |
| mModel.onRotationLockChanged(); |
| } |
| }; |
| |
| public QuickSettings(Context context, QuickSettingsContainerView container) { |
| mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); |
| mContext = context; |
| mContainerView = container; |
| mModel = new QuickSettingsModel(context); |
| mWifiDisplayStatus = new WifiDisplayStatus(); |
| mBluetoothState = new QuickSettingsModel.BluetoothState(); |
| mHandler = new Handler(); |
| |
| Resources r = mContext.getResources(); |
| mBatteryLevels = (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery); |
| mChargingBatteryLevels = |
| (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery_charging); |
| mBrightnessDialogLongTimeout = |
| r.getInteger(R.integer.quick_settings_brightness_dialog_long_timeout); |
| mBrightnessDialogShortTimeout = |
| r.getInteger(R.integer.quick_settings_brightness_dialog_short_timeout); |
| |
| IntentFilter filter = new IntentFilter(); |
| filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED); |
| filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); |
| filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); |
| filter.addAction(Intent.ACTION_USER_SWITCHED); |
| mContext.registerReceiver(mReceiver, filter); |
| |
| IntentFilter profileFilter = new IntentFilter(); |
| profileFilter.addAction(ContactsContract.Intents.ACTION_PROFILE_CHANGED); |
| profileFilter.addAction(Intent.ACTION_USER_INFO_CHANGED); |
| mContext.registerReceiverAsUser(mProfileReceiver, UserHandle.ALL, profileFilter, |
| null, null); |
| } |
| |
| void setBar(PanelBar bar) { |
| mBar = bar; |
| } |
| |
| public void setService(PhoneStatusBar phoneStatusBar) { |
| mStatusBarService = phoneStatusBar; |
| } |
| |
| public PhoneStatusBar getService() { |
| return mStatusBarService; |
| } |
| |
| public void setImeWindowStatus(boolean visible) { |
| mModel.onImeWindowStatusChanged(visible); |
| } |
| |
| void setup(NetworkController networkController, BluetoothController bluetoothController, |
| BatteryController batteryController, LocationController locationController) { |
| mBluetoothController = bluetoothController; |
| |
| setupQuickSettings(); |
| updateWifiDisplayStatus(); |
| updateResources(); |
| |
| networkController.addNetworkSignalChangedCallback(mModel); |
| bluetoothController.addStateChangedCallback(mModel); |
| batteryController.addStateChangedCallback(mModel); |
| locationController.addStateChangedCallback(mModel); |
| RotationPolicy.registerRotationPolicyListener(mContext, mRotationPolicyListener, |
| UserHandle.USER_ALL); |
| } |
| |
| private void queryForUserInformation() { |
| Context currentUserContext = null; |
| UserInfo userInfo = null; |
| try { |
| userInfo = ActivityManagerNative.getDefault().getCurrentUser(); |
| currentUserContext = mContext.createPackageContextAsUser("android", 0, |
| new UserHandle(userInfo.id)); |
| } catch (NameNotFoundException e) { |
| Log.e(TAG, "Couldn't create user context", e); |
| throw new RuntimeException(e); |
| } catch (RemoteException e) { |
| Log.e(TAG, "Couldn't get user info", e); |
| } |
| final int userId = userInfo.id; |
| final String userName = userInfo.name; |
| |
| final Context context = currentUserContext; |
| mUserInfoTask = new AsyncTask<Void, Void, Pair<String, Drawable>>() { |
| @Override |
| protected Pair<String, Drawable> doInBackground(Void... params) { |
| final UserManager um = |
| (UserManager) mContext.getSystemService(Context.USER_SERVICE); |
| |
| // Fall back to the UserManager nickname if we can't read the name from the local |
| // profile below. |
| String name = userName; |
| Drawable avatar = null; |
| Bitmap rawAvatar = um.getUserIcon(userId); |
| if (rawAvatar != null) { |
| avatar = new BitmapDrawable(mContext.getResources(), rawAvatar); |
| } else { |
| avatar = mContext.getResources().getDrawable(R.drawable.ic_qs_default_user); |
| } |
| |
| // If it's a single-user device, get the profile name, since the nickname is not |
| // usually valid |
| if (um.getUsers().size() <= 1) { |
| // Try and read the display name from the local profile |
| final Cursor cursor = context.getContentResolver().query( |
| Profile.CONTENT_URI, new String[] {Phone._ID, Phone.DISPLAY_NAME}, |
| null, null, null); |
| if (cursor != null) { |
| try { |
| if (cursor.moveToFirst()) { |
| name = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)); |
| } |
| } finally { |
| cursor.close(); |
| } |
| } |
| } |
| return new Pair<String, Drawable>(name, avatar); |
| } |
| |
| @Override |
| protected void onPostExecute(Pair<String, Drawable> result) { |
| super.onPostExecute(result); |
| mModel.setUserTileInfo(result.first, result.second); |
| mUserInfoTask = null; |
| } |
| }; |
| mUserInfoTask.execute(); |
| } |
| |
| private void setupQuickSettings() { |
| // Setup the tiles that we are going to be showing (including the temporary ones) |
| LayoutInflater inflater = LayoutInflater.from(mContext); |
| |
| addUserTiles(mContainerView, inflater); |
| addSystemTiles(mContainerView, inflater); |
| addTemporaryTiles(mContainerView, inflater); |
| |
| queryForUserInformation(); |
| mTilesSetUp = true; |
| } |
| |
| private void startSettingsActivity(String action) { |
| Intent intent = new Intent(action); |
| startSettingsActivity(intent); |
| } |
| |
| private void startSettingsActivity(Intent intent) { |
| startSettingsActivity(intent, true); |
| } |
| |
| private void startSettingsActivity(Intent intent, boolean onlyProvisioned) { |
| if (onlyProvisioned && !getService().isDeviceProvisioned()) return; |
| try { |
| // Dismiss the lock screen when Settings starts. |
| ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); |
| } catch (RemoteException e) { |
| } |
| intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); |
| mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); |
| getService().animateCollapsePanels(); |
| } |
| |
| private void addUserTiles(ViewGroup parent, LayoutInflater inflater) { |
| QuickSettingsTileView userTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| userTile.setContent(R.layout.quick_settings_tile_user, inflater); |
| userTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| mBar.collapseAllPanels(true); |
| final UserManager um = |
| (UserManager) mContext.getSystemService(Context.USER_SERVICE); |
| if (um.getUsers(true).size() > 1) { |
| try { |
| WindowManagerGlobal.getWindowManagerService().lockNow( |
| LockPatternUtils.USER_SWITCH_LOCK_OPTIONS); |
| } catch (RemoteException e) { |
| Log.e(TAG, "Couldn't show user switcher", e); |
| } |
| } else { |
| Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent( |
| mContext, v, ContactsContract.Profile.CONTENT_URI, |
| ContactsContract.QuickContact.MODE_LARGE, null); |
| mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); |
| } |
| } |
| }); |
| mModel.addUserTile(userTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| UserState us = (UserState) state; |
| ImageView iv = (ImageView) view.findViewById(R.id.user_imageview); |
| TextView tv = (TextView) view.findViewById(R.id.user_textview); |
| tv.setText(state.label); |
| iv.setImageDrawable(us.avatar); |
| view.setContentDescription(mContext.getString( |
| R.string.accessibility_quick_settings_user, state.label)); |
| } |
| }); |
| parent.addView(userTile); |
| mDynamicSpannedTiles.add(userTile); |
| |
| // Brightness |
| QuickSettingsTileView brightnessTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| brightnessTile.setContent(R.layout.quick_settings_tile_brightness, inflater); |
| brightnessTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| mBar.collapseAllPanels(true); |
| showBrightnessDialog(); |
| } |
| }); |
| mModel.addBrightnessTile(brightnessTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.brightness_textview); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); |
| tv.setText(state.label); |
| dismissBrightnessDialog(mBrightnessDialogShortTimeout); |
| } |
| }); |
| parent.addView(brightnessTile); |
| mDynamicSpannedTiles.add(brightnessTile); |
| |
| // Time tile |
| /* |
| QuickSettingsTileView timeTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| timeTile.setContent(R.layout.quick_settings_tile_time, inflater); |
| timeTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| // Quick. Clock. Quick. Clock. Quick. Clock. |
| startSettingsActivity(Intent.ACTION_QUICK_CLOCK); |
| } |
| }); |
| mModel.addTimeTile(timeTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State alarmState) {} |
| }); |
| parent.addView(timeTile); |
| mDynamicSpannedTiles.add(timeTile); |
| */ |
| |
| // Settings tile |
| QuickSettingsTileView settingsTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| settingsTile.setContent(R.layout.quick_settings_tile_settings, inflater); |
| settingsTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(android.provider.Settings.ACTION_SETTINGS); |
| } |
| }); |
| mModel.addSettingsTile(settingsTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.settings_tileview); |
| tv.setText(state.label); |
| } |
| }); |
| parent.addView(settingsTile); |
| mDynamicSpannedTiles.add(settingsTile); |
| } |
| |
| private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) { |
| // Wi-fi |
| QuickSettingsTileView wifiTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater); |
| wifiTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(android.provider.Settings.ACTION_WIFI_SETTINGS); |
| } |
| }); |
| mModel.addWifiTile(wifiTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| WifiState wifiState = (WifiState) state; |
| TextView tv = (TextView) view.findViewById(R.id.wifi_textview); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, wifiState.iconId, 0, 0); |
| tv.setText(wifiState.label); |
| view.setContentDescription(mContext.getString( |
| R.string.accessibility_quick_settings_wifi, |
| wifiState.signalContentDescription, |
| (wifiState.connected) ? wifiState.label : "")); |
| } |
| }); |
| parent.addView(wifiTile); |
| |
| if (mModel.deviceSupportsTelephony()) { |
| // RSSI |
| QuickSettingsTileView rssiTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| rssiTile.setContent(R.layout.quick_settings_tile_rssi, inflater); |
| rssiTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| Intent intent = new Intent(); |
| intent.setComponent(new ComponentName( |
| "com.android.settings", |
| "com.android.settings.Settings$DataUsageSummaryActivity")); |
| startSettingsActivity(intent); |
| } |
| }); |
| mModel.addRSSITile(rssiTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| RSSIState rssiState = (RSSIState) state; |
| ImageView iv = (ImageView) view.findViewById(R.id.rssi_image); |
| ImageView iov = (ImageView) view.findViewById(R.id.rssi_overlay_image); |
| TextView tv = (TextView) view.findViewById(R.id.rssi_textview); |
| iv.setImageResource(rssiState.signalIconId); |
| |
| if (rssiState.dataTypeIconId > 0) { |
| iov.setImageResource(rssiState.dataTypeIconId); |
| } else { |
| iov.setImageDrawable(null); |
| } |
| tv.setText(state.label); |
| view.setContentDescription(mContext.getResources().getString( |
| R.string.accessibility_quick_settings_mobile, |
| rssiState.signalContentDescription, rssiState.dataContentDescription, |
| state.label)); |
| } |
| }); |
| parent.addView(rssiTile); |
| } |
| |
| // Rotation Lock |
| if (mContext.getResources().getBoolean(R.bool.quick_settings_show_rotation_lock)) { |
| QuickSettingsTileView rotationLockTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| rotationLockTile.setContent(R.layout.quick_settings_tile_rotation_lock, inflater); |
| rotationLockTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| boolean locked = RotationPolicy.isRotationLocked(mContext); |
| RotationPolicy.setRotationLock(mContext, !locked); |
| } |
| }); |
| mModel.addRotationLockTile(rotationLockTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.rotation_lock_textview); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); |
| tv.setText(state.label); |
| } |
| }); |
| parent.addView(rotationLockTile); |
| } |
| |
| // Battery |
| QuickSettingsTileView batteryTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| batteryTile.setContent(R.layout.quick_settings_tile_battery, inflater); |
| batteryTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(Intent.ACTION_POWER_USAGE_SUMMARY); |
| } |
| }); |
| mModel.addBatteryTile(batteryTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| QuickSettingsModel.BatteryState batteryState = |
| (QuickSettingsModel.BatteryState) state; |
| TextView tv = (TextView) view.findViewById(R.id.battery_textview); |
| ImageView iv = (ImageView) view.findViewById(R.id.battery_image); |
| Drawable d = batteryState.pluggedIn |
| ? mChargingBatteryLevels |
| : mBatteryLevels; |
| String t; |
| if (batteryState.batteryLevel == 100) { |
| t = mContext.getString(R.string.quick_settings_battery_charged_label); |
| } else { |
| t = batteryState.pluggedIn |
| ? mContext.getString(R.string.quick_settings_battery_charging_label, |
| batteryState.batteryLevel) |
| : mContext.getString(R.string.status_bar_settings_battery_meter_format, |
| batteryState.batteryLevel); |
| } |
| iv.setImageDrawable(d); |
| iv.setImageLevel(batteryState.batteryLevel); |
| tv.setText(t); |
| view.setContentDescription( |
| mContext.getString(R.string.accessibility_quick_settings_battery, t)); |
| } |
| }); |
| parent.addView(batteryTile); |
| |
| // Airplane Mode |
| QuickSettingsTileView airplaneTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| airplaneTile.setContent(R.layout.quick_settings_tile_airplane, inflater); |
| mModel.addAirplaneModeTile(airplaneTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.airplane_mode_textview); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); |
| |
| String airplaneState = mContext.getString( |
| (state.enabled) ? R.string.accessibility_desc_on |
| : R.string.accessibility_desc_off); |
| view.setContentDescription( |
| mContext.getString(R.string.accessibility_quick_settings_airplane, airplaneState)); |
| tv.setText(state.label); |
| } |
| }); |
| parent.addView(airplaneTile); |
| |
| // Bluetooth |
| if (mModel.deviceSupportsBluetooth()) { |
| QuickSettingsTileView bluetoothTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| bluetoothTile.setContent(R.layout.quick_settings_tile_bluetooth, inflater); |
| bluetoothTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS); |
| } |
| }); |
| mModel.addBluetoothTile(bluetoothTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| BluetoothState bluetoothState = (BluetoothState) state; |
| TextView tv = (TextView) view.findViewById(R.id.bluetooth_textview); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); |
| |
| Resources r = mContext.getResources(); |
| String label = state.label; |
| /* |
| //TODO: Show connected bluetooth device label |
| Set<BluetoothDevice> btDevices = |
| mBluetoothController.getBondedBluetoothDevices(); |
| if (btDevices.size() == 1) { |
| // Show the name of the bluetooth device you are connected to |
| label = btDevices.iterator().next().getName(); |
| } else if (btDevices.size() > 1) { |
| // Show a generic label about the number of bluetooth devices |
| label = r.getString(R.string.quick_settings_bluetooth_multiple_devices_label, |
| btDevices.size()); |
| } |
| */ |
| view.setContentDescription(mContext.getString( |
| R.string.accessibility_quick_settings_bluetooth, |
| bluetoothState.stateContentDescription)); |
| tv.setText(label); |
| } |
| }); |
| parent.addView(bluetoothTile); |
| } |
| |
| } |
| |
| private void addTemporaryTiles(final ViewGroup parent, final LayoutInflater inflater) { |
| // Alarm tile |
| QuickSettingsTileView alarmTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| alarmTile.setContent(R.layout.quick_settings_tile_alarm, inflater); |
| alarmTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| // TODO: Jump into the alarm application |
| Intent intent = new Intent(); |
| intent.setComponent(new ComponentName( |
| "com.google.android.deskclock", |
| "com.android.deskclock.AlarmClock")); |
| startSettingsActivity(intent); |
| } |
| }); |
| mModel.addAlarmTile(alarmTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State alarmState) { |
| TextView tv = (TextView) view.findViewById(R.id.alarm_textview); |
| tv.setText(alarmState.label); |
| view.setVisibility(alarmState.enabled ? View.VISIBLE : View.GONE); |
| view.setContentDescription(mContext.getString( |
| R.string.accessibility_quick_settings_alarm, alarmState.label)); |
| } |
| }); |
| parent.addView(alarmTile); |
| |
| // Location |
| QuickSettingsTileView locationTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| locationTile.setContent(R.layout.quick_settings_tile_location, inflater); |
| locationTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); |
| } |
| }); |
| mModel.addLocationTile(locationTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.location_textview); |
| tv.setText(state.label); |
| view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); |
| } |
| }); |
| parent.addView(locationTile); |
| |
| // Wifi Display |
| QuickSettingsTileView wifiDisplayTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| wifiDisplayTile.setContent(R.layout.quick_settings_tile_wifi_display, inflater); |
| wifiDisplayTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| startSettingsActivity(android.provider.Settings.ACTION_WIFI_DISPLAY_SETTINGS); |
| } |
| }); |
| mModel.addWifiDisplayTile(wifiDisplayTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.wifi_display_textview); |
| tv.setText(state.label); |
| tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0); |
| view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); |
| } |
| }); |
| parent.addView(wifiDisplayTile); |
| |
| if (SHOW_IME_TILE) { |
| // IME |
| QuickSettingsTileView imeTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| imeTile.setContent(R.layout.quick_settings_tile_ime, inflater); |
| imeTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| try { |
| mBar.collapseAllPanels(true); |
| Intent intent = new Intent(Settings.ACTION_SHOW_INPUT_METHOD_PICKER); |
| PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); |
| pendingIntent.send(); |
| } catch (Exception e) {} |
| } |
| }); |
| mModel.addImeTile(imeTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| TextView tv = (TextView) view.findViewById(R.id.ime_textview); |
| if (state.label != null) { |
| tv.setText(state.label); |
| } |
| view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); |
| } |
| }); |
| parent.addView(imeTile); |
| } |
| |
| // Bug reports |
| QuickSettingsTileView bugreportTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| bugreportTile.setContent(R.layout.quick_settings_tile_bugreport, inflater); |
| bugreportTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| mBar.collapseAllPanels(true); |
| showBugreportDialog(); |
| } |
| }); |
| mModel.addBugreportTile(bugreportTile, new QuickSettingsModel.RefreshCallback() { |
| @Override |
| public void refreshView(QuickSettingsTileView view, State state) { |
| view.setVisibility(state.enabled ? View.VISIBLE : View.GONE); |
| } |
| }); |
| parent.addView(bugreportTile); |
| /* |
| QuickSettingsTileView mediaTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| mediaTile.setContent(R.layout.quick_settings_tile_media, inflater); |
| parent.addView(mediaTile); |
| QuickSettingsTileView imeTile = (QuickSettingsTileView) |
| inflater.inflate(R.layout.quick_settings_tile, parent, false); |
| imeTile.setContent(R.layout.quick_settings_tile_ime, inflater); |
| imeTile.setOnClickListener(new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| parent.removeViewAt(0); |
| } |
| }); |
| parent.addView(imeTile); |
| */ |
| } |
| |
| void updateResources() { |
| Resources r = mContext.getResources(); |
| |
| // Update the model |
| mModel.updateResources(); |
| |
| // Update the User, Time, and Settings tiles spans, and reset everything else |
| int span = r.getInteger(R.integer.quick_settings_user_time_settings_tile_span); |
| for (QuickSettingsTileView v : mDynamicSpannedTiles) { |
| v.setColumnSpan(span); |
| } |
| ((QuickSettingsContainerView)mContainerView).updateResources(); |
| mContainerView.requestLayout(); |
| |
| // Reset the dialog |
| boolean isBrightnessDialogVisible = false; |
| if (mBrightnessDialog != null) { |
| removeAllBrightnessDialogCallbacks(); |
| |
| isBrightnessDialogVisible = mBrightnessDialog.isShowing(); |
| mBrightnessDialog.dismiss(); |
| } |
| mBrightnessDialog = null; |
| if (isBrightnessDialogVisible) { |
| showBrightnessDialog(); |
| } |
| } |
| |
| private void removeAllBrightnessDialogCallbacks() { |
| mHandler.removeCallbacks(mDismissBrightnessDialogRunnable); |
| } |
| |
| private Runnable mDismissBrightnessDialogRunnable = new Runnable() { |
| public void run() { |
| if (mBrightnessDialog != null && mBrightnessDialog.isShowing()) { |
| mBrightnessDialog.dismiss(); |
| } |
| removeAllBrightnessDialogCallbacks(); |
| }; |
| }; |
| |
| private void showBrightnessDialog() { |
| if (mBrightnessDialog == null) { |
| mBrightnessDialog = new Dialog(mContext); |
| mBrightnessDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); |
| mBrightnessDialog.setContentView(R.layout.quick_settings_brightness_dialog); |
| mBrightnessDialog.setCanceledOnTouchOutside(true); |
| |
| mBrightnessController = new BrightnessController(mContext, |
| (ImageView) mBrightnessDialog.findViewById(R.id.brightness_icon), |
| (ToggleSlider) mBrightnessDialog.findViewById(R.id.brightness_slider)); |
| mBrightnessController.addStateChangedCallback(mModel); |
| mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { |
| @Override |
| public void onDismiss(DialogInterface dialog) { |
| mBrightnessController = null; |
| } |
| }); |
| |
| mBrightnessDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); |
| mBrightnessDialog.getWindow().getAttributes().privateFlags |= |
| WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; |
| mBrightnessDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); |
| } |
| if (!mBrightnessDialog.isShowing()) { |
| try { |
| WindowManagerGlobal.getWindowManagerService().dismissKeyguard(); |
| } catch (RemoteException e) { |
| } |
| mBrightnessDialog.show(); |
| dismissBrightnessDialog(mBrightnessDialogLongTimeout); |
| } |
| } |
| |
| private void dismissBrightnessDialog(int timeout) { |
| removeAllBrightnessDialogCallbacks(); |
| if (mBrightnessDialog != null) { |
| mHandler.postDelayed(mDismissBrightnessDialogRunnable, timeout); |
| } |
| } |
| |
| private void showBugreportDialog() { |
| final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); |
| builder.setPositiveButton(com.android.internal.R.string.report, new OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| if (which == DialogInterface.BUTTON_POSITIVE) { |
| // Add a little delay before executing, to give the |
| // dialog a chance to go away before it takes a |
| // screenshot. |
| mHandler.postDelayed(new Runnable() { |
| @Override public void run() { |
| try { |
| ActivityManagerNative.getDefault() |
| .requestBugReport(); |
| } catch (RemoteException e) { |
| } |
| } |
| }, 500); |
| } |
| } |
| }); |
| builder.setMessage(com.android.internal.R.string.bugreport_message); |
| builder.setTitle(com.android.internal.R.string.bugreport_title); |
| builder.setCancelable(true); |
| final Dialog dialog = builder.create(); |
| dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); |
| try { |
| WindowManagerGlobal.getWindowManagerService().dismissKeyguard(); |
| } catch (RemoteException e) { |
| } |
| dialog.show(); |
| } |
| |
| private void updateWifiDisplayStatus() { |
| mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus(); |
| applyWifiDisplayStatus(); |
| } |
| |
| private void applyWifiDisplayStatus() { |
| mModel.onWifiDisplayStateChanged(mWifiDisplayStatus); |
| } |
| |
| private void applyBluetoothStatus() { |
| mModel.onBluetoothStateChange(mBluetoothState); |
| } |
| |
| void reloadUserInfo() { |
| if (mUserInfoTask != null) { |
| mUserInfoTask.cancel(false); |
| mUserInfoTask = null; |
| } |
| if (mTilesSetUp) { |
| queryForUserInformation(); |
| } |
| } |
| |
| private final BroadcastReceiver mReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| final String action = intent.getAction(); |
| if (DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED.equals(action)) { |
| WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra( |
| DisplayManager.EXTRA_WIFI_DISPLAY_STATUS); |
| mWifiDisplayStatus = status; |
| applyWifiDisplayStatus(); |
| } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { |
| int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, |
| BluetoothAdapter.ERROR); |
| mBluetoothState.enabled = (state == BluetoothAdapter.STATE_ON); |
| applyBluetoothStatus(); |
| } else if (BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED.equals(action)) { |
| int status = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, |
| BluetoothAdapter.STATE_DISCONNECTED); |
| mBluetoothState.connected = (status == BluetoothAdapter.STATE_CONNECTED); |
| applyBluetoothStatus(); |
| } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { |
| reloadUserInfo(); |
| } |
| } |
| }; |
| |
| private final BroadcastReceiver mProfileReceiver = new BroadcastReceiver() { |
| @Override |
| public void onReceive(Context context, Intent intent) { |
| final String action = intent.getAction(); |
| if (ContactsContract.Intents.ACTION_PROFILE_CHANGED.equals(action) || |
| Intent.ACTION_USER_INFO_CHANGED.equals(action)) { |
| try { |
| final int userId = ActivityManagerNative.getDefault().getCurrentUser().id; |
| if (getSendingUserId() == userId) { |
| reloadUserInfo(); |
| } |
| } catch (RemoteException e) { |
| Log.e(TAG, "Couldn't get current user id for profile change", e); |
| } |
| } |
| |
| } |
| }; |
| } |