1c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/*
2c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * Copyright (C) 2007 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;
20c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
21c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.Dialog;
22c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.app.StatusBarManager;
23c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.content.Context;
24c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.Bundle;
25c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.RemoteException;
26c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.LocalPowerManager;
27c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.ServiceManager;
28c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.ServiceManagerNative;
29c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.os.SystemClock;
30cbaa463dd167ad9a1f0f4e1eba65bb3f0285db95Dianne Hackborn
31cbaa463dd167ad9a1f0f4e1eba65bb3f0285db95Dianne Hackbornimport com.android.internal.app.ShutdownThread;
32c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport com.android.internal.telephony.ITelephony;
33c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.KeyEvent;
34c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.util.Log;
35c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.View;
36c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.WindowManager;
37c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.View.OnClickListener;
38c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.view.View.OnKeyListener;
39c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectimport android.widget.Button;
40c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
41c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project/**
42c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project * @deprecated use {@link GlobalActions} instead.
43c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project */
44c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Projectpublic class PowerDialog extends Dialog implements OnClickListener,
45c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        OnKeyListener {
46c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private static final String TAG = "PowerDialog";
47c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
48c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    static private StatusBarManager sStatusBar;
49c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private Button mKeyguard;
50c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private Button mPower;
51c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private Button mRadioPower;
52c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private Button mSilent;
53c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
54c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    private LocalPowerManager mPowerManager;
55c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
56c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public PowerDialog(Context context, LocalPowerManager powerManager) {
57c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        super(context);
58c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mPowerManager = powerManager;
59c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
60c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
61c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    @Override
62c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
63c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        super.onCreate(savedInstanceState);
64c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
65c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        Context context = getContext();
66c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
67c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (sStatusBar == null) {
68c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            sStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
69c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
70c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
71c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        setContentView(com.android.internal.R.layout.power_dialog);
72c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
73c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
74c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
75c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
76c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
77c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        setTitle(context.getText(R.string.power_dialog));
78c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
79c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mKeyguard = (Button) findViewById(R.id.keyguard);
80c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mPower = (Button) findViewById(R.id.off);
81c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mRadioPower = (Button) findViewById(R.id.radio_power);
82c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mSilent = (Button) findViewById(R.id.silent);
83c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
84c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mKeyguard != null) {
85c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mKeyguard.setOnKeyListener(this);
86c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mKeyguard.setOnClickListener(this);
87c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
88c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mPower != null) {
89c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mPower.setOnClickListener(this);
90c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
91c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mRadioPower != null) {
92c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mRadioPower.setOnClickListener(this);
93c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
94c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (mSilent != null) {
95c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mSilent.setOnClickListener(this);
96c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            // XXX: HACK for now hide the silent until we get mute support
97c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            mSilent.setVisibility(View.GONE);
98c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
99c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
100c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        CharSequence text;
101c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
102c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // set the keyguard button's text
103c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        text = context.getText(R.string.screen_lock);
104c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mKeyguard.setText(text);
105c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mKeyguard.requestFocus();
106c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
107c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        try {
108c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
109c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            if (phone != null) {
110c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                text = phone.isRadioOn() ? context
111c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        .getText(R.string.turn_off_radio) : context
112c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                        .getText(R.string.turn_on_radio);
113c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
114c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        } catch (RemoteException ex) {
115c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            // ignore it
116c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
117c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
118c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mRadioPower.setText(text);
119c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
120c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
121c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void onClick(View v) {
122c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        this.dismiss();
123c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (v == mPower) {
124c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            // shutdown by making sure radio and power are handled accordingly.
125cbaa463dd167ad9a1f0f4e1eba65bb3f0285db95Dianne Hackborn            ShutdownThread.shutdown(getContext(), true);
126c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        } else if (v == mRadioPower) {
127c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            try {
128c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
129c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                if (phone != null) {
130c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                    phone.toggleRadioOnOff();
131c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                }
132c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            } catch (RemoteException ex) {
133c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                // ignore it
134c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
135c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        } else if (v == mSilent) {
136c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            // do something
137c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        } else if (v == mKeyguard) {
138c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            if (v.isInTouchMode()) {
139c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                // only in touch mode for the reasons explained in onKey.
140c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                this.dismiss();
141c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                mPowerManager.goToSleep(SystemClock.uptimeMillis() + 1);
142c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            }
143c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
144c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
145c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
146c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public boolean onKey(View v, int keyCode, KeyEvent event) {
147c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // The activate keyguard button needs to put the device to sleep on the
148c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // key up event. If we try to put it to sleep on the click or down
149c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // action
150c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // the the up action will cause the device to wake back up.
151c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
152c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // Log.i(TAG, "keyCode: " + keyCode + " action: " + event.getAction());
153c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        if (keyCode != KeyEvent.KEYCODE_DPAD_CENTER
154c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project                || event.getAction() != KeyEvent.ACTION_UP) {
155c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            // Log.i(TAG, "getting out of dodge...");
156c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project            return false;
157c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        }
158c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
159c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // Log.i(TAG, "Clicked mKeyguard! dimissing dialog");
160c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        this.dismiss();
161c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // Log.i(TAG, "onKey: turning off the screen...");
162c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        // XXX: arve says this is a hack for now
163c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        mPowerManager.goToSleep(event.getEventTime() + 1);
164c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        return true;
165c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
166c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
167c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void show() {
168c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        super.show();
169c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        Log.d(TAG, "show... disabling expand");
170c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        sStatusBar.disable(StatusBarManager.DISABLE_EXPAND);
171c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
172c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project
173c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    public void dismiss() {
174c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        super.dismiss();
175c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        Log.d(TAG, "dismiss... reenabling expand");
176c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project        sStatusBar.disable(StatusBarManager.DISABLE_NONE);
177c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project    }
178c5d93b3b6a0ba4831903f8e8d1664c4470cf15d7The Android Open Source Project}
179