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