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