summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2010-01-12 15:19:04 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2010-01-12 15:19:04 -0800
commit9c832dd1e505c328ab203346fb18270e5633934b (patch)
tree5cdb26a41f504b1a4d9c0631f6294a2c0545858e
parent13ccdc2d7acd051840ba4b9e6a92ce10ac4fcb38 (diff)
downloadbase-9c832dd1e505c328ab203346fb18270e5633934b.tar.gz
android-2.1_r1 snapshot
-rw-r--r--phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java53
-rw-r--r--phone/com/android/internal/policy/impl/KeyguardViewManager.java2
-rw-r--r--phone/com/android/internal/policy/impl/KeyguardViewMediator.java33
-rw-r--r--phone/com/android/internal/policy/impl/LockPatternKeyguardView.java42
-rw-r--r--phone/com/android/internal/policy/impl/LockScreen.java129
-rwxr-xr-xphone/com/android/internal/policy/impl/PhoneWindowManager.java67
-rw-r--r--phone/com/android/internal/policy/impl/UnlockScreen.java38
7 files changed, 226 insertions, 138 deletions
diff --git a/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
index 58905a1..3483405 100644
--- a/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
+++ b/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
@@ -25,6 +25,7 @@ import android.database.ContentObserver;
import static android.os.BatteryManager.BATTERY_STATUS_CHARGING;
import static android.os.BatteryManager.BATTERY_STATUS_FULL;
import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
+import android.media.AudioManager;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
@@ -69,9 +70,9 @@ public class KeyguardUpdateMonitor {
private boolean mKeyguardBypassEnabled;
private boolean mDevicePluggedIn;
-
+
private boolean mDeviceProvisioned;
-
+
private int mBatteryLevel;
private CharSequence mTelephonyPlmn;
@@ -86,7 +87,7 @@ public class KeyguardUpdateMonitor {
private ArrayList<InfoCallback> mInfoCallbacks = Lists.newArrayList();
private ArrayList<SimStateCallback> mSimStateCallbacks = Lists.newArrayList();
private ContentObserver mContentObserver;
-
+
// messages for the handler
private static final int MSG_CONFIGURATION_CHANGED = 300;
@@ -94,14 +95,15 @@ public class KeyguardUpdateMonitor {
private static final int MSG_BATTERY_UPDATE = 302;
private static final int MSG_CARRIER_INFO_UPDATE = 303;
private static final int MSG_SIM_STATE_CHANGE = 304;
+ private static final int MSG_RINGER_MODE_CHANGED = 305;
/**
- * When we receive a
- * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast,
+ * When we receive a
+ * {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast,
* and then pass a result via our handler to {@link KeyguardUpdateMonitor#handleSimStateChange},
* we need a single object to pass to the handler. This class helps decode
- * the intent and provide a {@link SimCard.State} result.
+ * the intent and provide a {@link SimCard.State} result.
*/
private static class SimArgs {
@@ -140,7 +142,7 @@ public class KeyguardUpdateMonitor {
public KeyguardUpdateMonitor(Context context) {
mContext = context;
-
+
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -160,6 +162,9 @@ public class KeyguardUpdateMonitor {
case MSG_SIM_STATE_CHANGE:
handleSimStateChange((SimArgs) msg.obj);
break;
+ case MSG_RINGER_MODE_CHANGED:
+ handleRingerModeChange(msg.arg1);
+ break;
}
}
};
@@ -169,7 +174,7 @@ public class KeyguardUpdateMonitor {
mDeviceProvisioned = Settings.Secure.getInt(
mContext.getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
-
+
// Since device can't be un-provisioned, we only need to register a content observer
// to update mDeviceProvisioned when we are...
if (!mDeviceProvisioned) {
@@ -177,7 +182,7 @@ public class KeyguardUpdateMonitor {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
- mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(),
+ mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
if (mDeviceProvisioned && mContentObserver != null) {
// We don't need the observer anymore...
@@ -187,17 +192,17 @@ public class KeyguardUpdateMonitor {
if (DEBUG) Log.d(TAG, "DEVICE_PROVISIONED state = " + mDeviceProvisioned);
}
};
-
+
mContext.getContentResolver().registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.DEVICE_PROVISIONED),
false, mContentObserver);
-
+
// prevent a race condition between where we check the flag and where we register the
// observer by grabbing the value once again...
- mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(),
+ mDeviceProvisioned = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
}
-
+
mInPortrait = queryInPortrait();
mKeyboardOpen = queryKeyboardOpen();
@@ -217,6 +222,7 @@ public class KeyguardUpdateMonitor {
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(SPN_STRINGS_UPDATED_ACTION);
+ filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
context.registerReceiver(new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
@@ -242,15 +248,25 @@ public class KeyguardUpdateMonitor {
pluggedInStatus,
batteryLevel);
mHandler.sendMessage(msg);
- } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)){
+ } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
mHandler.sendMessage(mHandler.obtainMessage(
MSG_SIM_STATE_CHANGE,
new SimArgs(intent)));
+ } else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED,
+ intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0));
}
}
}, filter);
}
+ protected void handleRingerModeChange(int mode) {
+ if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")");
+ for (int i = 0; i < mInfoCallbacks.size(); i++) {
+ mInfoCallbacks.get(i).onRingerModeChanged(mode);
+ }
+ }
+
/**
* Handle {@link #MSG_CONFIGURATION_CHANGED}
*/
@@ -443,7 +459,7 @@ public class KeyguardUpdateMonitor {
}
/**
- * Callback for general information releveant to lock screen.
+ * Callback for general information relevant to lock screen.
*/
interface InfoCallback {
void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel);
@@ -455,6 +471,13 @@ public class KeyguardUpdateMonitor {
* @param spn The service provider name. May be null if it shouldn't be displayed.
*/
void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn);
+
+ /**
+ * Called when the ringer mode changes.
+ * @param state the current ringer state, as defined in
+ * {@link AudioManager#RINGER_MODE_CHANGED_ACTION}
+ */
+ void onRingerModeChanged(int state);
}
/**
diff --git a/phone/com/android/internal/policy/impl/KeyguardViewManager.java b/phone/com/android/internal/policy/impl/KeyguardViewManager.java
index bac2fca..d4dc429 100644
--- a/phone/com/android/internal/policy/impl/KeyguardViewManager.java
+++ b/phone/com/android/internal/policy/impl/KeyguardViewManager.java
@@ -92,7 +92,7 @@ public class KeyguardViewManager implements KeyguardWindowController {
* lazily.
*/
public synchronized void show() {
- if (DEBUG) Log.d(TAG, "show()");
+ if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView);
if (mKeyguardHost == null) {
if (DEBUG) Log.d(TAG, "keyguard host is null, creating it...");
diff --git a/phone/com/android/internal/policy/impl/KeyguardViewMediator.java b/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
index f5591b2..8d71146 100644
--- a/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -105,6 +105,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
private static final int KEYGUARD_DONE = 9;
private static final int KEYGUARD_DONE_DRAWING = 10;
private static final int KEYGUARD_DONE_AUTHENTICATING = 11;
+ private static final int SET_HIDDEN = 12;
/**
* The default amount of time we stay awake (used for all key input)
@@ -279,8 +280,9 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
/**
* Called to let us know the screen was turned off.
- * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER} or
- * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT}.
+ * @param why either {@link WindowManagerPolicy#OFF_BECAUSE_OF_USER},
+ * {@link WindowManagerPolicy#OFF_BECAUSE_OF_TIMEOUT} or
+ * {@link WindowManagerPolicy#OFF_BECAUSE_OF_PROX_SENSOR}.
*/
public void onScreenTurnedOff(int why) {
synchronized (this) {
@@ -311,6 +313,8 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
sender);
if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = "
+ mDelayedShowingSequence);
+ } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_PROX_SENSOR) {
+ // Do not enable the keyguard if the prox sensor forced the screen off.
} else {
doKeyguard();
}
@@ -421,13 +425,31 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
}
/**
+ * Is the keyguard currently showing and not being force hidden?
+ */
+ public boolean isShowingAndNotHidden() {
+ return mShowing && !mHidden;
+ }
+
+ /**
* Notify us when the keyguard is hidden by another window
*/
public void setHidden(boolean isHidden) {
if (DEBUG) Log.d(TAG, "setHidden " + isHidden);
+ mHandler.removeMessages(SET_HIDDEN);
+ Message msg = mHandler.obtainMessage(SET_HIDDEN, (isHidden ? 1 : 0), 0);
+ mHandler.sendMessage(msg);
+ }
+
+ /**
+ * Handles SET_HIDDEN message sent by setHidden()
+ */
+ private void handleSetHidden(boolean isHidden) {
synchronized (KeyguardViewMediator.this) {
- mHidden = isHidden;
- adjustUserActivityLocked();
+ if (mHidden != isHidden) {
+ mHidden = isHidden;
+ adjustUserActivityLocked();
+ }
}
}
@@ -812,6 +834,9 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
case KEYGUARD_DONE_AUTHENTICATING:
keyguardDone(true);
return;
+ case SET_HIDDEN:
+ handleSetHidden(msg.arg1 != 0);
+ break;
}
}
};
diff --git a/phone/com/android/internal/policy/impl/LockPatternKeyguardView.java b/phone/com/android/internal/policy/impl/LockPatternKeyguardView.java
index 0ebd945..00dc929 100644
--- a/phone/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/phone/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -160,7 +160,10 @@ public class LockPatternKeyguardView extends KeyguardViewBase
} catch (AuthenticatorException e) {
}
mEnableFallback = !hasSAMLAccount;
- if (mUnlockScreen instanceof UnlockScreen) {
+
+ if (mUnlockScreen == null) {
+ Log.w(TAG, "no unlock screen when receiving AccountManager information");
+ } else if (mUnlockScreen instanceof UnlockScreen) {
((UnlockScreen)mUnlockScreen).setEnableFallback(true);
}
}
@@ -179,18 +182,6 @@ public class LockPatternKeyguardView extends KeyguardViewBase
KeyguardWindowController controller) {
super(context);
- final boolean hasAccount = AccountManager.get(context).getAccounts().length > 0;
- if (hasAccount) {
- /* If we have a SAML account which requires web login we can not use the
- fallback screen UI to ask the user for credentials.
- For now we will disable fallback screen in this case.
- Ultimately we could consider bringing up a web login from GLS
- but need to make sure that it will work in the "locked screen" mode. */
- String[] features = new String[] {"saml"};
- AccountManager.get(context).getAccountsByTypeAndFeatures(
- "com.google", features, this, null);
- }
-
mEnableFallback = false;
mRequiresSim =
@@ -275,6 +266,9 @@ public class LockPatternKeyguardView extends KeyguardViewBase
public void reportFailedPatternAttempt() {
mUpdateMonitor.reportFailedAttempt();
final int failedAttempts = mUpdateMonitor.getFailedAttempts();
+ if (DEBUG) Log.d(TAG,
+ "reportFailedPatternAttempt: #" + failedAttempts +
+ " (enableFallback=" + mEnableFallback + ")");
if (mEnableFallback && failedAttempts ==
(LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET
- LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT)) {
@@ -313,8 +307,28 @@ public class LockPatternKeyguardView extends KeyguardViewBase
mLockScreen = createLockScreen();
addView(mLockScreen);
final UnlockMode unlockMode = getUnlockMode();
+ if (DEBUG) Log.d(TAG,
+ "LockPatternKeyguardView ctor: about to createUnlockScreenFor; mEnableFallback="
+ + mEnableFallback);
mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreenMode = unlockMode;
+
+ // Ask the account manager if we have an account that can be used as a
+ // fallback in case the user forgets his pattern. The response comes
+ // back in run() below; don't bother asking until you've called
+ // createUnlockScreenFor(), else the information will go unused.
+ final boolean hasAccount = AccountManager.get(context).getAccounts().length > 0;
+ if (hasAccount) {
+ /* If we have a SAML account which requires web login we can not use the
+ fallback screen UI to ask the user for credentials.
+ For now we will disable fallback screen in this case.
+ Ultimately we could consider bringing up a web login from GLS
+ but need to make sure that it will work in the "locked screen" mode. */
+ String[] features = new String[] {"saml"};
+ AccountManager.get(context).getAccountsByTypeAndFeatures(
+ "com.google", features, this, null);
+ }
+
addView(mUnlockScreen);
updateScreen(mMode);
}
@@ -475,6 +489,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase
mUpdateMonitor,
mKeyguardScreenCallback,
mUpdateMonitor.getFailedAttempts());
+ if (DEBUG) Log.d(TAG,
+ "createUnlockScreenFor(" + unlockMode + "): mEnableFallback=" + mEnableFallback);
view.setEnableFallback(mEnableFallback);
return view;
} else if (unlockMode == UnlockMode.SimPin) {
diff --git a/phone/com/android/internal/policy/impl/LockScreen.java b/phone/com/android/internal/policy/impl/LockScreen.java
index dda5097..7514cc2 100644
--- a/phone/com/android/internal/policy/impl/LockScreen.java
+++ b/phone/com/android/internal/policy/impl/LockScreen.java
@@ -17,8 +17,9 @@
package com.android.internal.policy.impl;
import com.android.internal.R;
+import com.android.internal.telephony.IccCard;
import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.RotarySelector;
+import com.android.internal.widget.SlidingTab;
import android.content.Context;
import android.content.res.Resources;
@@ -33,11 +34,8 @@ import android.util.Log;
import android.media.AudioManager;
import android.os.SystemProperties;
-import com.android.internal.telephony.IccCard;
-
import java.util.Date;
import java.io.File;
-import java.text.SimpleDateFormat;
/**
* The screen within {@link LockPatternKeyguardView} that shows general
@@ -46,7 +44,7 @@ import java.text.SimpleDateFormat;
*/
class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateMonitor.InfoCallback,
KeyguardUpdateMonitor.SimStateCallback, KeyguardUpdateMonitor.ConfigurationChangeCallback,
- RotarySelector.OnDialTriggerListener {
+ SlidingTab.OnTriggerListener {
private static final boolean DBG = false;
private static final String TAG = "LockScreen";
@@ -59,7 +57,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
private final KeyguardScreenCallback mCallback;
private TextView mCarrier;
- private RotarySelector mRotary;
+ private SlidingTab mSelector;
private TextView mTime;
private TextView mDate;
private TextView mStatus1;
@@ -83,7 +81,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
private boolean mSilentMode;
private AudioManager mAudioManager;
- private java.text.DateFormat mDateFormat;
+ private String mDateFormatString;
private java.text.DateFormat mTimeFormat;
private boolean mCreatedInPortrait;
private boolean mEnableMenuKeyInLockScreen;
@@ -175,13 +173,12 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
final LayoutInflater inflater = LayoutInflater.from(context);
if (mCreatedInPortrait) {
- inflater.inflate(R.layout.keyguard_screen_rotary_unlock, this, true);
+ inflater.inflate(R.layout.keyguard_screen_tab_unlock, this, true);
} else {
- inflater.inflate(R.layout.keyguard_screen_rotary_unlock_land, this, true);
+ inflater.inflate(R.layout.keyguard_screen_tab_unlock_land, this, true);
}
mCarrier = (TextView) findViewById(R.id.carrier);
- mTime = (TextView) findViewById(R.id.time);
mDate = (TextView) findViewById(R.id.date);
mStatus1 = (TextView) findViewById(R.id.status1);
mStatus2 = (TextView) findViewById(R.id.status2);
@@ -189,7 +186,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton);
mEmergencyCallButton.setText(R.string.lockscreen_emergency_call);
mScreenLocked = (TextView) findViewById(R.id.screenLocked);
- mRotary = (RotarySelector) findViewById(R.id.rotary);
+ mSelector = (SlidingTab) findViewById(R.id.tab_selector);
+ mSelector.setHoldAfterTrigger(true, false);
+ mSelector.setLeftHintText(R.string.lockscreen_unlock_label);
mEmergencyCallButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mCallback.takeEmergencyCallAction();
@@ -205,17 +204,35 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
updateMonitor.registerConfigurationChangeCallback(this);
mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
- mSilentMode = mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
+ mSilentMode = isSilentMode();
- mRotary.setOnDialTriggerListener(this);
- mRotary.setLeftHandleResource(R.drawable.ic_jog_dial_unlock);
- mRotary.setRightHandleResource(mSilentMode ?
- R.drawable.ic_jog_dial_sound_off :
- R.drawable.ic_jog_dial_sound_on);
+ mSelector.setLeftTabResources(
+ R.drawable.ic_jog_dial_unlock,
+ R.drawable.jog_tab_target_green,
+ R.drawable.jog_tab_bar_left_unlock,
+ R.drawable.jog_tab_left_unlock);
+
+ updateRightTabResources();
+
+ mSelector.setOnTriggerListener(this);
resetStatusInfo(updateMonitor);
}
+ private boolean isSilentMode() {
+ return mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
+ }
+
+ private void updateRightTabResources() {
+ mSelector.setRightTabResources(
+ mSilentMode ? R.drawable.ic_jog_dial_sound_off : R.drawable.ic_jog_dial_sound_on,
+ mSilentMode ? R.drawable.jog_tab_target_yellow : R.drawable.jog_tab_target_gray,
+ mSilentMode ? R.drawable.jog_tab_bar_right_sound_on
+ : R.drawable.jog_tab_bar_right_sound_off,
+ mSilentMode ? R.drawable.jog_tab_right_sound_on
+ : R.drawable.jog_tab_right_sound_off);
+ }
+
private void resetStatusInfo(KeyguardUpdateMonitor updateMonitor) {
mShowingBatteryInfo = updateMonitor.shouldShowBatteryInfo();
mPluggedIn = updateMonitor.isDevicePluggedIn();
@@ -228,7 +245,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
refreshAlarmDisplay();
mTimeFormat = DateFormat.getTimeFormat(getContext());
- mDateFormat = getLockScreenDateFormat();
+ mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year);
refreshTimeAndDateDisplay();
updateStatusLines();
}
@@ -242,24 +259,23 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
}
/** {@inheritDoc} */
- public void onDialTrigger(View v, int whichHandle) {
- if (whichHandle == RotarySelector.OnDialTriggerListener.LEFT_HANDLE) {
+ public void onTrigger(View v, int whichHandle) {
+ if (whichHandle == SlidingTab.OnTriggerListener.LEFT_HANDLE) {
mCallback.goToUnlockScreen();
- } else if (whichHandle == RotarySelector.OnDialTriggerListener.RIGHT_HANDLE) {
+ } else if (whichHandle == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
// toggle silent mode
mSilentMode = !mSilentMode;
mAudioManager.setRingerMode(mSilentMode ? AudioManager.RINGER_MODE_SILENT
: AudioManager.RINGER_MODE_NORMAL);
- final int handleIcon = mSilentMode ?
- R.drawable.ic_jog_dial_sound_off :
- R.drawable.ic_jog_dial_sound_on;
- final int toastIcon = mSilentMode ?
- R.drawable.ic_lock_ringer_off :
- R.drawable.ic_lock_ringer_on;
- mRotary.setRightHandleResource(handleIcon);
+
+ updateRightTabResources();
+
String message = mSilentMode ?
getContext().getString(R.string.global_action_silent_mode_on_status) :
getContext().getString(R.string.global_action_silent_mode_off_status);
+
+ final int toastIcon = mSilentMode ? R.drawable.ic_lock_ringer_off
+ : R.drawable.ic_lock_ringer_on;
toastMessage(mScreenLocked, message, toastIcon);
mCallback.pokeWakelock();
}
@@ -267,7 +283,12 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
/** {@inheritDoc} */
public void onGrabbedStateChange(View v, int grabbedState) {
- // TODO: Update onscreen hint text based on the new state.
+ if (grabbedState == SlidingTab.OnTriggerListener.RIGHT_HANDLE) {
+ mSilentMode = isSilentMode();
+ mSelector.setRightHintText(mSilentMode ? R.string.lockscreen_sound_on_label
+ : R.string.lockscreen_sound_off_label);
+ }
+ mCallback.pokeWakelock();
}
/**
@@ -354,30 +375,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
}
private void refreshTimeAndDateDisplay() {
- Date now = new Date();
- mTime.setText(mTimeFormat.format(now));
- mDate.setText(mDateFormat.format(now));
- }
-
- /**
- * @return A localized format like "Fri, Sep 18, 2009"
- */
- private java.text.DateFormat getLockScreenDateFormat() {
- SimpleDateFormat adjusted = null;
- try {
- // this call gives us the localized order
- final SimpleDateFormat dateFormat = (SimpleDateFormat)
- java.text.DateFormat.getDateInstance(java.text.DateFormat.FULL);
- adjusted = new SimpleDateFormat(dateFormat.toPattern()
- .replace("MMMM", "MMM") // we want "Sep", not "September"
- .replace("EEEE", "EEE")); // we want "Fri", no "Friday"
- } catch (ClassCastException e) {
- // in case the library implementation changes and this throws a class cast exception
- // or anything else that is funky
- Log.e("LockScreen", "couldn't finnagle our custom date format :(", e);
- return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
- }
- return adjusted;
+ mDate.setText(DateFormat.format(mDateFormatString, new Date()));
}
private void updateStatusLines() {
@@ -468,7 +466,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.VISIBLE);
- mRotary.setVisibility(View.VISIBLE);
+ mSelector.setVisibility(View.VISIBLE);
mEmergencyCallButton.setVisibility(View.GONE);
break;
case NetworkLocked:
@@ -478,7 +476,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.VISIBLE);
- mRotary.setVisibility(View.VISIBLE);
+ mSelector.setVisibility(View.VISIBLE);
mEmergencyCallButton.setVisibility(View.GONE);
break;
case SimMissing:
@@ -488,9 +486,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.INVISIBLE);
- mRotary.setVisibility(View.VISIBLE);
+ mSelector.setVisibility(View.VISIBLE);
mEmergencyCallButton.setVisibility(View.VISIBLE);
- putEmergencyBelow(R.id.divider);
+ putEmergencyBelow(R.id.screenLocked);
break;
case SimMissingLocked:
// text
@@ -499,7 +497,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.VISIBLE);
- mRotary.setVisibility(View.GONE);
+ mSelector.setVisibility(View.GONE);
mEmergencyCallButton.setVisibility(View.VISIBLE);
putEmergencyBelow(R.id.screenLocked);
break;
@@ -509,7 +507,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.INVISIBLE);
- mRotary.setVisibility(View.VISIBLE);
+ mSelector.setVisibility(View.VISIBLE);
mEmergencyCallButton.setVisibility(View.GONE);
break;
case SimPukLocked:
@@ -519,7 +517,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
// layout
mScreenLocked.setVisibility(View.VISIBLE);
- mRotary.setVisibility(View.GONE);
+ mSelector.setVisibility(View.GONE);
mEmergencyCallButton.setVisibility(View.VISIBLE);
putEmergencyBelow(R.id.screenLocked);
break;
@@ -563,7 +561,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
public boolean needsInput() {
return false;
}
-
+
/** {@inheritDoc} */
public void onPause() {
@@ -578,4 +576,13 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM
public void cleanUp() {
mUpdateMonitor.removeCallback(this);
}
+
+ /** {@inheritDoc} */
+ public void onRingerModeChanged(int state) {
+ boolean silent = AudioManager.RINGER_MODE_SILENT == state;
+ if (silent != mSilentMode) {
+ mSilentMode = silent;
+ updateRightTabResources();
+ }
+ }
}
diff --git a/phone/com/android/internal/policy/impl/PhoneWindowManager.java b/phone/com/android/internal/policy/impl/PhoneWindowManager.java
index e57fbe8..27a42bc 100755
--- a/phone/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/phone/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -85,6 +85,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
import static android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
+import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
@@ -94,7 +95,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import android.view.WindowManagerImpl;
import android.view.WindowManagerPolicy;
-import android.view.WindowManagerPolicy.WindowState;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.media.IAudioService;
@@ -121,25 +121,26 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final int PHONE_LAYER = 3;
static final int SEARCH_BAR_LAYER = 4;
static final int STATUS_BAR_PANEL_LAYER = 5;
+ static final int SYSTEM_DIALOG_LAYER = 6;
// toasts and the plugged-in battery thing
- static final int TOAST_LAYER = 6;
- static final int STATUS_BAR_LAYER = 7;
+ static final int TOAST_LAYER = 7;
+ static final int STATUS_BAR_LAYER = 8;
// SIM errors and unlock. Not sure if this really should be in a high layer.
- static final int PRIORITY_PHONE_LAYER = 8;
+ static final int PRIORITY_PHONE_LAYER = 9;
// like the ANR / app crashed dialogs
- static final int SYSTEM_ALERT_LAYER = 9;
+ static final int SYSTEM_ALERT_LAYER = 10;
// system-level error dialogs
- static final int SYSTEM_ERROR_LAYER = 10;
+ static final int SYSTEM_ERROR_LAYER = 11;
// on-screen keyboards and other such input method user interfaces go here.
- static final int INPUT_METHOD_LAYER = 11;
+ static final int INPUT_METHOD_LAYER = 12;
// on-screen keyboards and other such input method user interfaces go here.
- static final int INPUT_METHOD_DIALOG_LAYER = 12;
+ static final int INPUT_METHOD_DIALOG_LAYER = 13;
// the keyguard; nothing on top of these can take focus, since they are
// responsible for power management when displayed.
- static final int KEYGUARD_LAYER = 13;
- static final int KEYGUARD_DIALOG_LAYER = 14;
+ static final int KEYGUARD_LAYER = 14;
+ static final int KEYGUARD_DIALOG_LAYER = 15;
// things in here CAN NOT take focus, but are shown on top of everything else.
- static final int SYSTEM_OVERLAY_LAYER = 15;
+ static final int SYSTEM_OVERLAY_LAYER = 16;
static final int APPLICATION_MEDIA_SUBLAYER = -2;
static final int APPLICATION_MEDIA_OVERLAY_SUBLAYER = -1;
@@ -154,6 +155,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
+ static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
final Object mLock = new Object();
@@ -441,7 +443,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (mGlobalActions == null) {
mGlobalActions = new GlobalActions(mContext);
}
- final boolean keyguardShowing = mKeyguardMediator.isShowing();
+ final boolean keyguardShowing = mKeyguardMediator.isShowingAndNotHidden();
mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
if (keyguardShowing) {
// since it took two seconds of long press to bring this up,
@@ -686,6 +688,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return STATUS_BAR_LAYER;
case TYPE_STATUS_BAR_PANEL:
return STATUS_BAR_PANEL_LAYER;
+ case TYPE_SYSTEM_DIALOG:
+ return SYSTEM_DIALOG_LAYER;
case TYPE_SEARCH_BAR:
return SEARCH_BAR_LAYER;
case TYPE_PHONE:
@@ -1108,7 +1112,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
* given the situation with the keyguard.
*/
void launchHomeFromHotKey() {
- if (!mHideLockScreen && mKeyguardMediator.isShowing()) {
+ if (mKeyguardMediator.isShowingAndNotHidden()) {
// don't launch home if keyguard showing
} else if (!mHideLockScreen && mKeyguardMediator.isInputRestricted()) {
// when in keyguard restricted mode, must first verify unlock
@@ -1120,7 +1124,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
ActivityManagerNative.getDefault().stopAppSwitches();
} catch (RemoteException e) {
}
- sendCloseSystemWindows();
+ sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);
startDockOrHome();
}
}
@@ -1131,7 +1135,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
ActivityManagerNative.getDefault().stopAppSwitches();
} catch (RemoteException e) {
}
- sendCloseSystemWindows();
+ sendCloseSystemWindows(SYSTEM_DIALOG_REASON_HOME_KEY);
startDockOrHome();
}
}
@@ -1619,14 +1623,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public int interceptKeyTq(RawInputEvent event, boolean screenIsOn) {
int result = ACTION_PASS_TO_USER;
final boolean isWakeKey = isWakeKeyTq(event);
- final boolean keyguardShowing = keyguardIsShowingTq();
+ // If screen is off then we treat the case where the keyguard is open but hidden
+ // the same as if it were open and in front.
+ // This will prevent any keys other than the power button from waking the screen
+ // when the keyguard is hidden by another activity.
+ final boolean keyguardActive = (screenIsOn ?
+ mKeyguardMediator.isShowingAndNotHidden() :
+ mKeyguardMediator.isShowing());
if (false) {
Log.d(TAG, "interceptKeyTq event=" + event + " keycode=" + event.keycode
- + " screenIsOn=" + screenIsOn + " keyguardShowing=" + keyguardShowing);
+ + " screenIsOn=" + screenIsOn + " keyguardActive=" + keyguardActive);
}
- if (keyguardShowing) {
+ if (keyguardActive) {
if (screenIsOn) {
// when the screen is on, always give the event to the keyguard
result |= ACTION_PASS_TO_USER;
@@ -1644,14 +1654,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (!mKeyguardMediator.onWakeKeyWhenKeyguardShowingTq(event.keycode)
&& (event.keycode == KeyEvent.KEYCODE_VOLUME_DOWN
|| event.keycode == KeyEvent.KEYCODE_VOLUME_UP)) {
+ // when keyguard is showing and screen off, we need
+ // to handle the volume key for calls and music here
if (isInCall()) {
- // if the keyguard didn't wake the device, we are in call, and
- // it is a volume key, turn on the screen so that the user
- // can more easily adjust the in call volume.
- mKeyguardMediator.pokeWakelock();
+ handleVolumeKey(AudioManager.STREAM_VOICE_CALL, event.keycode);
} else if (isMusicActive()) {
- // when keyguard is showing and screen off, we need
- // to handle the volume key for music here
handleVolumeKey(AudioManager.STREAM_MUSIC, event.keycode);
}
}
@@ -1720,7 +1727,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mShouldTurnOffOnKeyUp = false;
boolean gohome = (mEndcallBehavior & ENDCALL_HOME) != 0;
boolean sleeps = (mEndcallBehavior & ENDCALL_SLEEPS) != 0;
- if (keyguardShowing
+ if (keyguardActive
|| (sleeps && !gohome)
|| (gohome && !goHome() && sleeps)) {
// they must already be on the keyguad or home screen,
@@ -1923,7 +1930,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
/** {@inheritDoc} */
public boolean keyguardIsShowingTq() {
- return mKeyguardMediator.isShowing();
+ return mKeyguardMediator.isShowingAndNotHidden();
}
/** {@inheritDoc} */
@@ -1997,8 +2004,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
try {
int menuState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_MENU);
int sState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_S);
- int dpadState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_DPAD_CENTER);
- int trackballState = mWindowManager.getScancodeState(RawInputEvent.BTN_MOUSE);
+ int dpadState = mWindowManager.getDPadKeycodeState(KeyEvent.KEYCODE_DPAD_CENTER);
+ int trackballState = mWindowManager.getTrackballScancodeState(RawInputEvent.BTN_MOUSE);
mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0;
performHapticFeedbackLw(null, mSafeMode
? HapticFeedbackConstants.SAFE_MODE_ENABLED
@@ -2193,7 +2200,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) {
final boolean hapticsDisabled = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0;
- if (!always && (hapticsDisabled || mKeyguardMediator.isShowing())) {
+ if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) {
return false;
}
switch (effectId) {
@@ -2221,7 +2228,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
public void screenOnStoppedLw() {
- if (!mKeyguardMediator.isShowing()) {
+ if (!mKeyguardMediator.isShowingAndNotHidden() && mPowerManager.isScreenOn()) {
long curTime = SystemClock.uptimeMillis();
mPowerManager.userActivity(curTime, false, LocalPowerManager.OTHER_EVENT);
}
diff --git a/phone/com/android/internal/policy/impl/UnlockScreen.java b/phone/com/android/internal/policy/impl/UnlockScreen.java
index a5032b3..e090ac5 100644
--- a/phone/com/android/internal/policy/impl/UnlockScreen.java
+++ b/phone/com/android/internal/policy/impl/UnlockScreen.java
@@ -27,6 +27,7 @@ import android.widget.Button;
import android.widget.TextView;
import android.text.format.DateFormat;
import android.text.TextUtils;
+import android.util.Log;
import com.android.internal.R;
import com.android.internal.telephony.IccCard;
import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
@@ -45,6 +46,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
implements KeyguardScreen, KeyguardUpdateMonitor.ConfigurationChangeCallback,
KeyguardUpdateMonitor.InfoCallback, KeyguardUpdateMonitor.SimStateCallback {
+ private static final boolean DEBUG = false;
private static final String TAG = "UnlockScreen";
// how long before we clear the wrong pattern
@@ -71,10 +73,10 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
private boolean mCreatedInPortrait;
+ private String mDateFormatString;
+
private TextView mCarrier;
- private TextView mCenterDot;
private TextView mDate;
- private TextView mTime;
// are we showing battery information?
private boolean mShowingBatteryInfo = false;
@@ -102,7 +104,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
* Keeps track of the last time we poked the wake lock during dispatching
* of the touch event, initalized to something gauranteed to make us
* poke it when the user starts drawing the pattern.
- * @see #dispatchTouchEvent(android.view.MotionEvent)
+ * @see #dispatchTouchEvent(android.view.MotionEvent)
*/
private long mLastPokeTime = -UNLOCK_PATTERN_WAKE_INTERVAL_MS;
@@ -162,6 +164,12 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
mTotalFailedPatternAttempts = totalFailedAttempts;
mFailedPatternAttemptsSinceLastTimeout = totalFailedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT;
+ if (DEBUG) Log.d(TAG,
+ "UnlockScreen() ctor: totalFailedAttempts="
+ + totalFailedAttempts + ", mFailedPat...="
+ + mFailedPatternAttemptsSinceLastTimeout
+ );
+
if (mUpdateMonitor.isInPortrait()) {
LayoutInflater.from(context).inflate(R.layout.keyguard_screen_unlock_portrait, this, true);
} else {
@@ -169,11 +177,9 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
}
mCarrier = (TextView) findViewById(R.id.carrier);
- mCenterDot = (TextView) findViewById(R.id.centerDot);
mDate = (TextView) findViewById(R.id.date);
- mTime = (TextView) findViewById(R.id.time);
- mCenterDot.setText("|");
+ mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year);
refreshTimeAndDateDisplay();
mStatus1 = (TextView) findViewById(R.id.status1);
@@ -241,9 +247,10 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
}
public void setEnableFallback(boolean state) {
+ if (DEBUG) Log.d(TAG, "setEnableFallback(" + state + ")");
mEnableFallback = state;
}
-
+
private void resetStatusInfo() {
mInstructions = null;
mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo();
@@ -322,9 +329,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
private void refreshTimeAndDateDisplay() {
- Date now = new Date();
- mTime.setText(DateFormat.getTimeFormat(getContext()).format(now));
- mDate.setText(DateFormat.getMediumDateFormat(getContext()).format(now));
+ mDate.setText(DateFormat.format(mDateFormatString, new Date()));
}
@@ -363,6 +368,11 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
mCarrier.setText(LockScreen.getCarrierString(plmn, spn));
}
+ /** {@inheritDoc} */
+ public void onRingerModeChanged(int state) {
+ // not currently used
+ }
+
// ---------- SimStateCallback
/** {@inheritDoc} */
@@ -386,7 +396,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
public boolean needsInput() {
return false;
}
-
+
/** {@inheritDoc} */
public void onPause() {
if (mCountdownTimer != null) {
@@ -404,9 +414,9 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
mLockPatternView.enableInput();
mLockPatternView.setEnabled(true);
mLockPatternView.clearPattern();
-
+
// show "forgot pattern?" button if we have an alternate authentication method
- mForgotPatternButton.setVisibility(mCallback.doesFallbackUnlockScreenExist()
+ mForgotPatternButton.setVisibility(mCallback.doesFallbackUnlockScreenExist()
? View.VISIBLE : View.INVISIBLE);
// if the user is currently locked out, enforce it.
@@ -452,7 +462,7 @@ class UnlockScreen extends LinearLayoutWithDefaultTouchRecepient
public void onPatternCellAdded(List<Cell> pattern) {
// To guard against accidental poking of the wakelock, look for
- // the user actually trying to draw a pattern of some minimal length.
+ // the user actually trying to draw a pattern of some minimal length.
if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) {
mCallback.pokeWakelock(UNLOCK_PATTERN_WAKE_INTERVAL_MS);
}