GlobalActions.java revision 19caadc08f09cc9f6665fbbb0d61e02861ce8562
11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/* 21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License. 61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at 71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and 141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License. 151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 19742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.app.ShutdownThread; 20742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.telephony.TelephonyIntents; 21742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.telephony.TelephonyProperties; 22742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.R; 23742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 24742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.app.ActivityManagerNative; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.AlertDialog; 26135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.app.admin.DevicePolicyManager; 271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.DialogInterface; 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 32742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo; 331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.media.AudioManager; 341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 35135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.IBinder; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 37742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.RemoteException; 38135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.ServiceManager; 39fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guoimport android.os.SystemProperties; 40135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.Vibrator; 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.provider.Settings; 421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.PhoneStateListener; 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.ServiceState; 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.TelephonyManager; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log; 46135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.view.IWindowManager; 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup; 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager; 5119caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackbornimport android.widget.AdapterView; 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.BaseAdapter; 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.ImageView; 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.TextView; 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport java.util.ArrayList; 57742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.List; 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helper to show the global actions dialog. Each item is an {@link Action} that 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * may show depending on whether the keyguard is showing, and whether the device 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is provisioned. 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectclass GlobalActions implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final String TAG = "GlobalActions"; 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 686243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final boolean SHOW_SILENT_TOGGLE = true; 692ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final Context mContext; 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final AudioManager mAudioManager; 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ArrayList<Action> mItems; 741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlertDialog mDialog; 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 766243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private SilentModeAction mSilentModeAction; 771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ToggleAction mAirplaneModeOn; 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private MyAdapter mAdapter; 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mKeyguardShowing = false; 821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mDeviceProvisioned = false; 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ToggleAction.State mAirplaneState = ToggleAction.State.Off; 84fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo private boolean mIsWaitingForEcmExit = false; 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 86135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani private IWindowManager mIWindowManager; 87135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param context everything needs a context :( 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public GlobalActions(Context context) { 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // receive broadcasts 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project IntentFilter filter = new IntentFilter(); 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 9878866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato filter.addAction(Intent.ACTION_SCREEN_OFF); 99fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context.registerReceiver(mBroadcastReceiver, filter); 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // get notified of phone state changes 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TelephonyManager telephonyManager = 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Show the global actions dialog (creating if necessary) 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyguardShowing True if keyguard is showing 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) { 1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardShowing = keyguardShowing; 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDeviceProvisioned = isDeviceProvisioned; 115742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (mDialog != null) { 116742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mDialog.dismiss(); 1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 118742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mDialog = createDialog(); 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project prepareDialog(); 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.show(); 122ec3f05e707044505642cbdb180aff5edf9b926aaDaniel Sandler mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND); 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Create the global actions dialog. 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return A new dialog. 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlertDialog createDialog() { 130135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani mSilentModeAction = new SilentModeAction(mContext, mAudioManager, mHandler); 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn = new ToggleAction( 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.drawable.ic_lock_airplane_mode, 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.drawable.ic_lock_airplane_mode_off, 1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_toggle_airplane_mode, 1361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_airplane_mode_on_status, 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_airplane_mode_off_status) { 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project void onToggle(boolean on) { 140fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo if (Boolean.parseBoolean( 141fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { 142fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit = true; 143fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // Launch ECM exit dialog 144fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Intent ecmDialogIntent = 145fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null); 146fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 147fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.startActivity(ecmDialogIntent); 148fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } else { 149fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo changeAirplaneModeSystemSetting(on); 150fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected void changeStateFromPress(boolean buttonOn) { 155fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // In ECM mode airplane state cannot be changed 156fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo if (!(Boolean.parseBoolean( 157fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))) { 158fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mState = buttonOn ? State.TurningOn : State.TurningOff; 159fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mAirplaneState = mState; 160fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean showDuringKeyguard() { 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean showBeforeProvisioning() { 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1722ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani mItems = new ArrayList<Action>(); 1732ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 1746243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // first: power off 1752ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani mItems.add( 1762ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani new SinglePressAction( 1772ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani com.android.internal.R.drawable.ic_lock_power_off, 1782ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani R.string.global_action_power_off) { 1792ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 1802ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public void onPress() { 1812ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani // shutdown by making sure radio and power are handled accordingly. 1822ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani ShutdownThread.shutdown(mContext, true); 1832ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 1842ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 18519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 18619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn ShutdownThread.rebootSafeMode(mContext, true); 18719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return true; 18819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 18919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 1902ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public boolean showDuringKeyguard() { 1912ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani return true; 1922ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 1932ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 1942ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public boolean showBeforeProvisioning() { 1952ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani return true; 1962ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 1972ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani }); 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1996243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // next: airplane mode 2006243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mItems.add(mAirplaneModeOn); 2016243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 2026243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // last: silent mode 2036243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 2046243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mItems.add(mSilentModeAction); 2056243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 2066243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 207742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani List<UserInfo> users = mContext.getPackageManager().getUsers(); 208742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (users.size() > 1) { 20952f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani UserInfo currentUser; 21052f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani try { 21152f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani currentUser = ActivityManagerNative.getDefault().getCurrentUser(); 21252f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani } catch (RemoteException re) { 21352f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani currentUser = null; 21452f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani } 215742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (final UserInfo user : users) { 21652f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani boolean isCurrentUser = currentUser == null 21752f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani ? user.id == 0 : (currentUser.id == user.id); 218742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani SinglePressAction switchToUser = new SinglePressAction( 219742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani com.android.internal.R.drawable.ic_menu_cc, 22052f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani (user.name != null ? user.name : "Primary") 22152f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani + (isCurrentUser ? " \u2714" : "")) { 222742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public void onPress() { 223742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani try { 224742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ActivityManagerNative.getDefault().switchUser(user.id); 225135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani getWindowManager().lockNow(); 226742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } catch (RemoteException re) { 227742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Log.e(TAG, "Couldn't switch user " + re); 228742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 229742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 230742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 231742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public boolean showDuringKeyguard() { 232742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return true; 233742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 234742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 235742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public boolean showBeforeProvisioning() { 236742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return false; 237742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 238742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani }; 239742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mItems.add(switchToUser); 240742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 241742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter = new MyAdapter(); 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final AlertDialog.Builder ab = new AlertDialog.Builder(mContext); 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ab.setAdapter(mAdapter, this) 2476243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani .setInverseBackgroundForced(true); 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final AlertDialog dialog = ab.create(); 250e48a160e57a6426be81bfa18dd35324a36f6a74dAmith Yamasani dialog.getListView().setItemsCanFocus(true); 25119caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn dialog.getListView().setLongClickable(true); 25219caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn dialog.getListView().setOnItemLongClickListener( 25319caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn new AdapterView.OnItemLongClickListener() { 25419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn @Override 25519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onItemLongClick(AdapterView<?> parent, View view, int position, 25619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn long id) { 25719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return mAdapter.getItem(position).onLongPress(); 25819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 25919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn }); 2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project dialog.setOnDismissListener(this); 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return dialog; 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void prepareDialog() { 2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean silentModeOn = 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn.updateState(mAirplaneState); 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.notifyDataSetChanged(); 2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing) { 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 275fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2776243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 2786243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); 2796243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mContext.registerReceiver(mRingerModeReceiver, filter); 2806243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onDismiss(DialogInterface dialog) { 2866243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 2876243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mContext.unregisterReceiver(mRingerModeReceiver); 2886243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 2891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 2921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 2936243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (!(mAdapter.getItem(which) instanceof SilentModeAction)) { 2946243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani dialog.dismiss(); 2956243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 2961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.getItem(which).onPress(); 2971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The adapter used for the list within the global actions dialog, taking 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * into account whether the keyguard is showing via 3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link GlobalActions#mKeyguardShowing} and whether the device is provisioned 3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * via {@link GlobalActions#mDeviceProvisioned}. 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private class MyAdapter extends BaseAdapter { 3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public int getCount() { 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int count = 0; 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project for (int i = 0; i < mItems.size(); i++) { 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final Action action = mItems.get(i); 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing && !action.showDuringKeyguard()) { 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned && !action.showBeforeProvisioning()) { 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project count++; 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return count; 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled(int position) { 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return getItem(position).isEnabled(); 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean areAllItemsEnabled() { 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public Action getItem(int position) { 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int filteredPos = 0; 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project for (int i = 0; i < mItems.size(); i++) { 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final Action action = mItems.get(i); 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing && !action.showDuringKeyguard()) { 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned && !action.showBeforeProvisioning()) { 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (filteredPos == position) { 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return action; 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filteredPos++; 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 351c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer throw new IllegalArgumentException("position " + position 352c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + " out of range of showable actions" 353c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + ", filtered count=" + getCount() 354c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + ", keyguardshowing=" + mKeyguardShowing 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + ", provisioned=" + mDeviceProvisioned); 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public long getItemId(int position) { 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return position; 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Action action = getItem(position); 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return action.create(mContext, convertView, parent, LayoutInflater.from(mContext)); 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // note: the scheme below made more sense when we were planning on having 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // 8 different things in the global actions dialog. seems overkill with 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // only 3 items now, but may as well keep this flexible approach so it will 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // be easy should someone decide at the last minute to include something 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // else, such as 'enable wifi', or 'enable bluetooth' 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * What each item in the global actions dialog must be able to support. 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private interface Action { 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater); 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project void onPress(); 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 38319caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress(); 38419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return whether this action should appear in the dialog when the keygaurd 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is showing. 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean showDuringKeyguard(); 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return whether this action should appear in the dialog before the 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * device is provisioned. 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean showBeforeProvisioning(); 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean isEnabled(); 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * A single press action maintains no state, just responds to a press 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and takes an action. 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static abstract class SinglePressAction implements Action { 4051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int mIconResId; 4061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int mMessageResId; 407742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private final CharSequence mMessage; 4081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected SinglePressAction(int iconResId, int messageResId) { 4101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mIconResId = iconResId; 4111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mMessageResId = messageResId; 412742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessage = null; 4131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 415742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani protected SinglePressAction(int iconResId, CharSequence message) { 416742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mIconResId = iconResId; 417742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessageResId = 0; 418742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessage = message; 419742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 4201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled() { 4211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 4221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract public void onPress(); 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 42619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 42719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 42819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 42919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 4301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View create( 4311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Context context, View convertView, ViewGroup parent, LayoutInflater inflater) { 4326243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R.layout.global_actions_item, parent, false); 4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ImageView icon = (ImageView) v.findViewById(R.id.icon); 4351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView messageView = (TextView) v.findViewById(R.id.message); 4361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project v.findViewById(R.id.status).setVisibility(View.GONE); 4381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project icon.setImageDrawable(context.getResources().getDrawable(mIconResId)); 440742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (mMessage != null) { 441742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani messageView.setText(mMessage); 442742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 443742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani messageView.setText(mMessageResId); 444742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 4451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return v; 4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * A toggle action knows whether it is on or off, and displays an icon 4521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and status message accordingly. 4531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static abstract class ToggleAction implements Action { 4551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project enum State { 4571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Off(false), 4581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TurningOn(true), 4591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TurningOff(true), 4601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project On(false); 4611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final boolean inTransition; 4631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project State(boolean intermediate) { 4651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project inTransition = intermediate; 4661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean inTransition() { 4691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return inTransition; 4701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected State mState = State.Off; 4741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // prefs 47682d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mEnabledIconResId; 47782d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mDisabledIconResid; 47882d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mMessageResId; 47982d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mEnabledStatusMessageResId; 48082d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mDisabledStatusMessageResId; 4811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param enabledIconResId The icon for when this action is on. 4841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param disabledIconResid The icon for when this action is off. 4851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param essage The general information message, e.g 'Silent Mode' 4861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param enabledStatusMessageResId The on status message, e.g 'sound disabled' 4871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled' 4881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public ToggleAction(int enabledIconResId, 4901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int disabledIconResid, 4911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int essage, 4921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int enabledStatusMessageResId, 4931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int disabledStatusMessageResId) { 4941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnabledIconResId = enabledIconResId; 4951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDisabledIconResid = disabledIconResid; 4961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mMessageResId = essage; 4971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnabledStatusMessageResId = enabledStatusMessageResId; 4981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDisabledStatusMessageResId = disabledStatusMessageResId; 4991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 50182d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler /** 50282d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler * Override to make changes to resource IDs just before creating the 50382d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler * View. 50482d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler */ 50582d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler void willCreate() { 50682d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 50782d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler } 50882d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 5091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View create(Context context, View convertView, ViewGroup parent, 5101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LayoutInflater inflater) { 51182d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler willCreate(); 51282d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 5136243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R 5141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .layout.global_actions_item, parent, false); 5151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ImageView icon = (ImageView) v.findViewById(R.id.icon); 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView messageView = (TextView) v.findViewById(R.id.message); 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView statusView = (TextView) v.findViewById(R.id.status); 5196243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani final boolean enabled = isEnabled(); 5201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5216243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (messageView != null) { 5226243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani messageView.setText(mMessageResId); 5236243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani messageView.setEnabled(enabled); 5246243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 5251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean on = ((mState == State.On) || (mState == State.TurningOn)); 5276243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (icon != null) { 5286243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani icon.setImageDrawable(context.getResources().getDrawable( 5296243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani (on ? mEnabledIconResId : mDisabledIconResid))); 5306243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani icon.setEnabled(enabled); 5316243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 5321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5336243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (statusView != null) { 5346243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId); 5356243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setVisibility(View.VISIBLE); 5366243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setEnabled(enabled); 5376243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 5381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project v.setEnabled(enabled); 5391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return v; 5411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public final void onPress() { 5441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mState.inTransition()) { 5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.w(TAG, "shouldn't be able to toggle when in transition"); 5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 5471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean nowOn = !(mState == State.On); 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onToggle(nowOn); 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project changeStateFromPress(nowOn); 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 55419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 55519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 55619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 55719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled() { 5591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return !mState.inTransition(); 5601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Implementations may override this if their state can be in on of the intermediate 5641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * states until some notification is received (e.g airplane mode is 'turning off' until 5651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we know the wireless connections are back online 5661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param buttonOn Whether the button was turned on or off 5671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected void changeStateFromPress(boolean buttonOn) { 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mState = buttonOn ? State.On : State.Off; 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract void onToggle(boolean on); 5731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void updateState(State state) { 5751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mState = state; 5761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5796243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static class SilentModeAction implements Action, View.OnClickListener { 5806243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 5816243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final int[] ITEM_IDS = { R.id.option1, R.id.option2, R.id.option3 }; 5826243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 5836243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final AudioManager mAudioManager; 5846243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final Handler mHandler; 585135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani private final boolean mHasVibrator; 586135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani private final Context mContext; 5876243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 588135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani SilentModeAction(Context context, AudioManager audioManager, Handler handler) { 5896243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAudioManager = audioManager; 5906243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler = handler; 591135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani mContext = context; 592135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); 593135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani mHasVibrator = vibrator != null && vibrator.hasVibrator(); 5946243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 5956243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 5966243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private int ringerModeToIndex(int ringerMode) { 5976243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // They just happen to coincide 5986243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return ringerMode; 5996243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6006243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6016243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private int indexToRingerMode(int index) { 6026243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // They just happen to coincide 6036243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return index; 6046243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6056243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6066243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public View create(Context context, View convertView, ViewGroup parent, 6076243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani LayoutInflater inflater) { 6086243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false); 6096243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6106243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani int selectedIndex = ringerModeToIndex(mAudioManager.getRingerMode()); 6116243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani for (int i = 0; i < 3; i++) { 6126243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View itemView = v.findViewById(ITEM_IDS[i]); 6136243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setSelected(selectedIndex == i); 6146243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // Set up click handler 6156243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setTag(i); 6166243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setOnClickListener(this); 617135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (itemView.getId() == R.id.option2 && !mHasVibrator) { 618135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani itemView.setVisibility(View.GONE); 619135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } 6206243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6216243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return v; 6226243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6236243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6246243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onPress() { 6256243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6266243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 62719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 62819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 62919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 63019caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 6316243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean showDuringKeyguard() { 6326243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return true; 6336243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6346243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6356243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean showBeforeProvisioning() { 6366243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return false; 6376243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6386243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6396243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean isEnabled() { 6406243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return true; 6416243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6426243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6436243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani void willCreate() { 6446243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6456243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6466243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onClick(View v) { 6476243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (!(v.getTag() instanceof Integer)) return; 6486243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6496243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani int index = (Integer) v.getTag(); 6506243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAudioManager.setRingerMode(indexToRingerMode(index)); 6516243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler.sendEmptyMessageDelayed(MESSAGE_DISMISS, DIALOG_DISMISS_DELAY); 6526243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6536243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6546243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 6561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 6571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project String action = intent.getAction(); 65878866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 65978866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 6601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project String reason = intent.getStringExtra(PhoneWindowManager.SYSTEM_DIALOG_REASON_KEY); 66178866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato if (!PhoneWindowManager.SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) { 6621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(MESSAGE_DISMISS); 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 664fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } else if (TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(action)) { 665fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // Airplane mode can be changed after ECM exits if airplane toggle button 666fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // is pressed during ECM mode 667fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo if (!(intent.getBooleanExtra("PHONE_IN_ECM_STATE", false)) && 668fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit) { 669fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit = false; 670fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo changeAirplaneModeSystemSetting(true); 671fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 6721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 6751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PhoneStateListener mPhoneStateListener = new PhoneStateListener() { 6771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 6781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onServiceStateChanged(ServiceState serviceState) { 6791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean inAirplaneMode = serviceState.getState() == ServiceState.STATE_POWER_OFF; 6801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneState = inAirplaneMode ? ToggleAction.State.On : ToggleAction.State.Off; 6811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn.updateState(mAirplaneState); 6821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.notifyDataSetChanged(); 6831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 6851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6866243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private BroadcastReceiver mRingerModeReceiver = new BroadcastReceiver() { 6876243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani @Override 6886243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onReceive(Context context, Intent intent) { 6896243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { 6906243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler.sendEmptyMessage(MESSAGE_REFRESH); 6916243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6926243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6936243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani }; 6946243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int MESSAGE_DISMISS = 0; 6966243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final int MESSAGE_REFRESH = 1; 6976243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final int DIALOG_DISMISS_DELAY = 300; // ms 6986243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 6991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Handler mHandler = new Handler() { 7001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void handleMessage(Message msg) { 7011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (msg.what == MESSAGE_DISMISS) { 7021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mDialog != null) { 7031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.dismiss(); 7041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7056243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } else if (msg.what == MESSAGE_REFRESH) { 7066243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAdapter.notifyDataSetChanged(); 7071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 710fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo 711fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo /** 712fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo * Change the airplane mode system setting 713fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo */ 714fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo private void changeAirplaneModeSystemSetting(boolean on) { 715fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Settings.System.putInt( 716fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.getContentResolver(), 717fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Settings.System.AIRPLANE_MODE_ON, 718fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo on ? 1 : 0); 719fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 720818ba11cd680de336fb9278b64a21dc2efb7517eDianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 721fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo intent.putExtra("state", on); 722fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.sendBroadcast(intent); 723fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 724135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani 725135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani private IWindowManager getWindowManager() { 726135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani if (mIWindowManager == null) { 727135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani IBinder b = ServiceManager.getService(Context.WINDOW_SERVICE); 728135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani mIWindowManager = IWindowManager.Stub.asInterface(b); 729135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } 730135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani return mIWindowManager; 731135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani } 7321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 733