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