Skip to content

Commit 47df44a

Browse files
author
Jim Miller
committed
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
1 parent d2d4a64 commit 47df44a

File tree

5 files changed

+49
-81
lines changed

5 files changed

+49
-81
lines changed

policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,6 @@ public class KeyguardHostView extends KeyguardViewBase {
5757
static final int APPWIDGET_HOST_ID = 0x4B455947;
5858
private static final String KEYGUARD_WIDGET_PREFS = "keyguard_widget_prefs";
5959

60-
// time after launching EmergencyDialer before the screen goes blank.
61-
private static final int EMERGENCY_CALL_TIMEOUT = 10000;
62-
63-
// intent action for launching emergency dialer activity.
64-
static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
65-
6660
private static final String TAG = "KeyguardViewHost";
6761

6862
private static final int SECURITY_SELECTOR_ID = R.id.keyguard_selector_view;
@@ -76,7 +70,6 @@ public class KeyguardHostView extends KeyguardViewBase {
7670
private AppWidgetHost mAppWidgetHost;
7771
private KeyguardWidgetPager mAppWidgetContainer;
7872
private ViewFlipper mViewFlipper;
79-
private Button mEmergencyDialerButton;
8073
private boolean mEnableMenuKey;
8174
private boolean mIsVerifyUnlockOnly;
8275
private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView
@@ -142,14 +135,6 @@ protected void onFinishInflate() {
142135
Log.v("*********", "Can't find view id " + mViewIds[i]);
143136
}
144137
}
145-
146-
// Enable emergency dialer button
147-
mEmergencyDialerButton = (Button) findViewById(R.id.emergency_call_button);
148-
mEmergencyDialerButton.setOnClickListener(new OnClickListener() {
149-
public void onClick(View v) {
150-
takeEmergencyCallAction();
151-
}
152-
});
153138
}
154139

155140
void setLockPatternUtils(LockPatternUtils utils) {
@@ -225,22 +210,6 @@ public void setOnDismissRunnable(Runnable runnable) {
225210

226211
};
227212

228-
/**
229-
* Shows the emergency dialer or returns the user to the existing call.
230-
*/
231-
public void takeEmergencyCallAction() {
232-
mCallback.userActivity(EMERGENCY_CALL_TIMEOUT);
233-
if (TelephonyManager.getDefault().getCallState()
234-
== TelephonyManager.CALL_STATE_OFFHOOK) {
235-
mLockPatternUtils.resumeCall();
236-
} else {
237-
Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
238-
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
239-
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
240-
getContext().startActivity(intent);
241-
}
242-
}
243-
244213
private void showDialog(String title, String message) {
245214
final AlertDialog dialog = new AlertDialog.Builder(mContext)
246215
.setTitle(title)
@@ -526,12 +495,14 @@ private void showSecurityScreen(int securityViewId) {
526495
public void onScreenTurnedOn() {
527496
if (DEBUG) Log.d(TAG, "screen on");
528497
showSecurityScreen(mCurrentSecurityId);
498+
getSecurityView(mCurrentSecurityId).onResume();
529499
}
530500

531501
@Override
532502
public void onScreenTurnedOff() {
533503
if (DEBUG) Log.d(TAG, "screen off");
534504
showSecurityScreen(SECURITY_SELECTOR_ID);
505+
getSecurityView(mCurrentSecurityId).onPause();
535506
}
536507

537508
@Override

policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityModel.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ SecurityMode getSecurityMode() {
6969
SecurityMode mode = SecurityMode.None;
7070
if (simState == IccCardConstants.State.PIN_REQUIRED) {
7171
mode = SecurityMode.SimPin;
72-
} else if (simState == IccCardConstants.State.PUK_REQUIRED) {
72+
} else if (simState == IccCardConstants.State.PUK_REQUIRED
73+
&& mLockPatternUtils.isPukUnlockScreenEnable()) {
7374
mode = SecurityMode.SimPuk;
7475
} else {
7576
final int security = mLockPatternUtils.getKeyguardStoredPasswordQuality();

policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.os.RemoteException;
2626
import android.os.UserHandle;
2727
import android.provider.MediaStore;
28+
import android.telephony.TelephonyManager;
2829
import android.util.AttributeSet;
2930
import android.util.Log;
3031
import android.util.Slog;
@@ -33,6 +34,7 @@
3334
import android.widget.LinearLayout;
3435

3536
import com.android.internal.telephony.IccCardConstants;
37+
import com.android.internal.telephony.IccCardConstants.State;
3638
import com.android.internal.widget.LockPatternUtils;
3739
import com.android.internal.widget.multiwaveview.GlowPadView;
3840
import com.android.internal.widget.multiwaveview.GlowPadView.OnTriggerListener;
@@ -43,6 +45,9 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
4345
private static final String TAG = "SecuritySelectorView";
4446
private static final String ASSIST_ICON_METADATA_NAME =
4547
"com.android.systemui.action_assist_icon";
48+
private static final int EMERGENCY_CALL_TIMEOUT = 10000; // screen timeout after starting e.d.
49+
static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
50+
4651
private KeyguardSecurityCallback mCallback;
4752
private GlowPadView mGlowPadView;
4853
private Button mEmergencyCallButton;
@@ -98,29 +103,35 @@ public void onFinishFinalAnimation() {
98103

99104
};
100105

101-
KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
106+
private void updateEmergencyCallButton(State simState, int phoneState) {
107+
if (mEmergencyCallButton != null) {
108+
boolean en = mLockPatternUtils.isEmergencyCallCapable()
109+
|| (phoneState == TelephonyManager.CALL_STATE_OFFHOOK); // voice call in progress
110+
if (en && KeyguardUpdateMonitor.isSimLocked(simState)) {
111+
// Some countries can't handle emergency calls while SIM is locked.
112+
en = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
113+
}
114+
mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, phoneState, en);
115+
}
116+
}
102117

103-
private boolean mEmergencyDialerDisableBecauseSimLocked;
118+
KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
104119

105120
@Override
106121
public void onDevicePolicyManagerStateChanged() {
107122
updateTargets();
108123
}
109124

110125
@Override
111-
public void onSimStateChanged(IccCardConstants.State simState) {
112-
// Some carriers aren't capable of handling emergency calls while the SIM is locked
113-
mEmergencyDialerDisableBecauseSimLocked = KeyguardUpdateMonitor.isSimLocked(simState)
114-
&& !mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
126+
public void onSimStateChanged(State simState) {
127+
int phoneState = KeyguardUpdateMonitor.getInstance(mContext).getPhoneState();
128+
updateEmergencyCallButton(simState, phoneState);
115129
updateTargets();
116130
}
117131

118132
void onPhoneStateChanged(int phoneState) {
119-
if (mEmergencyCallButton != null) {
120-
mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked();
121-
mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
122-
phoneState, !mEmergencyDialerDisableBecauseSimLocked);
123-
}
133+
State simState = KeyguardUpdateMonitor.getInstance(mContext).getSimState();
134+
updateEmergencyCallButton(simState, phoneState);
124135
};
125136
};
126137

@@ -149,9 +160,30 @@ protected void onFinishInflate() {
149160
mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view);
150161
mGlowPadView.setOnTriggerListener(mOnTriggerListener);
151162
mEmergencyCallButton = (Button) findViewById(R.id.emergency_call_button);
163+
mEmergencyCallButton.setOnClickListener(new OnClickListener() {
164+
public void onClick(View v) {
165+
takeEmergencyCallAction();
166+
}
167+
});
152168
updateTargets();
153169
}
154170

171+
/**
172+
* Shows the emergency dialer or returns the user to the existing call.
173+
*/
174+
public void takeEmergencyCallAction() {
175+
mCallback.userActivity(EMERGENCY_CALL_TIMEOUT);
176+
if (TelephonyManager.getDefault().getCallState()
177+
== TelephonyManager.CALL_STATE_OFFHOOK) {
178+
mLockPatternUtils.resumeCall();
179+
} else {
180+
Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
181+
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
182+
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
183+
getContext().startActivity(intent);
184+
}
185+
}
186+
155187
public boolean isTargetPresent(int resId) {
156188
return mGlowPadView.getTargetPosition(resId) != -1;
157189
}

policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusView.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import android.widget.GridLayout;
2222

2323
public class KeyguardStatusView extends GridLayout {
24+
@SuppressWarnings("unused")
2425
private KeyguardStatusViewManager mStatusViewManager;
2526

2627
public KeyguardStatusView(Context context) {

policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@
3232
import android.text.format.DateFormat;
3333
import android.util.Log;
3434
import android.view.View;
35-
import android.widget.Button;
3635
import android.widget.TextView;
3736

3837
/***
39-
* Manages a number of views inside of LockScreen layouts. See below for a list of widgets
38+
* Manages a number of views inside of the given layout. See below for a list of widgets.
4039
*/
4140
class KeyguardStatusViewManager {
4241
private static final boolean DEBUG = false;
@@ -92,21 +91,12 @@ class KeyguardStatusViewManager {
9291
private boolean mShowingStatus;
9392
private CharSequence mPlmn;
9493
private CharSequence mSpn;
95-
protected int mPhoneState;
9694
private DigitalClock mDigitalClock;
9795
protected boolean mBatteryCharged;
9896
protected boolean mBatteryIsLow;
99-
private boolean mEmergencyButtonEnabledBecauseSimLocked;
100-
private Button mEmergencyCallButton;
101-
private boolean mEmergencyCallButtonEnabledInScreen;
10297

10398
/**
104-
*
10599
* @param view the containing view of all widgets
106-
* @param updateMonitor the update monitor to use
107-
* @param lockPatternUtils lock pattern util object
108-
* @param callback used to invoke emergency dialer
109-
* @param emergencyButtonEnabledInScreen whether emergency button is enabled by default
110100
*/
111101
public KeyguardStatusViewManager(View view) {
112102
if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()");
@@ -364,7 +354,6 @@ private void updateCarrierStateWithSimStatus(IccCardConstants.State simState) {
364354

365355
CharSequence carrierText = null;
366356
int carrierHelpTextId = 0;
367-
mEmergencyButtonEnabledBecauseSimLocked = false;
368357
mStatus = getStatusForIccState(simState);
369358
mSimState = simState;
370359
switch (mStatus) {
@@ -394,41 +383,32 @@ private void updateCarrierStateWithSimStatus(IccCardConstants.State simState) {
394383
carrierText = getContext().getText(
395384
R.string.lockscreen_permanent_disabled_sim_message_short);
396385
carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
397-
mEmergencyButtonEnabledBecauseSimLocked = true;
398386
break;
399387

400388
case SimMissingLocked:
401389
carrierText = makeCarrierStringOnEmergencyCapable(
402390
getContext().getText(R.string.lockscreen_missing_sim_message_short),
403391
mPlmn);
404392
carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
405-
mEmergencyButtonEnabledBecauseSimLocked = true;
406393
break;
407394

408395
case SimLocked:
409396
carrierText = makeCarrierStringOnEmergencyCapable(
410397
getContext().getText(R.string.lockscreen_sim_locked_message),
411398
mPlmn);
412-
mEmergencyButtonEnabledBecauseSimLocked = true;
413399
break;
414400

415401
case SimPukLocked:
416402
carrierText = makeCarrierStringOnEmergencyCapable(
417403
getContext().getText(R.string.lockscreen_sim_puk_locked_message),
418404
mPlmn);
419-
if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
420-
// This means we're showing the PUK unlock screen
421-
mEmergencyButtonEnabledBecauseSimLocked = true;
422-
}
423405
break;
424406
}
425407

426408
setCarrierText(carrierText);
427409
setCarrierHelpText(carrierHelpTextId);
428-
updateEmergencyCallButtonState(mPhoneState);
429410
}
430411

431-
432412
/*
433413
* Add emergencyCallMessage to carrier string only if phone supports emergency calls.
434414
*/
@@ -500,17 +480,6 @@ public boolean shouldShowStatusLines() {
500480
}
501481
}
502482

503-
private void updateEmergencyCallButtonState(int phoneState) {
504-
if (mEmergencyCallButton != null) {
505-
boolean enabledBecauseSimLocked =
506-
mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked()
507-
&& mEmergencyButtonEnabledBecauseSimLocked;
508-
boolean shown = mEmergencyCallButtonEnabledInScreen || enabledBecauseSimLocked;
509-
mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
510-
phoneState, shown);
511-
}
512-
}
513-
514483
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
515484

516485
@Override
@@ -536,12 +505,6 @@ public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
536505
updateCarrierStateWithSimStatus(mSimState);
537506
}
538507

539-
@Override
540-
public void onPhoneStateChanged(int phoneState) {
541-
mPhoneState = phoneState;
542-
updateEmergencyCallButtonState(phoneState);
543-
}
544-
545508
@Override
546509
public void onSimStateChanged(IccCardConstants.State simState) {
547510
updateCarrierStateWithSimStatus(simState);

0 commit comments

Comments
 (0)