1c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/*
2c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project *
4c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * you may not use this file except in compliance with the License.
6c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * You may obtain a copy of the License at
7c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project *
8c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project *
10c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * See the License for the specific language governing permissions and
14c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * limitations under the License.
15c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */
16c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
17c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectpackage com.android.internal.policy.impl;
18c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
19c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport com.android.internal.R;
20cbaa463dd167ad9a1f0f4e1eba65bb3f0285db95Dianne Hackbornimport com.android.internal.app.ShutdownThread;
21c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport com.google.android.collect.Lists;
22c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
23c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.AlertDialog;
24c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.StatusBarManager;
25c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.Context;
26c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.BroadcastReceiver;
27c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.Intent;
28c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.IntentFilter;
29c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.DialogInterface;
30c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.media.AudioManager;
31c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.LocalPowerManager;
32c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.Handler;
33c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.Message;
34c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.SystemClock;
35c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.LayoutInflater;
36c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.View;
37c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.ViewGroup;
38c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowManager;
39c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.widget.BaseAdapter;
40c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.widget.ImageView;
41c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.widget.LinearLayout;
42c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.widget.TextView;
43c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
44c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport java.util.ArrayList;
45c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
46c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/**
47c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Helper to show the global actions dialog.  Each item is an {@link Action} that
48c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * may show depending on whether the keyguard is showing, and whether the device
49c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * is provisioned.
50c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */
51c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectclass GlobalActions implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener  {
52c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
53c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private StatusBarManager mStatusBar;
54c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
55c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private final Context mContext;
56c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private final LocalPowerManager mPowerManager;
57c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private final AudioManager mAudioManager;
58c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private ArrayList<Action> mItems;
59c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private AlertDialog mDialog;
60c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
61c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private ToggleAction mSilentModeToggle;
62c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
63c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private MyAdapter mAdapter;
64c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
65c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private boolean mKeyguardShowing = false;
66c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private boolean mDeviceProvisioned = false;
67c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
68c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
69c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * @param context everything needs a context :)
70c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * @param powerManager used to turn the screen off (the lock action).
71c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
72c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public GlobalActions(Context context, LocalPowerManager powerManager) {
73c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mContext = context;
74c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mPowerManager = powerManager;
75c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
76c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
77c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // receive broadcasts
78c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        IntentFilter filter = new IntentFilter();
79c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
80c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        context.registerReceiver(mBroadcastReceiver, filter);
81c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
82c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
83c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
84c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * Show the global actions dialog (creating if necessary)
85c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * @param keyguardShowing True if keyguard is showing
86c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
87c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned) {
88c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mKeyguardShowing = keyguardShowing;
89c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mDeviceProvisioned = isDeviceProvisioned;
90c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mDialog == null) {
91c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mStatusBar = (StatusBarManager)mContext.getSystemService(Context.STATUS_BAR_SERVICE);
92c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mDialog = createDialog();
93c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
94c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        prepareDialog();
95c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
96c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mStatusBar.disable(StatusBarManager.DISABLE_EXPAND);
97c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mDialog.show();
98c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
99c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
100c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
101c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * Create the global actions dialog.
102c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * @return A new dialog.
103c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
104c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private AlertDialog createDialog() {
105c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
106c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mSilentModeToggle = new ToggleAction(
107c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                R.drawable.ic_lock_silent_mode,
108c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                R.drawable.ic_lock_silent_mode_off,
109c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                R.string.global_action_toggle_silent_mode,
110c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                R.string.global_action_silent_mode_on_status,
111c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                R.string.global_action_silent_mode_off_status) {
112c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
113c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            void onToggle(boolean on) {
114c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                mAudioManager.setRingerMode(on ? AudioManager.RINGER_MODE_SILENT
115c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        : AudioManager.RINGER_MODE_NORMAL);
116c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
117c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
118c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            public boolean showDuringKeyguard() {
119c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                return true;
120c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
121c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
122c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            public boolean showBeforeProvisioning() {
123c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                return false;
124c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
125c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        };
126c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
127c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mItems = Lists.newArrayList(
128c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                // first: lock screen
129c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                new SinglePressAction(com.android.internal.R.drawable.ic_lock_lock, R.string.global_action_lock) {
130c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
131c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public void onPress() {
132c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        mPowerManager.goToSleep(SystemClock.uptimeMillis() + 1);
133c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
134c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
135c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public boolean showDuringKeyguard() {
136c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        return false;
137c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
138c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
139c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public boolean showBeforeProvisioning() {
140c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        return false;
141c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
142c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                },
143c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                // next: silent mode
144c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                mSilentModeToggle,
145c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                // last: power off
146c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                new SinglePressAction(com.android.internal.R.drawable.ic_lock_power_off, R.string.global_action_power_off) {
147c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
148c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public void onPress() {
149c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        // shutdown by making sure radio and power are handled accordingly.
150cbaa463dd167ad9a1f0f4e1eba65bb3f0285db95Dianne Hackborn                        ShutdownThread.shutdown(mContext, true);
151c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
152c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
153c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public boolean showDuringKeyguard() {
154c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        return true;
155c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
156c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
157c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    public boolean showBeforeProvisioning() {
158c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        return true;
159c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    }
160c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                });
161c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
162c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mAdapter = new MyAdapter();
163c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
164c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        final AlertDialog.Builder ab = new AlertDialog.Builder(mContext);
165c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
166c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        ab.setAdapter(mAdapter, this)
167c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                .setInverseBackgroundForced(true)
168c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                .setTitle(R.string.global_actions);
169c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
170c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        final AlertDialog dialog = ab.create();
171c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
172c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
173c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
174c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
175c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        dialog.setOnDismissListener(this);
176c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
177c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        return dialog;
178c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
179c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
180c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private void prepareDialog() {
181c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // TODO: May need another 'Vibrate' toggle button, but for now treat them the same
182c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        final boolean silentModeOn =
183c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
184c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mSilentModeToggle.updateState(silentModeOn);
185c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mAdapter.notifyDataSetChanged();
186c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mKeyguardShowing) {
187c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
188c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        } else {
189c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
190c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
191c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
192c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
193c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /** {@inheritDoc} */
194c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void onDismiss(DialogInterface dialog) {
195c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mStatusBar.disable(StatusBarManager.DISABLE_NONE);
196c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
197c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
198c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /** {@inheritDoc} */
199c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
200c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        dialog.dismiss();
201c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mAdapter.getItem(which).onPress();
202c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
203c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
204c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
205c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
206c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * The adapter used for the list within the global actions dialog, taking
207c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * into account whether the keyguard is showing via
208c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * {@link GlobalActions#mKeyguardShowing} and whether the device is provisioned
209c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * via {@link GlobalActions#mDeviceProvisioned}.
210c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
211c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private class MyAdapter extends BaseAdapter {
212c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
213c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public int getCount() {
214c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            int count = 0;
215c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
216c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            for (int i = 0; i < mItems.size(); i++) {
217c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                final Action action = mItems.get(i);
218c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
219c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (mKeyguardShowing && !action.showDuringKeyguard()) {
220c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    continue;
221c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
222c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
223c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    continue;
224c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
225c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                count++;
226c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
227c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return count;
228c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
229c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
230c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public Action getItem(int position) {
231c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
232c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            int filteredPos = 0;
233c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            for (int i = 0; i < mItems.size(); i++) {
234c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                final Action action = mItems.get(i);
235c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (mKeyguardShowing && !action.showDuringKeyguard()) {
236c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    continue;
237c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
238c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (!mDeviceProvisioned && !action.showBeforeProvisioning()) {
239c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    continue;
240c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
241c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (filteredPos == position) {
242c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    return action;
243c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
244c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                filteredPos++;
245c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
246c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
247c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            throw new IllegalArgumentException("position " + position + " out of "
248c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    + "range of showable actions, filtered count = "
249c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    + "= " + getCount() + ", keyguardshowing=" + mKeyguardShowing
250c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    + ", provisioned=" + mDeviceProvisioned);
251c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
252c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
253c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
254c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public long getItemId(int position) {
255c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return position;
256c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
257c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
258c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
259c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            Action action = getItem(position);
260c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return action.create(mContext, (LinearLayout) convertView, LayoutInflater.from(mContext));
261c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
262c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
263c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
264c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    // note: the scheme below made more sense when we were planning on having
265c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    // 8 different things in the global actions dialog.  seems overkill with
266c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    // only 3 items now, but may as well keep this flexible approach so it will
267c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    // be easy should someone decide at the last minute to include something
268c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    // else, such as 'enable wifi', or 'enable bluetooth'
269c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
270c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
271c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * What each item in the global actions dialog must be able to support.
272c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
273c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private interface Action {
274c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        LinearLayout create(Context context, LinearLayout convertView, LayoutInflater inflater);
275c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
276c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        void onPress();
277c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
278c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        /**
279c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @return whether this action should appear in the dialog when the keygaurd
280c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         *    is showing.
281c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         */
282c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        boolean showDuringKeyguard();
283c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
284c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        /**
285c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @return whether this action should appear in the dialog before the
286c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         *   device is provisioned.
287c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         */
288c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        boolean showBeforeProvisioning();
289c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
290c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
291c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
292c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * A single press action maintains no state, just responds to a press
293c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * and takes an action.
294c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
295c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private static abstract class SinglePressAction implements Action {
296c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mIconResId;
297c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mMessageResId;
298c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
299c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        protected SinglePressAction(int iconResId, int messageResId) {
300c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mIconResId = iconResId;
301c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mMessageResId = messageResId;
302c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
303c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
304c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        abstract public void onPress();
305c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
306c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public LinearLayout create(Context context, LinearLayout convertView, LayoutInflater inflater) {
307c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            LinearLayout v = (LinearLayout) ((convertView != null) ?
308c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    convertView :
309c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    inflater.inflate(R.layout.global_actions_item, null));
310c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
311c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            ImageView icon = (ImageView) v.findViewById(R.id.icon);
312c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            TextView messageView = (TextView) v.findViewById(R.id.message);
313c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
314c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            v.findViewById(R.id.status).setVisibility(View.GONE);
315c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
316c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            icon.setImageDrawable(context.getResources().getDrawable(mIconResId));
317c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            messageView.setText(mMessageResId);
318c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
319c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return v;
320c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
321c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
322c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
323c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    /**
324c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * A toggle action knows whether it is on or off, and displays an icon
325c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     * and status message accordingly.
326c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project     */
327c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    static abstract class ToggleAction implements Action {
328c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
329c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private boolean mOn = false;
330c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
331c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // prefs
332c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mEnabledIconResId;
333c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mDisabledIconResid;
334c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mMessageResId;
335c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mEnabledStatusMessageResId;
336c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        private final int mDisabledStatusMessageResId;
337c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
338c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        /**
339c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @param enabledIconResId The icon for when this action is on.
340c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @param disabledIconResid The icon for when this action is off.
341c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @param essage The general information message, e.g 'Silent Mode'
342c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @param enabledStatusMessageResId The on status message, e.g 'sound disabled'
343c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled'
344c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project         */
345c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public ToggleAction(int enabledIconResId,
346c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                int disabledIconResid,
347c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                int essage,
348c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                int enabledStatusMessageResId,
349c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                int disabledStatusMessageResId) {
350c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mEnabledIconResId = enabledIconResId;
351c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mDisabledIconResid = disabledIconResid;
352c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mMessageResId = essage;
353c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mEnabledStatusMessageResId = enabledStatusMessageResId;
354c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mDisabledStatusMessageResId = disabledStatusMessageResId;
355c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
356c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
357c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public LinearLayout create(Context context, LinearLayout convertView,
358c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                LayoutInflater inflater) {
359c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            LinearLayout v = (LinearLayout) ((convertView != null) ?
360c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    convertView :
361c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    inflater.inflate(R
362c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                            .layout.global_actions_item, null));
363c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
364c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            ImageView icon = (ImageView) v.findViewById(R.id.icon);
365c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            TextView messageView = (TextView) v.findViewById(R.id.message);
366c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            TextView statusView = (TextView) v.findViewById(R.id.status);
367c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
368c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            messageView.setText(mMessageResId);
369c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
370c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            icon.setImageDrawable(context.getResources().getDrawable(
371c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    (mOn ? mEnabledIconResId : mDisabledIconResid)));
372c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            statusView.setText(mOn ? mEnabledStatusMessageResId : mDisabledStatusMessageResId);
373c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            statusView.setVisibility(View.VISIBLE);
374c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
375c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return v;
376c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
377c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
378c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public void onPress() {
379c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            updateState(!mOn);
380c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            onToggle(mOn);
381c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
382c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
383c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        abstract void onToggle(boolean on);
384c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
385c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public void updateState(boolean on) {
386c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mOn = on;
387c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
388c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
389c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
390c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
391c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public void onReceive(Context context, Intent intent) {
392c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            String action = intent.getAction();
393c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
394c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                String reason = intent.getStringExtra(MidWindowManager.SYSTEM_DIALOG_REASON_KEY);
395c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (! MidWindowManager.SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) {
396c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    mHandler.sendEmptyMessage(MESSAGE_DISMISS);
397c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
398c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
399c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
400c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    };
401c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
402c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private static final int MESSAGE_DISMISS = 0;
403c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private Handler mHandler = new Handler() {
404c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        public void handleMessage(Message msg) {
405c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            if (msg.what == MESSAGE_DISMISS) {
406c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (mDialog != null) {
407c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    mDialog.dismiss();
408c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
409c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
410c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
411c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    };
412c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project}
413