1a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon/*
2a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * Copyright (C) 2014 The Android Open Source Project
3a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon *
4a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
5a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * you may not use this file except in compliance with the License.
6a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * You may obtain a copy of the License at
7a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon *
8a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
9a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon *
10a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * Unless required by applicable law or agreed to in writing, software
11a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
12a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * See the License for the specific language governing permissions and
14a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon * limitations under the License.
15a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon */
16a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
177cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnpackage com.android.server.telecom;
18a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
19a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordonimport android.content.Context;
20a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordonimport android.content.Intent;
21a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordonimport android.os.UserHandle;
22953e1af643b66df6f931d76c23bcc54147668cd4Brad Ebingerimport android.telecom.Log;
23a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
24bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunnimport com.android.server.telecom.ui.ConfirmCallDialogActivity;
25bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn
2678a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awadpublic final class TelecomBroadcastIntentProcessor {
27a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    /** The action used to send SMS response for the missed call notification. */
288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public static final String ACTION_SEND_SMS_FROM_NOTIFICATION =
297cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunn            "com.android.server.telecom.ACTION_SEND_SMS_FROM_NOTIFICATION";
30a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
31a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    /** The action used to call a handle back for the missed call notification. */
328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public static final String ACTION_CALL_BACK_FROM_NOTIFICATION =
337cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunn            "com.android.server.telecom.ACTION_CALL_BACK_FROM_NOTIFICATION";
34a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
35a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    /** The action used to clear missed calls. */
368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public static final String ACTION_CLEAR_MISSED_CALLS =
377cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunn            "com.android.server.telecom.ACTION_CLEAR_MISSED_CALLS";
38a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
392b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn    /**
402b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     * The action used to answer the current incoming call displayed by
412b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     * {@link com.android.server.telecom.ui.IncomingCallNotifier}.
422b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     */
432b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn    public static final String ACTION_ANSWER_FROM_NOTIFICATION =
442b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            "com.android.server.telecom.ACTION_ANSWER_FROM_NOTIFICATION";
452b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
462b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn    /**
472b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     * The action used to reject the current incoming call displayed by
482b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     * {@link com.android.server.telecom.ui.IncomingCallNotifier}.
492b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn     */
502b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn    public static final String ACTION_REJECT_FROM_NOTIFICATION =
512b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            "com.android.server.telecom.ACTION_REJECT_FROM_NOTIFICATION";
522b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
53bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn    /**
54bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     * The action used to proceed with a call being confirmed via
55bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     * {@link com.android.server.telecom.ui.ConfirmCallDialogActivity}.
56bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     */
57bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn    public static final String ACTION_PROCEED_WITH_CALL =
58bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            "com.android.server.telecom.PROCEED_WITH_CALL";
59bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn
60bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn    /**
61bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     * The action used to cancel a call being confirmed via
62bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     * {@link com.android.server.telecom.ui.ConfirmCallDialogActivity}.
63bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn     */
64bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn    public static final String ACTION_CANCEL_CALL =
65bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            "com.android.server.telecom.CANCEL_CALL";
66bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn
67a993094840386163e9c2aa65a05e14b49d122318Tony Mak    public static final String EXTRA_USERHANDLE = "userhandle";
68a993094840386163e9c2aa65a05e14b49d122318Tony Mak
6978a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad    private final Context mContext;
708de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final CallsManager mCallsManager;
7178a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad
728de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public TelecomBroadcastIntentProcessor(Context context, CallsManager callsManager) {
7378a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad        mContext = context;
748de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mCallsManager = callsManager;
7578a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad    }
7678a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad
7778a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad    public void processIntent(Intent intent) {
78a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon        String action = intent.getAction();
79a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
802b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn        if (ACTION_SEND_SMS_FROM_NOTIFICATION.equals(action) ||
812b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                ACTION_CALL_BACK_FROM_NOTIFICATION.equals(action) ||
822b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                ACTION_CLEAR_MISSED_CALLS.equals(action)) {
832b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            Log.v(this, "Action received: %s.", action);
842b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            UserHandle userHandle = intent.getParcelableExtra(EXTRA_USERHANDLE);
852b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            if (userHandle == null) {
862b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Log.d(this, "user handle can't be null, not processing the broadcast");
872b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                return;
882b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            }
892b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
902b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            MissedCallNotifier missedCallNotifier = mCallsManager.getMissedCallNotifier();
912b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
922b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            // Send an SMS from the missed call notification.
932b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            if (ACTION_SEND_SMS_FROM_NOTIFICATION.equals(action)) {
942b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Close the notification shade and the notification itself.
952b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                closeSystemDialogs(mContext);
962b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                missedCallNotifier.clearMissedCalls(userHandle);
972b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
982b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Intent callIntent = new Intent(Intent.ACTION_SENDTO, intent.getData());
992b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1002b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                mContext.startActivityAsUser(callIntent, userHandle);
1012b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
1022b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Call back recent caller from the missed call notification.
1032b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            } else if (ACTION_CALL_BACK_FROM_NOTIFICATION.equals(action)) {
1042b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Close the notification shade and the notification itself.
1052b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                closeSystemDialogs(mContext);
1062b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                missedCallNotifier.clearMissedCalls(userHandle);
1072b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
1082b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Intent callIntent = new Intent(Intent.ACTION_CALL, intent.getData());
1092b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                callIntent.setFlags(
1102b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                        Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
1112b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                mContext.startActivityAsUser(callIntent, userHandle);
1122b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn
1132b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Clear the missed call notification and call log entries.
1142b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            } else if (ACTION_CLEAR_MISSED_CALLS.equals(action)) {
1152b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                missedCallNotifier.clearMissedCalls(userHandle);
1162b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            }
1172b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn        } else if (ACTION_ANSWER_FROM_NOTIFICATION.equals(action)) {
1182b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            Log.startSession("TBIP.aAFM");
1192b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            try {
1202b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Answer the current ringing call.
1212b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Call incomingCall = mCallsManager.getIncomingCallNotifier().getIncomingCall();
1222b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                if (incomingCall != null) {
1232b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                    mCallsManager.answerCall(incomingCall, incomingCall.getVideoState());
1242b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                }
1252b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            } finally {
1262b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Log.endSession();
1272b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            }
1282b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn        } else if (ACTION_REJECT_FROM_NOTIFICATION.equals(action)) {
1292b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            Log.startSession("TBIP.aRFM");
1302b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            try {
131bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn
1322b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                // Reject the current ringing call.
1332b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Call incomingCall = mCallsManager.getIncomingCallNotifier().getIncomingCall();
1342b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                if (incomingCall != null) {
1352b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                    mCallsManager.rejectCall(incomingCall, false /* isRejectWithMessage */, null);
1362b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                }
1372b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            } finally {
1382b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn                Log.endSession();
1392b17f23d3257dec66d965ac7b4a59aa2226b43a5Tyler Gunn            }
140bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn        } else if (ACTION_PROCEED_WITH_CALL.equals(action)) {
141bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            Log.startSession("TBIP.aPWC");
142bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            try {
143bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                String callId = intent.getStringExtra(
144bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                        ConfirmCallDialogActivity.EXTRA_OUTGOING_CALL_ID);
145bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                mCallsManager.confirmPendingCall(callId);
146bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            } finally {
147bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                Log.endSession();
148bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            }
149bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn        } else if (ACTION_CANCEL_CALL.equals(action)) {
150bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            Log.startSession("TBIP.aCC");
151bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            try {
152bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                String callId = intent.getStringExtra(
153bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                        ConfirmCallDialogActivity.EXTRA_OUTGOING_CALL_ID);
154bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                mCallsManager.cancelPendingCall(callId);
155bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            } finally {
156bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn                Log.endSession();
157bbd78a76f8a3d103018474ecd52bead71cd5fc5aTyler Gunn            }
158a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon        }
159a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    }
160a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon
161a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    /**
162a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon     * Closes open system dialogs and the notification shade.
163a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon     */
164a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    private void closeSystemDialogs(Context context) {
165a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon        Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
166a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon        context.sendBroadcastAsUser(intent, UserHandle.ALL);
167a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon    }
168a0e5f1aa917decf6921e372a3fd5a43da51adecbSantos Cordon}
169