blob: 8ed675c61edf690567544274640d9e48a443afe3 [file] [log] [blame]
/*
* Copyright (C) 2008 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.keyguard;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Button;
import com.android.internal.util.EmergencyAffordanceManager;
/**
* This class implements a smart emergency button that updates itself based
* on telephony state. When the phone is idle, it is an emergency call button.
* When there's a call in progress, it presents an appropriate message and
* allows the user to return to the call.
*/
public class EmergencyButton extends Button {
private final EmergencyAffordanceManager mEmergencyAffordanceManager;
private int mDownX;
private int mDownY;
private boolean mLongPressWasDragged;
private final boolean mEnableEmergencyCallWhileSimLocked;
public EmergencyButton(Context context) {
this(context, null);
}
public EmergencyButton(Context context, AttributeSet attrs) {
super(context, attrs);
mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked);
mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (mEmergencyAffordanceManager.needsEmergencyAffordance()) {
setOnLongClickListener(v -> {
boolean isEmergencyCallButton = getVisibility() == View.VISIBLE
&& TextUtils.equals(getText(), getEmergencyButtonLabel());
if (isEmergencyCallButton
&& !mLongPressWasDragged
&& mEmergencyAffordanceManager.needsEmergencyAffordance()) {
mEmergencyAffordanceManager.performEmergencyCall();
return true;
}
return false;
});
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
mDownX = x;
mDownY = y;
mLongPressWasDragged = false;
} else {
final int xDiff = Math.abs(x - mDownX);
final int yDiff = Math.abs(y - mDownY);
int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
if (Math.abs(yDiff) > touchSlop || Math.abs(xDiff) > touchSlop) {
mLongPressWasDragged = true;
}
}
return super.onTouchEvent(event);
}
@Override
public boolean performLongClick() {
return super.performLongClick();
}
void updateEmergencyCallButton(boolean isInCall, boolean hasTelephonyRadio, boolean simLocked,
boolean isSecure) {
boolean visible = false;
if (hasTelephonyRadio) {
// Emergency calling requires a telephony radio.
if (isInCall) {
visible = true; // always show "return to call" if phone is off-hook
} else {
if (simLocked) {
// Some countries can't handle emergency calls while SIM is locked.
visible = mEnableEmergencyCallWhileSimLocked;
} else {
// Only show if there is a secure screen (pin/pattern/SIM pin/SIM puk);
visible = isSecure;
}
}
}
if (visible) {
setVisibility(View.VISIBLE);
int textId;
if (isInCall) {
textId = com.android.internal.R.string.lockscreen_return_to_call;
} else {
textId = com.android.internal.R.string.lockscreen_emergency_call;
}
setText(textId);
} else {
setVisibility(View.GONE);
}
}
private String getEmergencyButtonLabel() {
return mContext.getString(com.android.internal.R.string.lockscreen_emergency_call);
}
}