Merge "Get rid of the global actions menu on tablets."

This commit is contained in:
Joe Onorato
2010-10-08 13:29:37 -07:00
committed by Android (Google) Code Review
6 changed files with 80 additions and 190 deletions

View File

@@ -18,15 +18,17 @@
package com.android.internal.app;
import android.app.ActivityManagerNative;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.IActivityManager;
import android.app.ProgressDialog;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.IBluetooth;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Power;
import android.os.PowerManager;
@@ -91,13 +93,20 @@ public final class ShutdownThread extends Thread {
}
}
Log.d(TAG, "Notifying thread to start radio shutdown");
final int longPressBehavior = context.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
final int resourceId = longPressBehavior == 2
? com.android.internal.R.string.shutdown_confirm_question
: com.android.internal.R.string.shutdown_confirm;
Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior);
if (confirm) {
final CloseDialogReceiver closer = new CloseDialogReceiver(context);
final AlertDialog dialog = new AlertDialog.Builder(context)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(com.android.internal.R.string.power_off)
.setMessage(com.android.internal.R.string.shutdown_confirm)
.setMessage(resourceId)
.setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
beginShutdownSequence(context);
@@ -105,6 +114,8 @@ public final class ShutdownThread extends Thread {
})
.setNegativeButton(com.android.internal.R.string.no, null)
.create();
closer.dialog = dialog;
dialog.setOnDismissListener(closer);
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
if (!context.getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
@@ -116,6 +127,27 @@ public final class ShutdownThread extends Thread {
}
}
private static class CloseDialogReceiver extends BroadcastReceiver
implements DialogInterface.OnDismissListener {
private Context mContext;
public Dialog dialog;
CloseDialogReceiver(Context context) {
mContext = context;
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.registerReceiver(this, filter);
}
@Override
public void onReceive(Context context, Intent intent) {
dialog.cancel();
}
public void onDismiss(DialogInterface unused) {
mContext.unregisterReceiver(this);
}
}
/**
* Request a clean shutdown, waiting for subsystems to clean up their
* state etc. Must be called from a Looper thread in which its UI

View File

@@ -25,6 +25,9 @@
<string name="config_statusBarComponent">com.android.systemui/com.android.systemui.statusbar.tablet.TabletStatusBarService</string>
<bool name="config_statusBarCanHide">false</bool>
<!-- see comment in values/config.xml -->
<integer name="config_longPressOnPowerBehavior">2</integer>
<!-- Show sliding tab before lockscreen -->
<bool name="config_enableSlidingTabFirst">false</bool>
<!-- Enable lockscreen rotation -->

View File

@@ -221,6 +221,13 @@
closed. The default is 0. -->
<integer name="config_lidNavigationAccessibility">0</integer>
<!-- Control the behavior when the user long presses the power button.
0 - Nothing
1 - Global actions menu
2 - Power off (with confirmation)
-->
<integer name="config_longPressOnPowerBehavior">1</integer>
<!-- Indicate whether the SD card is accessible without removing the battery. -->
<bool name="config_batterySdCardAccessibility">false</bool>

View File

@@ -280,9 +280,16 @@
<!-- Shutdown Progress Dialog. This is shown if the user chooses to power off the phone. -->
<string name="shutdown_progress">Shutting down\u2026</string>
<!-- Shutdown Confirmation Dialog. When the user chooses to power off the phone, there will be a confirmation dialog. This is the message. -->
<!-- Shutdown Confirmation Dialog. When the user chooses to power off the phone, there will
be a confirmation dialog. This is the message. -->
<string name="shutdown_confirm">Your phone will shut down.</string>
<!-- Shutdown Confirmation Dialog. When the user chooses to power off the phone, it asks
the user if they'd like to shut down. This is the message. This is used instead of
shutdown_confirm when the system is configured to use long press to go directly to the
power off dialog instead of the global actions menu. -->
<string name="shutdown_confirm_question">Would you like to shut down?</string>
<!-- Recent Tasks dialog: title
TODO: this should move to SystemUI.apk, but the code for the old
recent dialog is still in the framework

View File

@@ -47,6 +47,7 @@ import android.os.Vibrator;
import android.provider.Settings;
import com.android.internal.R;
import com.android.internal.app.ShutdownThread;
import com.android.internal.policy.PolicyManager;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.telephony.ITelephony;
@@ -128,6 +129,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final boolean DEBUG_LAYOUT = false;
static final boolean SHOW_STARTING_ANIMATIONS = true;
static final boolean SHOW_PROCESSES_ON_ALT_MENU = false;
static final int LONG_PRESS_POWER_NOTHING = 0;
static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
static final int LONG_PRESS_POWER_SHUT_OFF = 2;
// wallpaper is at the bottom, though the window manager may move it.
static final int WALLPAPER_LAYER = 2;
@@ -224,6 +229,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mDeskDockEnablesAccelerometer;
int mLidKeyboardAccessibility;
int mLidNavigationAccessibility;
int mLongPressOnPowerBehavior = -1;
boolean mScreenOn = false;
boolean mOrientationSensorEnabled = false;
int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -467,10 +473,27 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Runnable mPowerLongPress = new Runnable() {
public void run() {
mShouldTurnOffOnKeyUp = false;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
// The context isn't read
if (mLongPressOnPowerBehavior < 0) {
mLongPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
}
switch (mLongPressOnPowerBehavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mShouldTurnOffOnKeyUp = false;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
showGlobalActionsDialog();
break;
case LONG_PRESS_POWER_SHUT_OFF:
mShouldTurnOffOnKeyUp = false;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
ShutdownThread.shutdown(mContext, true);
break;
}
}
};

View File

@@ -1,182 +0,0 @@
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.policy.impl;
import com.android.internal.R;
import android.app.Dialog;
import android.app.StatusBarManager;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.LocalPowerManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import com.android.internal.app.ShutdownThread;
import com.android.internal.telephony.ITelephony;
import android.view.KeyEvent;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
/**
* @deprecated use {@link GlobalActions} instead.
*/
public class PowerDialog extends Dialog implements OnClickListener,
OnKeyListener {
private static final String TAG = "PowerDialog";
static private StatusBarManager sStatusBar;
private Button mKeyguard;
private Button mPower;
private Button mRadioPower;
private Button mSilent;
private LocalPowerManager mPowerManager;
public PowerDialog(Context context, LocalPowerManager powerManager) {
super(context);
mPowerManager = powerManager;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getContext();
if (sStatusBar == null) {
sStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
}
setContentView(com.android.internal.R.layout.power_dialog);
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
if (!getContext().getResources().getBoolean(
com.android.internal.R.bool.config_sf_slowBlur)) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
}
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
setTitle(context.getText(R.string.power_dialog));
mKeyguard = (Button) findViewById(R.id.keyguard);
mPower = (Button) findViewById(R.id.off);
mRadioPower = (Button) findViewById(R.id.radio_power);
mSilent = (Button) findViewById(R.id.silent);
if (mKeyguard != null) {
mKeyguard.setOnKeyListener(this);
mKeyguard.setOnClickListener(this);
}
if (mPower != null) {
mPower.setOnClickListener(this);
}
if (mRadioPower != null) {
mRadioPower.setOnClickListener(this);
}
if (mSilent != null) {
mSilent.setOnClickListener(this);
// XXX: HACK for now hide the silent until we get mute support
mSilent.setVisibility(View.GONE);
}
CharSequence text;
// set the keyguard button's text
text = context.getText(R.string.screen_lock);
mKeyguard.setText(text);
mKeyguard.requestFocus();
try {
ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
if (phone != null) {
text = phone.isRadioOn() ? context
.getText(R.string.turn_off_radio) : context
.getText(R.string.turn_on_radio);
}
} catch (RemoteException ex) {
// ignore it
}
mRadioPower.setText(text);
}
public void onClick(View v) {
this.dismiss();
if (v == mPower) {
// shutdown by making sure radio and power are handled accordingly.
ShutdownThread.shutdown(getContext(), true);
} else if (v == mRadioPower) {
try {
ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
if (phone != null) {
phone.toggleRadioOnOff();
}
} catch (RemoteException ex) {
// ignore it
}
} else if (v == mSilent) {
// do something
} else if (v == mKeyguard) {
if (v.isInTouchMode()) {
// only in touch mode for the reasons explained in onKey.
this.dismiss();
mPowerManager.goToSleep(SystemClock.uptimeMillis() + 1);
}
}
}
public boolean onKey(View v, int keyCode, KeyEvent event) {
// The activate keyguard button needs to put the device to sleep on the
// key up event. If we try to put it to sleep on the click or down
// action
// the the up action will cause the device to wake back up.
// Log.i(TAG, "keyCode: " + keyCode + " action: " + event.getAction());
if (keyCode != KeyEvent.KEYCODE_DPAD_CENTER
|| event.getAction() != KeyEvent.ACTION_UP) {
// Log.i(TAG, "getting out of dodge...");
return false;
}
// Log.i(TAG, "Clicked mKeyguard! dimissing dialog");
this.dismiss();
// Log.i(TAG, "onKey: turning off the screen...");
// XXX: This is a hack for now
mPowerManager.goToSleep(event.getEventTime() + 1);
return true;
}
public void show() {
super.show();
Log.d(TAG, "show... disabling expand");
sStatusBar.disable(StatusBarManager.DISABLE_EXPAND);
}
public void dismiss() {
super.dismiss();
Log.d(TAG, "dismiss... reenabling expand");
sStatusBar.disable(StatusBarManager.DISABLE_NONE);
}
}