1109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller/*
2109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Copyright (C) 2008 The Android Open Source Project
3109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
4109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * you may not use this file except in compliance with the License.
6109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * You may obtain a copy of the License at
7109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
8109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
10109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Unless required by applicable law or agreed to in writing, software
11109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * See the License for the specific language governing permissions and
14109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * limitations under the License.
15109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller */
16109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
18109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
19dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shankaimport android.app.ActivityManager;
20b5947e01270c5042f6050908e1582961fea3c325Adrian Roosimport android.app.ActivityOptions;
21109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.content.Context;
22109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.content.Intent;
2376511c75e67c2da778066dac829c6161b5e96003Jorim Jaggiimport android.content.res.Configuration;
24109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.os.PowerManager;
257dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liuimport android.os.RemoteException;
26109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.os.SystemClock;
27450a3a1697db810364cf7c5e7ea0f4d8c3000732Jim Millerimport android.os.UserHandle;
28c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roosimport android.telecom.TelecomManager;
29109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.util.AttributeSet;
307dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liuimport android.util.Slog;
31705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.view.MotionEvent;
32109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.view.View;
33705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinekimport android.view.ViewConfiguration;
34109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport android.widget.Button;
35109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
36de0a21f4360280b40598e877b01dda8a0363a527Chris Wrenimport com.android.internal.logging.MetricsLogger;
37383db5ebcc3a4a615faf249bf4f126f42e80b82eTamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
38109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport com.android.internal.telephony.IccCardConstants.State;
39109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerimport com.android.internal.widget.LockPatternUtils;
40361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monkimport com.android.internal.util.EmergencyAffordanceManager;
41109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
42109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller/**
43109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * This class implements a smart emergency button that updates itself based
44109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * on telephony state.  When the phone is idle, it is an emergency call button.
45109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * When there's a call in progress, it presents an appropriate message and
46109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * allows the user to return to the call.
47109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller */
48109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Millerpublic class EmergencyButton extends Button {
498d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos    private static final Intent INTENT_EMERGENCY_DIAL = new Intent()
508d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos            .setAction("com.android.phone.EmergencyDialer.DIAL")
518d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos            .setPackage("com.android.phone")
520ab5742cf725654a7ce0e020dbea4c1d9bf7a2f7Adrian Roos            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
530ab5742cf725654a7ce0e020dbea4c1d9bf7a2f7Adrian Roos                    | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
54b5947e01270c5042f6050908e1582961fea3c325Adrian Roos                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
55109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
567dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu    private static final String LOG_TAG = "EmergencyButton";
57705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    private final EmergencyAffordanceManager mEmergencyAffordanceManager;
587dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu
59705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    private int mDownX;
60705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    private int mDownY;
61109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
62109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
63109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        @Override
6452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        public void onSimStateChanged(int subId, int slotId, State simState) {
6552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            updateEmergencyCallButton();
66109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        }
67109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        @Override
695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void onPhoneStateChanged(int phoneState) {
7052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller            updateEmergencyCallButton();
715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
72109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    };
73705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    private boolean mLongPressWasDragged;
7472b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee
7572b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee    public interface EmergencyButtonCallback {
7672b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee        public void onEmergencyButtonClickedWhenInCall();
7772b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee    }
7872b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee
79109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private LockPatternUtils mLockPatternUtils;
80109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private PowerManager mPowerManager;
8172b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee    private EmergencyButtonCallback mEmergencyButtonCallback;
82109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
83c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private final boolean mIsVoiceCapable;
84c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private final boolean mEnableEmergencyCallWhileSimLocked;
85c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
86109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    public EmergencyButton(Context context) {
87109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        this(context, null);
88109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    }
89109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
90109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    public EmergencyButton(Context context, AttributeSet attrs) {
91109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        super(context, attrs);
92c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        mIsVoiceCapable = context.getResources().getBoolean(
93c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                com.android.internal.R.bool.config_voice_capable);
94c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean(
95c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked);
96705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
97109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    }
98109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
99109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    @Override
1000928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onAttachedToWindow() {
1010928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onAttachedToWindow();
1020928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
1030928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
1040928e019ce1a0e343df948520f32ac638379d8eeJim Miller
1050928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
1060928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onDetachedFromWindow() {
1070928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onDetachedFromWindow();
1080928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
1090928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
1100928e019ce1a0e343df948520f32ac638379d8eeJim Miller
1110928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
112109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    protected void onFinishInflate() {
113109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        super.onFinishInflate();
114109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mLockPatternUtils = new LockPatternUtils(mContext);
115109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
116109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        setOnClickListener(new OnClickListener() {
117109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            public void onClick(View v) {
118109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                takeEmergencyCallAction();
119109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            }
120109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        });
121705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        setOnLongClickListener(new OnLongClickListener() {
122705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            @Override
123705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            public boolean onLongClick(View v) {
124705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                if (!mLongPressWasDragged
125705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                        && mEmergencyAffordanceManager.needsEmergencyAffordance()) {
126705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                    mEmergencyAffordanceManager.performEmergencyCall();
127705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                    return true;
128705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                }
129705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                return false;
130705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            }
131705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        });
13252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller        updateEmergencyCallButton();
133109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    }
134109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
13576511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi    @Override
136705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    public boolean onTouchEvent(MotionEvent event) {
137705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        final int x = (int) event.getX();
138705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        final int y = (int) event.getY();
139705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
140705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            mDownX = x;
141705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            mDownY = y;
142705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            mLongPressWasDragged = false;
143705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        } else {
144705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            final int xDiff = Math.abs(x - mDownX);
145705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            final int yDiff = Math.abs(y - mDownY);
146705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
147705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            if (Math.abs(yDiff) > touchSlop || Math.abs(xDiff) > touchSlop) {
148705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek                mLongPressWasDragged = true;
149705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek            }
150705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        }
151705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        return super.onTouchEvent(event);
152705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    }
153705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek
154705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    @Override
155705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    public boolean performLongClick() {
156705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek        return super.performLongClick();
157705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    }
158705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek
159705442fa7dcbf1bf92595fdaca6cc888810931d8Selim Cinek    @Override
16076511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi    protected void onConfigurationChanged(Configuration newConfig) {
16176511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi        super.onConfigurationChanged(newConfig);
16276511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi        updateEmergencyCallButton();
16376511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi    }
16476511c75e67c2da778066dac829c6161b5e96003Jorim Jaggi
165109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    /**
166109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller     * Shows the emergency dialer or returns the user to the existing call.
167109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller     */
168109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    public void takeEmergencyCallAction() {
169f6e9228b8a97603d3ceb8f0d61e8d87cf19bd21fChris Wren        MetricsLogger.action(mContext, MetricsEvent.ACTION_EMERGENCY_CALL);
170109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        // TODO: implement a shorter timeout once new PowerManager API is ready.
171109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        // should be the equivalent to the old userActivity(EMERGENCY_CALL_TIMEOUT)
172109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        mPowerManager.userActivity(SystemClock.uptimeMillis(), true);
1737dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu        try {
174dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka            ActivityManager.getService().stopSystemLockTaskMode();
1757dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu        } catch (RemoteException e) {
1767dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu            Slog.w(LOG_TAG, "Failed to stop app pinning");
1777dac366a7f72e3d3f0c7e26616ec0ee55efe1fcdHall Liu        }
178c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        if (isInCall()) {
179c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            resumeCall();
18072b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee            if (mEmergencyButtonCallback != null) {
18172b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee                mEmergencyButtonCallback.onEmergencyButtonClickedWhenInCall();
18272b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee            }
183109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        } else {
1848d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos            KeyguardUpdateMonitor.getInstance(mContext).reportEmergencyCallAction(
1858d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos                    true /* bypassHandler */);
1868d75c14d0c8881c7b97f2be86870d323d4454ec8Adrian Roos            getContext().startActivityAsUser(INTENT_EMERGENCY_DIAL,
187b5947e01270c5042f6050908e1582961fea3c325Adrian Roos                    ActivityOptions.makeCustomAnimation(getContext(), 0, 0).toBundle(),
188d6aa6cb0cc8c70a30434048e25e14643b1645755Adrian Roos                    new UserHandle(KeyguardUpdateMonitor.getCurrentUser()));
189109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        }
190109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    }
191109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
19252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller    private void updateEmergencyCallButton() {
193c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        boolean visible = false;
194c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        if (mIsVoiceCapable) {
195c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            // Emergency calling requires voice capability.
196c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            if (isInCall()) {
197c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                visible = true; // always show "return to call" if phone is off-hook
198c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            } else {
199c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                final boolean simLocked = KeyguardUpdateMonitor.getInstance(mContext)
200c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                        .isSimPinVoiceSecure();
201c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                if (simLocked) {
202c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                    // Some countries can't handle emergency calls while SIM is locked.
203c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                    visible = mEnableEmergencyCallWhileSimLocked;
204c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                } else {
205c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                    // Only show if there is a secure screen (pin/pattern/SIM pin/SIM puk);
206d6aa6cb0cc8c70a30434048e25e14643b1645755Adrian Roos                    visible = mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser());
207c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                }
208c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            }
209c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        }
210c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        if (visible) {
211c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            setVisibility(View.VISIBLE);
212c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
213c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            int textId;
214c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            if (isInCall()) {
215c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                textId = com.android.internal.R.string.lockscreen_return_to_call;
2163efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            } else {
217c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos                textId = com.android.internal.R.string.lockscreen_emergency_call;
2183efe106264262924a9218268d3c7d19d272fb7a2Jim Miller            }
219c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            setText(textId);
220c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        } else {
221c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos            setVisibility(View.GONE);
222109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        }
223109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    }
224109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
22572b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee    public void setCallback(EmergencyButtonCallback callback) {
22672b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee        mEmergencyButtonCallback = callback;
22772b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee    }
228c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
229c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    /**
230c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     * Resumes a call in progress.
231c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     */
232c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private void resumeCall() {
233c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        getTelecommManager().showInCallScreen(false);
234c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    }
235c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
236c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    /**
237c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     * @return {@code true} if there is a call currently in progress.
238c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos     */
239c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private boolean isInCall() {
240c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        return getTelecommManager().isInCall();
241c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    }
242c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos
243c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    private TelecomManager getTelecommManager() {
244c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos        return (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
245c2e01683b34029729262e2fb346ceea4bfe4b4b6Adrian Roos    }
246109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller}
247