From 47df44aad773fb2a46d4c07e20278c7d8c0b16be Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 6 Sep 2012 17:51:12 -0700 Subject: [PATCH] Fix EmergencyDialer button on devices without telephony hardware This fixes showing the emergency dialer on devices without telephony. Two fixes were required: 1. Move emergency dialer code to the view that contains it (KeyguardSelectorView). 2. Always call onPause() or onResume() in onScreenTurnedOff() and onScreenTurnedOn(), respectively. Fixes bug 7117895 Change-Id: I96769fdda8478b6b60f46f7470bed2279ea2de72 --- .../impl/keyguard/KeyguardHostView.java | 33 +----------- .../impl/keyguard/KeyguardSecurityModel.java | 3 +- .../impl/keyguard/KeyguardSelectorView.java | 54 +++++++++++++++---- .../impl/keyguard/KeyguardStatusView.java | 1 + .../keyguard/KeyguardStatusViewManager.java | 39 +------------- 5 files changed, 49 insertions(+), 81 deletions(-) diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java index 058bf922e3ef7..452fca0ee15b5 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -57,12 +57,6 @@ public class KeyguardHostView extends KeyguardViewBase { static final int APPWIDGET_HOST_ID = 0x4B455947; private static final String KEYGUARD_WIDGET_PREFS = "keyguard_widget_prefs"; - // time after launching EmergencyDialer before the screen goes blank. - private static final int EMERGENCY_CALL_TIMEOUT = 10000; - - // intent action for launching emergency dialer activity. - static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL"; - private static final String TAG = "KeyguardViewHost"; private static final int SECURITY_SELECTOR_ID = R.id.keyguard_selector_view; @@ -76,7 +70,6 @@ public class KeyguardHostView extends KeyguardViewBase { private AppWidgetHost mAppWidgetHost; private KeyguardWidgetPager mAppWidgetContainer; private ViewFlipper mViewFlipper; - private Button mEmergencyDialerButton; private boolean mEnableMenuKey; private boolean mIsVerifyUnlockOnly; private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView @@ -142,14 +135,6 @@ public class KeyguardHostView extends KeyguardViewBase { Log.v("*********", "Can't find view id " + mViewIds[i]); } } - - // Enable emergency dialer button - mEmergencyDialerButton = (Button) findViewById(R.id.emergency_call_button); - mEmergencyDialerButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - takeEmergencyCallAction(); - } - }); } void setLockPatternUtils(LockPatternUtils utils) { @@ -225,22 +210,6 @@ public class KeyguardHostView extends KeyguardViewBase { }; - /** - * Shows the emergency dialer or returns the user to the existing call. - */ - public void takeEmergencyCallAction() { - mCallback.userActivity(EMERGENCY_CALL_TIMEOUT); - if (TelephonyManager.getDefault().getCallState() - == TelephonyManager.CALL_STATE_OFFHOOK) { - mLockPatternUtils.resumeCall(); - } else { - Intent intent = new Intent(ACTION_EMERGENCY_DIAL); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - getContext().startActivity(intent); - } - } - private void showDialog(String title, String message) { final AlertDialog dialog = new AlertDialog.Builder(mContext) .setTitle(title) @@ -526,12 +495,14 @@ public class KeyguardHostView extends KeyguardViewBase { public void onScreenTurnedOn() { if (DEBUG) Log.d(TAG, "screen on"); showSecurityScreen(mCurrentSecurityId); + getSecurityView(mCurrentSecurityId).onResume(); } @Override public void onScreenTurnedOff() { if (DEBUG) Log.d(TAG, "screen off"); showSecurityScreen(SECURITY_SELECTOR_ID); + getSecurityView(mCurrentSecurityId).onPause(); } @Override diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java index a19b35dda5716..75c4a7cc29f20 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java @@ -69,7 +69,8 @@ public class KeyguardSecurityModel { SecurityMode mode = SecurityMode.None; if (simState == IccCardConstants.State.PIN_REQUIRED) { mode = SecurityMode.SimPin; - } else if (simState == IccCardConstants.State.PUK_REQUIRED) { + } else if (simState == IccCardConstants.State.PUK_REQUIRED + && mLockPatternUtils.isPukUnlockScreenEnable()) { mode = SecurityMode.SimPuk; } else { final int security = mLockPatternUtils.getKeyguardStoredPasswordQuality(); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java index 28f5e8ca7d6d4..95772af8484f5 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -25,6 +25,7 @@ import android.content.Intent; import android.os.RemoteException; import android.os.UserHandle; import android.provider.MediaStore; +import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; import android.util.Slog; @@ -33,6 +34,7 @@ import android.widget.Button; import android.widget.LinearLayout; import com.android.internal.telephony.IccCardConstants; +import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.multiwaveview.GlowPadView; import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener; @@ -43,6 +45,9 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri private static final String TAG = "SecuritySelectorView"; private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; + private static final int EMERGENCY_CALL_TIMEOUT = 10000; // screen timeout after starting e.d. + static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL"; + private KeyguardSecurityCallback mCallback; private GlowPadView mGlowPadView; private Button mEmergencyCallButton; @@ -98,9 +103,19 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri }; - KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { + private void updateEmergencyCallButton(State simState, int phoneState) { + if (mEmergencyCallButton != null) { + boolean en = mLockPatternUtils.isEmergencyCallCapable() + || (phoneState == TelephonyManager.CALL_STATE_OFFHOOK); // voice call in progress + if (en && KeyguardUpdateMonitor.isSimLocked(simState)) { + // Some countries can't handle emergency calls while SIM is locked. + en = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked(); + } + mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, phoneState, en); + } + } - private boolean mEmergencyDialerDisableBecauseSimLocked; + KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override public void onDevicePolicyManagerStateChanged() { @@ -108,19 +123,15 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri } @Override - public void onSimStateChanged(IccCardConstants.State simState) { - // Some carriers aren't capable of handling emergency calls while the SIM is locked - mEmergencyDialerDisableBecauseSimLocked = KeyguardUpdateMonitor.isSimLocked(simState) - && !mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked(); + public void onSimStateChanged(State simState) { + int phoneState = KeyguardUpdateMonitor.getInstance(mContext).getPhoneState(); + updateEmergencyCallButton(simState, phoneState); updateTargets(); } void onPhoneStateChanged(int phoneState) { - if (mEmergencyCallButton != null) { - mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked(); - mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, - phoneState, !mEmergencyDialerDisableBecauseSimLocked); - } + State simState = KeyguardUpdateMonitor.getInstance(mContext).getSimState(); + updateEmergencyCallButton(simState, phoneState); }; }; @@ -149,9 +160,30 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); mGlowPadView.setOnTriggerListener(mOnTriggerListener); mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button); + mEmergencyCallButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + takeEmergencyCallAction(); + } + }); updateTargets(); } + /** + * Shows the emergency dialer or returns the user to the existing call. + */ + public void takeEmergencyCallAction() { + mCallback.userActivity(EMERGENCY_CALL_TIMEOUT); + if (TelephonyManager.getDefault().getCallState() + == TelephonyManager.CALL_STATE_OFFHOOK) { + mLockPatternUtils.resumeCall(); + } else { + Intent intent = new Intent(ACTION_EMERGENCY_DIAL); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + getContext().startActivity(intent); + } + } + public boolean isTargetPresent(int resId) { return mGlowPadView.getTargetPosition(resId) != -1; } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java index 481e9ad5433b9..57044259b445f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java @@ -21,6 +21,7 @@ import android.util.AttributeSet; import android.widget.GridLayout; public class KeyguardStatusView extends GridLayout { + @SuppressWarnings("unused") private KeyguardStatusViewManager mStatusViewManager; public KeyguardStatusView(Context context) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java index 20fad0b9997ca..e325f948ae59a 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java @@ -32,11 +32,10 @@ import android.text.TextUtils; import android.text.format.DateFormat; import android.util.Log; import android.view.View; -import android.widget.Button; import android.widget.TextView; /*** - * Manages a number of views inside of LockScreen layouts. See below for a list of widgets + * Manages a number of views inside of the given layout. See below for a list of widgets. */ class KeyguardStatusViewManager { private static final boolean DEBUG = false; @@ -92,21 +91,12 @@ class KeyguardStatusViewManager { private boolean mShowingStatus; private CharSequence mPlmn; private CharSequence mSpn; - protected int mPhoneState; private DigitalClock mDigitalClock; protected boolean mBatteryCharged; protected boolean mBatteryIsLow; - private boolean mEmergencyButtonEnabledBecauseSimLocked; - private Button mEmergencyCallButton; - private boolean mEmergencyCallButtonEnabledInScreen; /** - * * @param view the containing view of all widgets - * @param updateMonitor the update monitor to use - * @param lockPatternUtils lock pattern util object - * @param callback used to invoke emergency dialer - * @param emergencyButtonEnabledInScreen whether emergency button is enabled by default */ public KeyguardStatusViewManager(View view) { if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()"); @@ -364,7 +354,6 @@ class KeyguardStatusViewManager { CharSequence carrierText = null; int carrierHelpTextId = 0; - mEmergencyButtonEnabledBecauseSimLocked = false; mStatus = getStatusForIccState(simState); mSimState = simState; switch (mStatus) { @@ -394,7 +383,6 @@ class KeyguardStatusViewManager { carrierText = getContext().getText( R.string.lockscreen_permanent_disabled_sim_message_short); carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions; - mEmergencyButtonEnabledBecauseSimLocked = true; break; case SimMissingLocked: @@ -402,33 +390,25 @@ class KeyguardStatusViewManager { getContext().getText(R.string.lockscreen_missing_sim_message_short), mPlmn); carrierHelpTextId = R.string.lockscreen_missing_sim_instructions; - mEmergencyButtonEnabledBecauseSimLocked = true; break; case SimLocked: carrierText = makeCarrierStringOnEmergencyCapable( getContext().getText(R.string.lockscreen_sim_locked_message), mPlmn); - mEmergencyButtonEnabledBecauseSimLocked = true; break; case SimPukLocked: carrierText = makeCarrierStringOnEmergencyCapable( getContext().getText(R.string.lockscreen_sim_puk_locked_message), mPlmn); - if (!mLockPatternUtils.isPukUnlockScreenEnable()) { - // This means we're showing the PUK unlock screen - mEmergencyButtonEnabledBecauseSimLocked = true; - } break; } setCarrierText(carrierText); setCarrierHelpText(carrierHelpTextId); - updateEmergencyCallButtonState(mPhoneState); } - /* * Add emergencyCallMessage to carrier string only if phone supports emergency calls. */ @@ -500,17 +480,6 @@ class KeyguardStatusViewManager { } } - private void updateEmergencyCallButtonState(int phoneState) { - if (mEmergencyCallButton != null) { - boolean enabledBecauseSimLocked = - mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked() - && mEmergencyButtonEnabledBecauseSimLocked; - boolean shown = mEmergencyCallButtonEnabledInScreen || enabledBecauseSimLocked; - mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, - phoneState, shown); - } - } - private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -536,12 +505,6 @@ class KeyguardStatusViewManager { updateCarrierStateWithSimStatus(mSimState); } - @Override - public void onPhoneStateChanged(int phoneState) { - mPhoneState = phoneState; - updateEmergencyCallButtonState(phoneState); - } - @Override public void onSimStateChanged(IccCardConstants.State simState) { updateCarrierStateWithSimStatus(simState);