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