GlobalActions.java revision 9a538ee7bde42ad36f43edc48594282d98e191a4
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.telephony.TelephonyIntents; 20742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.telephony.TelephonyProperties; 21742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport com.android.internal.R; 22742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 23742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.app.ActivityManagerNative; 241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.AlertDialog; 251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.BroadcastReceiver; 261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.DialogInterface; 281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent; 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.IntentFilter; 30742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo; 317ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasaniimport android.database.ContentObserver; 32b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasaniimport android.graphics.drawable.Drawable; 331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.media.AudioManager; 347ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasaniimport android.net.ConnectivityManager; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Handler; 36135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.IBinder; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.Message; 38742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.RemoteException; 39135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.ServiceManager; 40fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guoimport android.os.SystemProperties; 41258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.UserManager; 42135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.os.Vibrator; 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.provider.Settings; 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.PhoneStateListener; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.ServiceState; 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.telephony.TelephonyManager; 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.util.Log; 48135936072b24b090fb63940aea41b408d855a4f3Amith Yamasaniimport android.view.IWindowManager; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater; 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View; 511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.ViewGroup; 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager; 5398365d7663cbd82979a5700faf0050220b01084dJeff Brownimport android.view.WindowManagerGlobal; 547304c343821309dd15f769b18f1de2fa43751573Jeff Brownimport android.view.WindowManagerPolicy.WindowManagerFuncs; 5519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackbornimport android.widget.AdapterView; 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.BaseAdapter; 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.ImageView; 58b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasaniimport android.widget.ImageView.ScaleType; 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.TextView; 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport java.util.ArrayList; 62742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.List; 631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helper to show the global actions dialog. Each item is an {@link Action} that 661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * may show depending on whether the keyguard is showing, and whether the device 671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is provisioned. 681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectclass GlobalActions implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final String TAG = "GlobalActions"; 721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 736243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final boolean SHOW_SILENT_TOGGLE = true; 742ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final Context mContext; 767304c343821309dd15f769b18f1de2fa43751573Jeff Brown private final WindowManagerFuncs mWindowManagerFuncs; 771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final AudioManager mAudioManager; 781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ArrayList<Action> mItems; 801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlertDialog mDialog; 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 827ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private Action mSilentModeAction; 831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ToggleAction mAirplaneModeOn; 841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private MyAdapter mAdapter; 861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mKeyguardShowing = false; 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private boolean mDeviceProvisioned = false; 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ToggleAction.State mAirplaneState = ToggleAction.State.Off; 90fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo private boolean mIsWaitingForEcmExit = false; 917ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private boolean mHasTelephony; 927ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private boolean mHasVibrator; 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param context everything needs a context :( 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 977304c343821309dd15f769b18f1de2fa43751573Jeff Brown public GlobalActions(Context context, WindowManagerFuncs windowManagerFuncs) { 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext = context; 997304c343821309dd15f769b18f1de2fa43751573Jeff Brown mWindowManagerFuncs = windowManagerFuncs; 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // receive broadcasts 1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project IntentFilter filter = new IntentFilter(); 1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 10578866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato filter.addAction(Intent.ACTION_SCREEN_OFF); 106fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project context.registerReceiver(mBroadcastReceiver, filter); 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // get notified of phone state changes 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TelephonyManager telephonyManager = 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); 1137ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani ConnectivityManager cm = (ConnectivityManager) 1147ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani context.getSystemService(Context.CONNECTIVITY_SERVICE); 1157ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mHasTelephony = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); 1167ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mContext.getContentResolver().registerContentObserver( 1177ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani Settings.System.getUriFor(Settings.System.AIRPLANE_MODE_ON), true, 1187ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAirplaneModeObserver); 1197ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); 1207ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mHasVibrator = vibrator != null && vibrator.hasVibrator(); 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Show the global actions dialog (creating if necessary) 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param keyguardShowing True if keyguard is showing 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) { 1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mKeyguardShowing = keyguardShowing; 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDeviceProvisioned = isDeviceProvisioned; 130742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (mDialog != null) { 131742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mDialog.dismiss(); 1322efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani mDialog = null; 1332efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani // Show delayed, so that the dismiss of the previous dialog completes 1342efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani mHandler.sendEmptyMessage(MESSAGE_SHOW); 1352efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani } else { 1362efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani handleShow(); 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1382efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani } 1392efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani 1402efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani private void handleShow() { 141742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mDialog = createDialog(); 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project prepareDialog(); 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.show(); 145ec3f05e707044505642cbdb180aff5edf9b926aaDaniel Sandler mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND); 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1477ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Create the global actions dialog. 1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return A new dialog. 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private AlertDialog createDialog() { 1537ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani // Simple toggle style if there's no vibrator, otherwise use a tri-state 1547ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!mHasVibrator) { 1557ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mSilentModeAction = new SilentModeToggleAction(); 1567ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } else { 1577ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mSilentModeAction = new SilentModeTriStateAction(mContext, mAudioManager, mHandler); 1587ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn = new ToggleAction( 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.drawable.ic_lock_airplane_mode, 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.drawable.ic_lock_airplane_mode_off, 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_toggle_airplane_mode, 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_airplane_mode_on_status, 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project R.string.global_actions_airplane_mode_off_status) { 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project void onToggle(boolean on) { 1677ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (mHasTelephony && Boolean.parseBoolean( 168fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) { 169fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit = true; 170fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // Launch ECM exit dialog 171fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Intent ecmDialogIntent = 172fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null); 173fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo ecmDialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 174fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.startActivity(ecmDialogIntent); 175fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } else { 176fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo changeAirplaneModeSystemSetting(on); 177fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected void changeStateFromPress(boolean buttonOn) { 1827ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!mHasTelephony) return; 1837ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 184fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // In ECM mode airplane state cannot be changed 185fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo if (!(Boolean.parseBoolean( 186fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))) { 187fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mState = buttonOn ? State.TurningOn : State.TurningOff; 188fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mAirplaneState = mState; 189fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean showDuringKeyguard() { 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean showBeforeProvisioning() { 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 2007ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani onAirplaneModeChanged(); 2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2022ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani mItems = new ArrayList<Action>(); 2032ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 2046243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // first: power off 2052ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani mItems.add( 2062ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani new SinglePressAction( 2072ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani com.android.internal.R.drawable.ic_lock_power_off, 2082ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani R.string.global_action_power_off) { 2092ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 2102ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public void onPress() { 2112ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani // shutdown by making sure radio and power are handled accordingly. 2129a538ee7bde42ad36f43edc48594282d98e191a4Jeff Brown mWindowManagerFuncs.shutdown(true); 2132ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 2142ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 21519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 2169a538ee7bde42ad36f43edc48594282d98e191a4Jeff Brown mWindowManagerFuncs.rebootSafeMode(true); 21719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return true; 21819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 21919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 2202ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public boolean showDuringKeyguard() { 2212ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani return true; 2222ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 2232ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani 2242ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani public boolean showBeforeProvisioning() { 2252ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani return true; 2262ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani } 2272ef6f1bb5603c2e221191117695725237f49a5d5Amith Yamasani }); 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2296243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // next: airplane mode 2306243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mItems.add(mAirplaneModeOn); 2316243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 2325773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn // next: bug report, if enabled 2335773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn if (Settings.Secure.getInt(mContext.getContentResolver(), 2345773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn Settings.Secure.BUGREPORT_IN_POWER_MENU, 0) != 0) { 2355773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn mItems.add( 2365773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn new SinglePressAction(0, R.string.global_action_bug_report) { 2375773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn 2385773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn public void onPress() { 2395773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 2405773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn builder.setTitle(com.android.internal.R.string.bugreport_title); 2415773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn builder.setMessage(com.android.internal.R.string.bugreport_message); 2425773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn builder.setNegativeButton(com.android.internal.R.string.cancel, null); 2435773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn builder.setPositiveButton(com.android.internal.R.string.report, 2445773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn new DialogInterface.OnClickListener() { 2455773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn @Override 2465773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn public void onClick(DialogInterface dialog, int which) { 2475773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn // Add a little delay before executing, to give the 2485773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn // dialog a chance to go away before it takes a 2495773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn // screenshot. 2505773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn mHandler.postDelayed(new Runnable() { 2515773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn @Override public void run() { 2525773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn SystemProperties.set("ctl.start", "bugreport"); 2535773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2545773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn }, 500); 2555773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2565773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn }); 2575773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn AlertDialog dialog = builder.create(); 2585773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 2595773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn dialog.show(); 2605773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2615773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn 2625773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn public boolean onLongPress() { 2635773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn return false; 2645773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2655773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn 2665773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn public boolean showDuringKeyguard() { 2675773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn return true; 2685773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2695773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn 2705773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn public boolean showBeforeProvisioning() { 2715773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn return false; 2725773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2735773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn }); 2745773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn } 2755773bfdb7cd3852d9fedd497e3c22c49c83d0d75Dianne Hackborn 2766243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // last: silent mode 2776243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 2786243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mItems.add(mSilentModeAction); 2796243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 2806243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 281258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani List<UserInfo> users = ((UserManager) mContext.getSystemService(Context.USER_SERVICE)) 282258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani .getUsers(); 283742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (users.size() > 1) { 28452f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani UserInfo currentUser; 28552f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani try { 28652f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani currentUser = ActivityManagerNative.getDefault().getCurrentUser(); 28752f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani } catch (RemoteException re) { 28852f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani currentUser = null; 28952f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani } 290742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani for (final UserInfo user : users) { 29152f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani boolean isCurrentUser = currentUser == null 29252f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani ? user.id == 0 : (currentUser.id == user.id); 293b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath) 294b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani : null; 295742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani SinglePressAction switchToUser = new SinglePressAction( 296b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani com.android.internal.R.drawable.ic_menu_cc, icon, 29752f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani (user.name != null ? user.name : "Primary") 29852f1d752f90579c9b57e3350393a029cf72138d0Amith Yamasani + (isCurrentUser ? " \u2714" : "")) { 299742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public void onPress() { 300742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani try { 301742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani ActivityManagerNative.getDefault().switchUser(user.id); 30298365d7663cbd82979a5700faf0050220b01084dJeff Brown WindowManagerGlobal.getWindowManagerService().lockNow(); 303742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } catch (RemoteException re) { 304742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani Log.e(TAG, "Couldn't switch user " + re); 305742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 306742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 307742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 308742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public boolean showDuringKeyguard() { 309742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return true; 310742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 311742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani 312742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani public boolean showBeforeProvisioning() { 313742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani return false; 314742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 315742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani }; 316742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mItems.add(switchToUser); 317742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 318742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 3197ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter = new MyAdapter(); 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final AlertDialog.Builder ab = new AlertDialog.Builder(mContext); 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ab.setAdapter(mAdapter, this) 3256243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani .setInverseBackgroundForced(true); 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final AlertDialog dialog = ab.create(); 328e48a160e57a6426be81bfa18dd35324a36f6a74dAmith Yamasani dialog.getListView().setItemsCanFocus(true); 32919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn dialog.getListView().setLongClickable(true); 33019caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn dialog.getListView().setOnItemLongClickListener( 33119caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn new AdapterView.OnItemLongClickListener() { 33219caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn @Override 33319caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onItemLongClick(AdapterView<?> parent, View view, int position, 33419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn long id) { 33519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return mAdapter.getItem(position).onLongPress(); 33619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 33719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn }); 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project dialog.setOnDismissListener(this); 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return dialog; 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void prepareDialog() { 3467ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani refreshSilentMode(); 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn.updateState(mAirplaneState); 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.notifyDataSetChanged(); 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing) { 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 352fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3546243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 3556243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); 3566243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mContext.registerReceiver(mRingerModeReceiver, filter); 3576243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3607ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private void refreshSilentMode() { 3617ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!mHasVibrator) { 3627ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani final boolean silentModeOn = 3637ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; 3647ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani ((ToggleAction)mSilentModeAction).updateState( 3657ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani silentModeOn ? ToggleAction.State.On : ToggleAction.State.Off); 3667ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 3677ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 3687ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onDismiss(DialogInterface dialog) { 3716243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (SHOW_SILENT_TOGGLE) { 3726243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mContext.unregisterReceiver(mRingerModeReceiver); 3736243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 3787ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!(mAdapter.getItem(which) instanceof SilentModeTriStateAction)) { 3796243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani dialog.dismiss(); 3806243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.getItem(which).onPress(); 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * The adapter used for the list within the global actions dialog, taking 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * into account whether the keyguard is showing via 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * {@link GlobalActions#mKeyguardShowing} and whether the device is provisioned 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * via {@link GlobalActions#mDeviceProvisioned}. 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private class MyAdapter extends BaseAdapter { 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public int getCount() { 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int count = 0; 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project for (int i = 0; i < mItems.size(); i++) { 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final Action action = mItems.get(i); 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing && !action.showDuringKeyguard()) { 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned && !action.showBeforeProvisioning()) { 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project count++; 4051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return count; 4071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 4101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled(int position) { 4111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return getItem(position).isEnabled(); 4121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 4151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean areAllItemsEnabled() { 4161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 4171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public Action getItem(int position) { 4201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int filteredPos = 0; 4221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project for (int i = 0; i < mItems.size(); i++) { 4231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final Action action = mItems.get(i); 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mKeyguardShowing && !action.showDuringKeyguard()) { 4251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 4261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (!mDeviceProvisioned && !action.showBeforeProvisioning()) { 4281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project continue; 4291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (filteredPos == position) { 4311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return action; 4321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project filteredPos++; 4341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 436c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer throw new IllegalArgumentException("position " + position 437c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + " out of range of showable actions" 438c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + ", filtered count=" + getCount() 439c1a9b03a35b833e639e35fe3298ed8e71b7657e9Bernhard Reutner-Fischer + ", keyguardshowing=" + mKeyguardShowing 4401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project + ", provisioned=" + mDeviceProvisioned); 4411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public long getItemId(int position) { 4451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return position; 4461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 4491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Action action = getItem(position); 4501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return action.create(mContext, convertView, parent, LayoutInflater.from(mContext)); 4511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // note: the scheme below made more sense when we were planning on having 4551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // 8 different things in the global actions dialog. seems overkill with 4561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // only 3 items now, but may as well keep this flexible approach so it will 4571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // be easy should someone decide at the last minute to include something 4581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // else, such as 'enable wifi', or 'enable bluetooth' 4591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * What each item in the global actions dialog must be able to support. 4621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private interface Action { 4641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project View create(Context context, View convertView, ViewGroup parent, LayoutInflater inflater); 4651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project void onPress(); 4671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 46819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress(); 46919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 4701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return whether this action should appear in the dialog when the keygaurd 4721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * is showing. 4731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean showDuringKeyguard(); 4751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @return whether this action should appear in the dialog before the 4781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * device is provisioned. 4791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean showBeforeProvisioning(); 4811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean isEnabled(); 4831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 4861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * A single press action maintains no state, just responds to a press 4871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and takes an action. 4881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 4891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static abstract class SinglePressAction implements Action { 4901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int mIconResId; 491b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani private final Drawable mIcon; 4921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int mMessageResId; 493742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani private final CharSequence mMessage; 4941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 4951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected SinglePressAction(int iconResId, int messageResId) { 4961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mIconResId = iconResId; 4971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mMessageResId = messageResId; 498742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessage = null; 499b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mIcon = null; 500b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani } 501b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani 502b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani protected SinglePressAction(int iconResId, Drawable icon, CharSequence message) { 503b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mIconResId = iconResId; 504b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mMessageResId = 0; 505b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mMessage = message; 506b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mIcon = icon; 5071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 509742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani protected SinglePressAction(int iconResId, CharSequence message) { 510742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mIconResId = iconResId; 511742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessageResId = 0; 512742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani mMessage = message; 513b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani mIcon = null; 514742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 515b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani 5161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled() { 5171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 5181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract public void onPress(); 5211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 52219caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 52319caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 52419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 52519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 5261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View create( 5271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Context context, View convertView, ViewGroup parent, LayoutInflater inflater) { 5286243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R.layout.global_actions_item, parent, false); 5291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ImageView icon = (ImageView) v.findViewById(R.id.icon); 5311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView messageView = (TextView) v.findViewById(R.id.message); 5321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project v.findViewById(R.id.status).setVisibility(View.GONE); 534b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani if (mIcon != null) { 535b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani icon.setImageDrawable(mIcon); 536b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani icon.setScaleType(ScaleType.CENTER_CROP); 537b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani } else if (mIconResId != 0) { 538b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani icon.setImageDrawable(context.getResources().getDrawable(mIconResId)); 539b8151ecd6ef4faa5c16d0a4c3abb45ec84d1f97aAmith Yamasani } 540742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani if (mMessage != null) { 541742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani messageView.setText(mMessage); 542742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } else { 543742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani messageView.setText(mMessageResId); 544742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani } 5451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return v; 5471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * A toggle action knows whether it is on or off, and displays an icon 5521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * and status message accordingly. 5531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static abstract class ToggleAction implements Action { 5551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project enum State { 5571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Off(false), 5581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TurningOn(true), 5591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TurningOff(true), 5601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project On(false); 5611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final boolean inTransition; 5631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project State(boolean intermediate) { 5651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project inTransition = intermediate; 5661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean inTransition() { 5691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return inTransition; 5701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 5721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected State mState = State.Off; 5741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // prefs 57682d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mEnabledIconResId; 57782d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mDisabledIconResid; 57882d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mMessageResId; 57982d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mEnabledStatusMessageResId; 58082d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler protected int mDisabledStatusMessageResId; 5811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 5821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 5831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param enabledIconResId The icon for when this action is on. 5841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param disabledIconResid The icon for when this action is off. 5851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param essage The general information message, e.g 'Silent Mode' 5861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param enabledStatusMessageResId The on status message, e.g 'sound disabled' 5871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled' 5881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 5891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public ToggleAction(int enabledIconResId, 5901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int disabledIconResid, 5917ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani int message, 5921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int enabledStatusMessageResId, 5931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int disabledStatusMessageResId) { 5941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnabledIconResId = enabledIconResId; 5951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDisabledIconResid = disabledIconResid; 5967ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mMessageResId = message; 5971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnabledStatusMessageResId = enabledStatusMessageResId; 5981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDisabledStatusMessageResId = disabledStatusMessageResId; 5991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 60182d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler /** 60282d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler * Override to make changes to resource IDs just before creating the 60382d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler * View. 60482d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler */ 60582d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler void willCreate() { 60682d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 60782d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler } 60882d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 6091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public View create(Context context, View convertView, ViewGroup parent, 6101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project LayoutInflater inflater) { 61182d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler willCreate(); 61282d6c68b396323789e52c407b18ee4a7eab11a24Daniel Sandler 6136243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R 6141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .layout.global_actions_item, parent, false); 6151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project ImageView icon = (ImageView) v.findViewById(R.id.icon); 6171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView messageView = (TextView) v.findViewById(R.id.message); 6181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project TextView statusView = (TextView) v.findViewById(R.id.status); 6196243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani final boolean enabled = isEnabled(); 6201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6216243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (messageView != null) { 6226243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani messageView.setText(mMessageResId); 6236243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani messageView.setEnabled(enabled); 6246243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project boolean on = ((mState == State.On) || (mState == State.TurningOn)); 6276243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (icon != null) { 6286243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani icon.setImageDrawable(context.getResources().getDrawable( 6296243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani (on ? mEnabledIconResId : mDisabledIconResid))); 6306243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani icon.setEnabled(enabled); 6316243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6336243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (statusView != null) { 6346243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId); 6356243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setVisibility(View.VISIBLE); 6366243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani statusView.setEnabled(enabled); 6376243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 6381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project v.setEnabled(enabled); 6391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return v; 6411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public final void onPress() { 6441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mState.inTransition()) { 6451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project Log.w(TAG, "shouldn't be able to toggle when in transition"); 6461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 6471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean nowOn = !(mState == State.On); 6501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onToggle(nowOn); 6511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project changeStateFromPress(nowOn); 6521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 65419caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 65519caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 65619caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 65719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 6581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean isEnabled() { 6591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return !mState.inTransition(); 6601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 6631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Implementations may override this if their state can be in on of the intermediate 6641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * states until some notification is received (e.g airplane mode is 'turning off' until 6651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * we know the wireless connections are back online 6661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * @param buttonOn Whether the button was turned on or off 6671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 6681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected void changeStateFromPress(boolean buttonOn) { 6691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mState = buttonOn ? State.On : State.Off; 6701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract void onToggle(boolean on); 6731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void updateState(State state) { 6751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mState = state; 6761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 6781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 6797ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private class SilentModeToggleAction extends ToggleAction { 6807ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani public SilentModeToggleAction() { 6817ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani super(R.drawable.ic_audio_vol_mute, 6827ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani R.drawable.ic_audio_vol, 6837ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani R.string.global_action_toggle_silent_mode, 6847ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani R.string.global_action_silent_mode_on_status, 6857ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani R.string.global_action_silent_mode_off_status); 6867ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 6877ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 6887ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani void onToggle(boolean on) { 6897ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (on) { 6907ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 6917ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } else { 6927ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 6937ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 6947ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 6957ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 6967ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani public boolean showDuringKeyguard() { 6977ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani return true; 6987ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 6997ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 7007ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani public boolean showBeforeProvisioning() { 7017ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani return false; 7027ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 7037ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 7047ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 7057ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private static class SilentModeTriStateAction implements Action, View.OnClickListener { 7066243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7076243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final int[] ITEM_IDS = { R.id.option1, R.id.option2, R.id.option3 }; 7086243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7096243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final AudioManager mAudioManager; 7106243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private final Handler mHandler; 711135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani private final Context mContext; 7126243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7137ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani SilentModeTriStateAction(Context context, AudioManager audioManager, Handler handler) { 7146243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAudioManager = audioManager; 7156243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler = handler; 716135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani mContext = context; 7176243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7186243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7196243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private int ringerModeToIndex(int ringerMode) { 7206243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // They just happen to coincide 7216243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return ringerMode; 7226243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7236243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7246243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private int indexToRingerMode(int index) { 7256243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // They just happen to coincide 7266243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return index; 7276243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7286243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7296243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public View create(Context context, View convertView, ViewGroup parent, 7306243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani LayoutInflater inflater) { 7316243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false); 7326243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7336243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani int selectedIndex = ringerModeToIndex(mAudioManager.getRingerMode()); 7346243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani for (int i = 0; i < 3; i++) { 7356243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani View itemView = v.findViewById(ITEM_IDS[i]); 7366243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setSelected(selectedIndex == i); 7376243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani // Set up click handler 7386243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setTag(i); 7396243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani itemView.setOnClickListener(this); 7406243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7416243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return v; 7426243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7436243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7446243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onPress() { 7456243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7466243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 74719caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn public boolean onLongPress() { 74819caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn return false; 74919caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn } 75019caadc08f09cc9f6665fbbb0d61e02861ce8562Dianne Hackborn 7516243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean showDuringKeyguard() { 7526243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return true; 7536243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7546243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7556243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean showBeforeProvisioning() { 7566243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return false; 7576243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7586243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7596243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public boolean isEnabled() { 7606243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani return true; 7616243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7626243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7636243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani void willCreate() { 7646243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7656243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7666243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onClick(View v) { 7676243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (!(v.getTag() instanceof Integer)) return; 7686243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7696243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani int index = (Integer) v.getTag(); 7706243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAudioManager.setRingerMode(indexToRingerMode(index)); 7716243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler.sendEmptyMessageDelayed(MESSAGE_DISMISS, DIALOG_DISMISS_DELAY); 7726243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7736243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 7746243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 7751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 7761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onReceive(Context context, Intent intent) { 7771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project String action = intent.getAction(); 77878866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 77978866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 7801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project String reason = intent.getStringExtra(PhoneWindowManager.SYSTEM_DIALOG_REASON_KEY); 78178866b1e07b1006f6ebf4adbc8e64b558c6040ebJoe Onorato if (!PhoneWindowManager.SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) { 7821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHandler.sendEmptyMessage(MESSAGE_DISMISS); 7831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 784fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } else if (TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(action)) { 785fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // Airplane mode can be changed after ECM exits if airplane toggle button 786fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo // is pressed during ECM mode 787fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo if (!(intent.getBooleanExtra("PHONE_IN_ECM_STATE", false)) && 788fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit) { 789fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mIsWaitingForEcmExit = false; 790fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo changeAirplaneModeSystemSetting(true); 791fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 7921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 7941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 7951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 7961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project PhoneStateListener mPhoneStateListener = new PhoneStateListener() { 7971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 7981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onServiceStateChanged(ServiceState serviceState) { 7997ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!mHasTelephony) return; 8001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean inAirplaneMode = serviceState.getState() == ServiceState.STATE_POWER_OFF; 8011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneState = inAirplaneMode ? ToggleAction.State.On : ToggleAction.State.Off; 8021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAirplaneModeOn.updateState(mAirplaneState); 8031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mAdapter.notifyDataSetChanged(); 8041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 8061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 8076243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private BroadcastReceiver mRingerModeReceiver = new BroadcastReceiver() { 8086243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani @Override 8096243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani public void onReceive(Context context, Intent intent) { 8106243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani if (intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { 8116243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mHandler.sendEmptyMessage(MESSAGE_REFRESH); 8126243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 8136243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani } 8146243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani }; 8156243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 8167ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private ContentObserver mAirplaneModeObserver = new ContentObserver(new Handler()) { 8177ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani @Override 8187ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani public void onChange(boolean selfChange) { 8197ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani onAirplaneModeChanged(); 8207ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 8217ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani }; 8227ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 8231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int MESSAGE_DISMISS = 0; 8246243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final int MESSAGE_REFRESH = 1; 8252efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani private static final int MESSAGE_SHOW = 2; 8266243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani private static final int DIALOG_DISMISS_DELAY = 300; // ms 8276243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani 8281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Handler mHandler = new Handler() { 8291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void handleMessage(Message msg) { 8302efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani switch (msg.what) { 8312efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani case MESSAGE_DISMISS: 8321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mDialog != null) { 8331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mDialog.dismiss(); 8341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8352efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani break; 8362efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani case MESSAGE_REFRESH: 8377ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani refreshSilentMode(); 8386243edd818b84adfbe712d5d233d6414b33653acAmith Yamasani mAdapter.notifyDataSetChanged(); 8392efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani break; 8402efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani case MESSAGE_SHOW: 8412efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani handleShow(); 8422efb6a94ca528beb96e26bd3ad2f4b995fb75b49Amith Yamasani break; 8431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 8451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }; 846fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo 8477ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani private void onAirplaneModeChanged() { 8487ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani // Let the service state callbacks handle the state. 8497ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (mHasTelephony) return; 8507ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 8517ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani boolean airplaneModeOn = Settings.System.getInt( 8527ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mContext.getContentResolver(), 8537ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani Settings.System.AIRPLANE_MODE_ON, 8547ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 0) == 1; 8557ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAirplaneState = airplaneModeOn ? ToggleAction.State.On : ToggleAction.State.Off; 8567ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAirplaneModeOn.updateState(mAirplaneState); 8577ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 8587ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani 859fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo /** 860fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo * Change the airplane mode system setting 861fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo */ 862fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo private void changeAirplaneModeSystemSetting(boolean on) { 863fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Settings.System.putInt( 864fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.getContentResolver(), 865fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Settings.System.AIRPLANE_MODE_ON, 866fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo on ? 1 : 0); 867fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 868818ba11cd680de336fb9278b64a21dc2efb7517eDianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 869fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo intent.putExtra("state", on); 870fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo mContext.sendBroadcast(intent); 8717ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani if (!mHasTelephony) { 8727ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani mAirplaneState = on ? ToggleAction.State.On : ToggleAction.State.Off; 8737ee994d728acf2b3b3297a67001f2d21c9094109Amith Yamasani } 874fe1fee5545fee91ca0d267067f6ddf2887a7bdd3Jinghui Guo } 8751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 876