blob: 0e231b0369be368c78edd784aa3e71211c49292f [file] [log] [blame]
Santos Cordon10e68322013-12-12 16:06:56 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.telecomm;
18
19import android.app.Activity;
Yorke Leecce5deb2014-06-18 11:27:42 -070020import android.content.ComponentName;
21import android.content.Context;
Santos Cordon10e68322013-12-12 16:06:56 -080022import android.content.Intent;
23import android.content.res.Configuration;
Nancy Chen0d3076c2014-07-30 14:45:44 -070024import android.net.Uri;
Santos Cordon10e68322013-12-12 16:06:56 -080025import android.os.Bundle;
Evan Charlton89176372014-07-19 18:23:09 -070026import android.telecomm.PhoneAccountHandle;
Evan Charltonb35fc312014-07-19 15:02:55 -070027import android.telecomm.TelecommManager;
Yorke Leecce5deb2014-06-18 11:27:42 -070028import android.telecomm.TelecommManager;
Nancy Chen0d3076c2014-07-30 14:45:44 -070029import android.telephony.PhoneNumberUtils;
Yorke Leecce5deb2014-06-18 11:27:42 -070030import android.text.TextUtils;
Santos Cordon10e68322013-12-12 16:06:56 -080031
32/**
33 * Activity that handles system CALL actions and forwards them to {@link CallsManager}.
34 * Handles all three CALL action types: CALL, CALL_PRIVILEGED, and CALL_EMERGENCY.
Yorke Leecce5deb2014-06-18 11:27:42 -070035 *
36 * Pre-L, the only way apps were were allowed to make outgoing emergency calls was the
37 * ACTION_CALL_PRIVILEGED action (which requires the system only CALL_PRIVILEGED permission).
38 *
39 * In L, any app that has the CALL_PRIVILEGED permission can continue to make outgoing emergency
40 * calls via ACTION_CALL_PRIVILEGED.
41 *
42 * In addition, the default dialer (identified via {@link TelecommManager#getDefaultPhoneApp()}
43 * will also be granted the ability to make emergency outgoing calls using the CALL action. In
44 * order to do this, it must call startActivityForResult on the CALL intent to allow its package
45 * name to be passed to {@link CallActivity}. Calling startActivity will continue to work on all
46 * non-emergency numbers just like it did pre-L.
Santos Cordon10e68322013-12-12 16:06:56 -080047 */
48public class CallActivity extends Activity {
Ben Giladdd8c6082013-12-30 14:44:08 -080049 private CallsManager mCallsManager = CallsManager.getInstance();
50
Santos Cordon10e68322013-12-12 16:06:56 -080051 /**
52 * {@inheritDoc}
53 *
54 * This method is the single point of entry for the CALL intent, which is used by built-in apps
55 * like Contacts & Dialer, as well as 3rd party apps to initiate outgoing calls.
56 */
57 @Override
58 protected void onCreate(Bundle bundle) {
59 super.onCreate(bundle);
60
Santos Cordondf399862014-08-06 04:39:15 -070061 // TODO: This activity will be displayed until the next screen which could be
Santos Cordon10e68322013-12-12 16:06:56 -080062 // the in-call UI and error dialog or potentially a call-type selection dialog.
63 // Traditionally, this has been a black screen with a spinner. We need to reevaluate if this
64 // is still desired and add back if necessary. Currently, the activity is set to NoDisplay
65 // theme which means it shows no UI.
66
67 Intent intent = getIntent();
68 Configuration configuration = getResources().getConfiguration();
69
Sailesh Nepalf1c191d2014-03-07 18:17:39 -080070 Log.d(this, "onCreate: this = %s, bundle = %s", this, bundle);
71 Log.d(this, " - intent = %s", intent);
72 Log.d(this, " - configuration = %s", configuration);
Santos Cordon10e68322013-12-12 16:06:56 -080073
Santos Cordondf399862014-08-06 04:39:15 -070074 // TODO: Figure out if there is something to restore from bundle.
Santos Cordon10e68322013-12-12 16:06:56 -080075 // See OutgoingCallBroadcaster in services/Telephony for more.
76
Santos Cordon523f6052014-02-20 16:39:34 -080077 processIntent(intent);
Santos Cordon10e68322013-12-12 16:06:56 -080078
Santos Cordon523f6052014-02-20 16:39:34 -080079 // This activity does not have associated UI, so close.
Santos Cordon10e68322013-12-12 16:06:56 -080080 finish();
81
Sailesh Nepalf1c191d2014-03-07 18:17:39 -080082 Log.d(this, "onCreate: end");
Santos Cordon10e68322013-12-12 16:06:56 -080083 }
84
85 /**
Santos Cordon523f6052014-02-20 16:39:34 -080086 * Processes intents sent to the activity.
87 *
88 * @param intent The intent.
89 */
90 private void processIntent(Intent intent) {
91 String action = intent.getAction();
92
Santos Cordona0e5f1a2014-03-31 21:43:00 -070093 // TODO: Check for non-voice capable devices before reading any intents.
94
Santos Cordon523f6052014-02-20 16:39:34 -080095 if (Intent.ACTION_CALL.equals(action) ||
96 Intent.ACTION_CALL_PRIVILEGED.equals(action) ||
97 Intent.ACTION_CALL_EMERGENCY.equals(action)) {
98 processOutgoingCallIntent(intent);
Evan Charltonb35fc312014-07-19 15:02:55 -070099 } else if (TelecommManager.ACTION_INCOMING_CALL.equals(action)) {
Santos Cordon523f6052014-02-20 16:39:34 -0800100 processIncomingCallIntent(intent);
101 }
102 }
103
104 /**
Santos Cordon10e68322013-12-12 16:06:56 -0800105 * Processes CALL, CALL_PRIVILEGED, and CALL_EMERGENCY intents.
106 *
107 * @param intent Call intent containing data about the handle to call.
108 */
Ben Giladdd8c6082013-12-30 14:44:08 -0800109 private void processOutgoingCallIntent(Intent intent) {
Nancy Chen0d3076c2014-07-30 14:45:44 -0700110 String uriString = intent.getData().getSchemeSpecificPart();
111 Uri handle = Uri.fromParts(
112 PhoneNumberUtils.isUriNumber(uriString) ? "sip" : "tel", uriString, null);
113 PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(
114 TelecommManager.EXTRA_PHONE_ACCOUNT_HANDLE);
115
116 // Send to CallsManager to ensure the InCallUI gets kicked off before the broadcast returns
117 Call call = mCallsManager.startOutgoingCall(handle, phoneAccountHandle);
118
Yorke Leecce5deb2014-06-18 11:27:42 -0700119 NewOutgoingCallIntentBroadcaster broadcaster = new NewOutgoingCallIntentBroadcaster(
Nancy Chen0d3076c2014-07-30 14:45:44 -0700120 mCallsManager, call, intent, isDefaultDialer());
Yorke Leecce5deb2014-06-18 11:27:42 -0700121 final boolean success = broadcaster.processIntent();
122 setResult(success ? RESULT_OK : RESULT_CANCELED);
Santos Cordon10e68322013-12-12 16:06:56 -0800123 }
Santos Cordon523f6052014-02-20 16:39:34 -0800124
125 /**
Evan Charlton89176372014-07-19 18:23:09 -0700126 * Processes INCOMING_CALL intents. Grabs the connection service information from the intent
Sailesh Nepalc92c4362014-07-04 18:33:21 -0700127 * extra and forwards that to the CallsManager to start the incoming call flow.
Santos Cordon523f6052014-02-20 16:39:34 -0800128 *
129 * @param intent The incoming call intent.
130 */
131 private void processIncomingCallIntent(Intent intent) {
Evan Charlton89176372014-07-19 18:23:09 -0700132 PhoneAccountHandle phoneAccountHandle = intent.getParcelableExtra(
133 TelecommManager.EXTRA_PHONE_ACCOUNT_HANDLE);
134 if (phoneAccountHandle == null) {
Sailesh Nepal905dfba2014-07-14 08:20:41 -0700135 Log.w(this, "Rejecting incoming call due to null phone account");
136 return;
137 }
Evan Charlton89176372014-07-19 18:23:09 -0700138 if (phoneAccountHandle.getComponentName() == null) {
Sailesh Nepal905dfba2014-07-14 08:20:41 -0700139 Log.w(this, "Rejecting incoming call due to null component name");
Santos Cordon523f6052014-02-20 16:39:34 -0800140 return;
141 }
142
Sailesh Nepal664837f2014-07-14 16:31:51 -0700143 Bundle clientExtras = null;
Evan Charltonb35fc312014-07-19 15:02:55 -0700144 if (intent.hasExtra(TelecommManager.EXTRA_INCOMING_CALL_EXTRAS)) {
145 clientExtras = intent.getBundleExtra(TelecommManager.EXTRA_INCOMING_CALL_EXTRAS);
Evan Charltona05805b2014-03-05 08:21:46 -0800146 }
Sailesh Nepal664837f2014-07-14 16:31:51 -0700147 if (clientExtras == null) {
148 clientExtras = Bundle.EMPTY;
149 }
Evan Charltona05805b2014-03-05 08:21:46 -0800150
Sailesh Nepal905dfba2014-07-14 08:20:41 -0700151 Log.d(this, "Processing incoming call from connection service [%s]",
Evan Charlton89176372014-07-19 18:23:09 -0700152 phoneAccountHandle.getComponentName());
153 mCallsManager.processIncomingCallIntent(phoneAccountHandle, clientExtras);
Santos Cordon523f6052014-02-20 16:39:34 -0800154 }
Yorke Leecce5deb2014-06-18 11:27:42 -0700155
156 private boolean isDefaultDialer() {
157 final String packageName = getCallingPackage();
158 if (TextUtils.isEmpty(packageName)) {
159 return false;
160 }
161
162 final TelecommManager telecommManager =
163 (TelecommManager) getSystemService(Context.TELECOMM_SERVICE);
164 final ComponentName defaultPhoneApp = telecommManager.getDefaultPhoneApp();
165 return (defaultPhoneApp != null
166 && TextUtils.equals(defaultPhoneApp.getPackageName(), packageName));
167 }
Santos Cordon10e68322013-12-12 16:06:56 -0800168}