blob: 7aab729e783c037382150ca2c1795eb77d4fb447 [file] [log] [blame]
Sailesh Nepal810735e2014-03-18 18:15:46 -07001/*
2 * Copyright (C) 2014 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.Manifest;
20import android.content.Intent;
Sailesh Nepal810735e2014-03-18 18:15:46 -070021import android.telecomm.CallState;
Evan Charltonb35fc312014-07-19 15:02:55 -070022import android.telecomm.TelecommManager;
Sailesh Nepal53fb8c12014-04-01 23:38:39 -070023import android.telephony.DisconnectCause;
Sailesh Nepal810735e2014-03-18 18:15:46 -070024import android.telephony.TelephonyManager;
25
26/**
27 * Send a {@link TelephonyManager#ACTION_PHONE_STATE_CHANGED} broadcast when the call state
28 * changes.
29 */
30final class PhoneStateBroadcaster extends CallsManagerListenerBase {
31 @Override
32 public void onCallStateChanged(Call call, CallState oldState, CallState newState) {
33 final String phoneState;
34 switch (newState) {
35 case DIALING:
36 case ACTIVE:
37 case ON_HOLD:
38 phoneState = TelephonyManager.EXTRA_STATE_OFFHOOK;
39 break;
40 case RINGING:
41 phoneState = TelephonyManager.EXTRA_STATE_RINGING;
42 break;
43 case ABORTED:
44 case DISCONNECTED:
45 phoneState = TelephonyManager.EXTRA_STATE_IDLE;
46 break;
47 default:
48 Log.w(this, "Call is in an unknown state (%s), not broadcasting: %s",
Sailesh Nepale59bb192014-04-01 18:33:59 -070049 newState, call);
Sailesh Nepal810735e2014-03-18 18:15:46 -070050 return;
51 }
52 sendPhoneStateChangedBroadcast(call, phoneState);
53 }
54
55 private void sendPhoneStateChangedBroadcast(Call call, String phoneState) {
56 Log.v(this, "sendPhoneStateChangedBroadcast, call %s, phoneState: %s", call, phoneState);
57
58 Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
59 intent.putExtra(TelephonyManager.EXTRA_STATE, phoneState);
Sailesh Nepal810735e2014-03-18 18:15:46 -070060
61 // Populate both, since the original API was needlessly complicated.
Ihab Awad12de5492014-06-19 10:41:41 -070062 if (call.getHandle() != null) {
63 String callHandle = call.getHandle().getSchemeSpecificPart();
64 intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, callHandle);
65 // TODO: See if we can add this (the current API only sets this on NEW_OUTGOING_CALL).
66 intent.putExtra(Intent.EXTRA_PHONE_NUMBER, callHandle);
67 }
Sailesh Nepal810735e2014-03-18 18:15:46 -070068
69 // TODO: Replace these with real constants once this API has been vetted.
Sailesh Nepalc92c4362014-07-04 18:33:21 -070070 ConnectionServiceWrapper connectionService = call.getConnectionService();
71 if (connectionService != null) {
72 intent.putExtra(
Evan Charltonb35fc312014-07-19 15:02:55 -070073 TelecommManager.EXTRA_CONNECTION_SERVICE,
Sailesh Nepalc92c4362014-07-04 18:33:21 -070074 connectionService.getComponentName());
Sailesh Nepal810735e2014-03-18 18:15:46 -070075 }
Sailesh Nepal53fb8c12014-04-01 23:38:39 -070076
77 // TODO: Replace these with real constants once this API has been vetted.
78 int disconnectCause = call.getDisconnectCause();
79 String disconnectMessage = call.getDisconnectMessage();
80 if (disconnectCause != DisconnectCause.NOT_VALID) {
Evan Charltonb35fc312014-07-19 15:02:55 -070081 intent.putExtra(TelecommManager.EXTRA_CALL_DISCONNECT_CAUSE, disconnectCause);
Sailesh Nepal53fb8c12014-04-01 23:38:39 -070082 if (disconnectMessage == null) {
83 disconnectMessage = DisconnectCause.toString(disconnectCause);
84 }
85 }
86 if (disconnectMessage != null) {
Evan Charltonb35fc312014-07-19 15:02:55 -070087 intent.putExtra(TelecommManager.EXTRA_CALL_DISCONNECT_MESSAGE,
Sailesh Nepal53fb8c12014-04-01 23:38:39 -070088 call.getDisconnectMessage());
89 }
90
Sailesh Nepal810735e2014-03-18 18:15:46 -070091 TelecommApp.getInstance().sendBroadcast(intent, Manifest.permission.READ_PHONE_STATE);
92 Log.i(this, "Broadcasted state change: %s", phoneState);
93 }
94}