1ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal/* 2ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * Copyright (C) 2013 The Android Open Source Project 3ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * 4ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * Licensed under the Apache License, Version 2.0 (the "License"); 5ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * you may not use this file except in compliance with the License. 6ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * You may obtain a copy of the License at 7ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * 8ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * http://www.apache.org/licenses/LICENSE-2.0 9ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * 10ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * Unless required by applicable law or agreed to in writing, software 11ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * distributed under the License is distributed on an "AS IS" BASIS, 12ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * See the License for the specific language governing permissions and 14ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * limitations under the License. 15ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal */ 16ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom; 18ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 192ac401093e5ebb975f14e5108d457c148370f7deTyler Gunnimport android.annotation.SdkConstant; 20a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordonimport android.annotation.SystemApi; 212f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordonimport android.app.Service; 222f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordonimport android.content.Intent; 23b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunnimport android.hardware.camera2.CameraManager; 2432f24731604fd81289a39619bbc925b65184b505Yorke Leeimport android.net.Uri; 25876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunnimport android.os.Bundle; 26ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepalimport android.os.Handler; 27ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepalimport android.os.IBinder; 28ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepalimport android.os.Looper; 29ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepalimport android.os.Message; 3050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport android.view.Surface; 31ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 322f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awadimport com.android.internal.os.SomeArgs; 33ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IInCallAdapter; 34ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IInCallService; 35ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 3650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Leeimport java.lang.String; 37a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordonimport java.util.Collections; 38a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordonimport java.util.List; 3950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 40ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal/** 41ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * This service is implemented by any app that wishes to provide the user-interface for managing 42ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn * phone calls. Telecom binds to this service while there exists a live (active or incoming) call, 43f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * and uses it to notify the in-call app of any live and recently disconnected calls. An app must 44f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * first be set as the default phone app (See {@link TelecomManager#getDefaultDialerPackage()}) 45f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * before the telecom service will bind to its {@code InCallService} implementation. 46f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * <p> 47f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * Below is an example manifest registration for an {@code InCallService}. The meta-data 48f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * ({@link TelecomManager#METADATA_IN_CALL_SERVICE_UI}) indicates that this particular 49f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * {@code InCallService} implementation intends to replace the built-in in-call UI. 50f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * <pre> 51f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * {@code 5271fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * <service android:name="your.package.YourInCallServiceImplementation" 5378f3ba6ea49f1279bb29577cbd97baf3eb8b1fe3Sailesh Nepal * android:permission="android.permission.BIND_INCALL_SERVICE"> 5471fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" /> 5571fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * <intent-filter> 5671fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * <action android:name="android.telecom.InCallService"/> 5771fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * </intent-filter> 5871fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * </service> 59f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * } 60f2600eb5aca1ec9bda2674d878528a770d5c220bSantos Cordon * </pre> 61ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal */ 622f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordonpublic abstract class InCallService extends Service { 632ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn 642ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn /** 652ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn * The {@link Intent} that must be declared as handled by the service. 662ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn */ 672ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) 68ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn public static final String SERVICE_INTERFACE = "android.telecom.InCallService"; 692ac401093e5ebb975f14e5108d457c148370f7deTyler Gunn 70ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal private static final int MSG_SET_IN_CALL_ADAPTER = 1; 71ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal private static final int MSG_ADD_CALL = 2; 726043793d3e8455bc8867baed39353f0350daa63fSailesh Nepal private static final int MSG_UPDATE_CALL = 3; 735d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad private static final int MSG_SET_POST_DIAL_WAIT = 4; 744af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee private static final int MSG_ON_CALL_AUDIO_STATE_CHANGED = 5; 755d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad private static final int MSG_BRING_TO_FOREGROUND = 6; 766c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon private static final int MSG_ON_CAN_ADD_CALL_CHANGED = 7; 779c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal private static final int MSG_SILENCE_RINGER = 8; 78876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn private static final int MSG_ON_CONNECTION_EVENT = 9; 7995d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu private static final int MSG_ON_RTT_UPGRADE_REQUEST = 10; 8057006aa82a69740df73415a456d31993e2785e24Hall Liu private static final int MSG_ON_RTT_INITIATION_FAILURE = 11; 81ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 82ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal /** Default Handler used to consolidate binder method calls onto a single thread. */ 83ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal private final Handler mHandler = new Handler(Looper.getMainLooper()) { 84ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal @Override 85ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal public void handleMessage(Message msg) { 865e6162de625dfda047ff390bbc1ccf9a97db2261Jay Shrauner if (mPhone == null && msg.what != MSG_SET_IN_CALL_ADAPTER) { 875e6162de625dfda047ff390bbc1ccf9a97db2261Jay Shrauner return; 885e6162de625dfda047ff390bbc1ccf9a97db2261Jay Shrauner } 895e6162de625dfda047ff390bbc1ccf9a97db2261Jay Shrauner 90ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal switch (msg.what) { 91ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal case MSG_SET_IN_CALL_ADAPTER: 92bf9c6fdb43413929787ee3abeb76e5aabd1551d8Tyler Gunn String callingPackage = getApplicationContext().getOpPackageName(); 93159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn mPhone = new Phone(new InCallAdapter((IInCallAdapter) msg.obj), callingPackage, 94159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn getApplicationContext().getApplicationInfo().targetSdkVersion); 95a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon mPhone.addListener(mPhoneListener); 96e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad onPhoneCreated(mPhone); 97ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal break; 98ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal case MSG_ADD_CALL: 9988b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon mPhone.internalAddCall((ParcelableCall) msg.obj); 100ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal break; 1016043793d3e8455bc8867baed39353f0350daa63fSailesh Nepal case MSG_UPDATE_CALL: 10288b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon mPhone.internalUpdateCall((ParcelableCall) msg.obj); 1032f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad break; 1042f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad case MSG_SET_POST_DIAL_WAIT: { 1052f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad SomeArgs args = (SomeArgs) msg.obj; 1062f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad try { 1072f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad String callId = (String) args.arg1; 1082f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad String remaining = (String) args.arg2; 109e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad mPhone.internalSetPostDialWait(callId, remaining); 1102f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } finally { 1112f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad args.recycle(); 1122f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } 1132f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad break; 1142f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } 1154af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee case MSG_ON_CALL_AUDIO_STATE_CHANGED: 1164af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee mPhone.internalCallAudioStateChanged((CallAudioState) msg.obj); 117b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal break; 1183534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon case MSG_BRING_TO_FOREGROUND: 119e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad mPhone.internalBringToForeground(msg.arg1 == 1); 1203534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon break; 1216c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon case MSG_ON_CAN_ADD_CALL_CHANGED: 1226c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon mPhone.internalSetCanAddCall(msg.arg1 == 1); 1236c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon break; 1249c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal case MSG_SILENCE_RINGER: 1259c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal mPhone.internalSilenceRinger(); 1269c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal break; 127876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn case MSG_ON_CONNECTION_EVENT: { 128876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn SomeArgs args = (SomeArgs) msg.obj; 129876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn try { 130876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn String callId = (String) args.arg1; 131876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn String event = (String) args.arg2; 132876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn Bundle extras = (Bundle) args.arg3; 133876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn mPhone.internalOnConnectionEvent(callId, event, extras); 134876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn } finally { 135876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn args.recycle(); 136876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn } 137876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn break; 138876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn } 13995d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu case MSG_ON_RTT_UPGRADE_REQUEST: { 14095d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu String callId = (String) msg.obj; 14195d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu int requestId = msg.arg1; 14295d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu mPhone.internalOnRttUpgradeRequest(callId, requestId); 14395d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu break; 14495d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu } 14557006aa82a69740df73415a456d31993e2785e24Hall Liu case MSG_ON_RTT_INITIATION_FAILURE: { 14657006aa82a69740df73415a456d31993e2785e24Hall Liu String callId = (String) msg.obj; 14757006aa82a69740df73415a456d31993e2785e24Hall Liu int reason = msg.arg1; 14857006aa82a69740df73415a456d31993e2785e24Hall Liu mPhone.internalOnRttInitiationFailure(callId, reason); 14957006aa82a69740df73415a456d31993e2785e24Hall Liu break; 15057006aa82a69740df73415a456d31993e2785e24Hall Liu } 151ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal default: 152ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal break; 153ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal } 154ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal } 155ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal }; 156ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 157ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal /** Manages the binder calls so that the implementor does not need to deal with it. */ 158ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal private final class InCallServiceBinder extends IInCallService.Stub { 159ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal @Override 160ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal public void setInCallAdapter(IInCallAdapter inCallAdapter) { 161ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal mHandler.obtainMessage(MSG_SET_IN_CALL_ADAPTER, inCallAdapter).sendToTarget(); 162ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal } 163ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 164ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal @Override 16588b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon public void addCall(ParcelableCall call) { 1666043793d3e8455bc8867baed39353f0350daa63fSailesh Nepal mHandler.obtainMessage(MSG_ADD_CALL, call).sendToTarget(); 167ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal } 168ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 169ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal @Override 17088b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon public void updateCall(ParcelableCall call) { 1716043793d3e8455bc8867baed39353f0350daa63fSailesh Nepal mHandler.obtainMessage(MSG_UPDATE_CALL, call).sendToTarget(); 1722f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } 1732f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad 1742f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad @Override 1752f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad public void setPostDial(String callId, String remaining) { 1765d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad // TODO: Unused 1772f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } 1782f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad 1792f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad @Override 1802f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad public void setPostDialWait(String callId, String remaining) { 1812f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad SomeArgs args = SomeArgs.obtain(); 1822f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad args.arg1 = callId; 1832f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad args.arg2 = remaining; 1842f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad mHandler.obtainMessage(MSG_SET_POST_DIAL_WAIT, args).sendToTarget(); 1852f23664b4fb9527f3b4e12843926ffe2220ea559Ihab Awad } 186b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal 187b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal @Override 1884af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee public void onCallAudioStateChanged(CallAudioState callAudioState) { 1894af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee mHandler.obtainMessage(MSG_ON_CALL_AUDIO_STATE_CHANGED, callAudioState).sendToTarget(); 190b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal } 1913534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon 1923534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon @Override 1933534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon public void bringToForeground(boolean showDialpad) { 1943534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon mHandler.obtainMessage(MSG_BRING_TO_FOREGROUND, showDialpad ? 1 : 0, 0).sendToTarget(); 1953534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon } 1966c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon 1976c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon @Override 1986c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon public void onCanAddCallChanged(boolean canAddCall) { 1996c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon mHandler.obtainMessage(MSG_ON_CAN_ADD_CALL_CHANGED, canAddCall ? 1 : 0, 0) 2006c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon .sendToTarget(); 2016c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon } 2029c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal 2039c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal @Override 2049c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal public void silenceRinger() { 2059c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal mHandler.obtainMessage(MSG_SILENCE_RINGER).sendToTarget(); 2069c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal } 207876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn 208876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn @Override 209876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn public void onConnectionEvent(String callId, String event, Bundle extras) { 210876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn SomeArgs args = SomeArgs.obtain(); 211876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn args.arg1 = callId; 212876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn args.arg2 = event; 213876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn args.arg3 = extras; 214876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn mHandler.obtainMessage(MSG_ON_CONNECTION_EVENT, args).sendToTarget(); 215876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn } 21695d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu 21795d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu @Override 21895d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu public void onRttUpgradeRequest(String callId, int id) { 21995d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu mHandler.obtainMessage(MSG_ON_RTT_UPGRADE_REQUEST, id, 0, callId).sendToTarget(); 22095d5587d0aad9dfd49f798408f4212f95ce68fc7Hall Liu } 22157006aa82a69740df73415a456d31993e2785e24Hall Liu 22257006aa82a69740df73415a456d31993e2785e24Hall Liu @Override 22357006aa82a69740df73415a456d31993e2785e24Hall Liu public void onRttInitiationFailure(String callId, int reason) { 22457006aa82a69740df73415a456d31993e2785e24Hall Liu mHandler.obtainMessage(MSG_ON_RTT_INITIATION_FAILURE, reason, 0, callId).sendToTarget(); 22557006aa82a69740df73415a456d31993e2785e24Hall Liu } 226ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal } 227ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 228a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon private Phone.Listener mPhoneListener = new Phone.Listener() { 229a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** ${inheritDoc} */ 230a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @Override 231a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onAudioStateChanged(Phone phone, AudioState audioState) { 232a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon InCallService.this.onAudioStateChanged(audioState); 233a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 234a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 2354af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee public void onCallAudioStateChanged(Phone phone, CallAudioState callAudioState) { 2364af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee InCallService.this.onCallAudioStateChanged(callAudioState); 2374af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee }; 2384af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee 239a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** ${inheritDoc} */ 240a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @Override 241a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onBringToForeground(Phone phone, boolean showDialpad) { 242a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon InCallService.this.onBringToForeground(showDialpad); 243a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 244a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 245a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** ${inheritDoc} */ 246a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @Override 247a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCallAdded(Phone phone, Call call) { 248a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon InCallService.this.onCallAdded(call); 249a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 250a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 251a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** ${inheritDoc} */ 252a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @Override 253a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCallRemoved(Phone phone, Call call) { 254a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon InCallService.this.onCallRemoved(call); 255a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 256a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 257a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** ${inheritDoc} */ 258a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @Override 259a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCanAddCallChanged(Phone phone, boolean canAddCall) { 260a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon InCallService.this.onCanAddCallChanged(canAddCall); 261a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 262a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 2639c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal /** ${inheritDoc} */ 2649c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal @Override 2659c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal public void onSilenceRinger(Phone phone) { 2669c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal InCallService.this.onSilenceRinger(); 2679c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal } 2689c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal 269a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon }; 270a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 271e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad private Phone mPhone; 272ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 2732f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon public InCallService() { 2742f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon } 275ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 2762f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon @Override 2772f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon public IBinder onBind(Intent intent) { 278e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad return new InCallServiceBinder(); 279924748fa3fc663c780c3fb21ec1332bd9757fcd2Evan Charlton } 280924748fa3fc663c780c3fb21ec1332bd9757fcd2Evan Charlton 281f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon @Override 282f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon public boolean onUnbind(Intent intent) { 283619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon if (mPhone != null) { 284619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon Phone oldPhone = mPhone; 285619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon mPhone = null; 286f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon 287619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon oldPhone.destroy(); 288a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon // destroy sets all the calls to disconnected if any live ones still exist. Therefore, 289a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon // it is important to remove the Listener *after* the call to destroy so that 290a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon // InCallService.on* callbacks are appropriately called. 291a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon oldPhone.removeListener(mPhoneListener); 292a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 293619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon onPhoneDestroyed(oldPhone); 294619b3c0d09ff01ca163601a22973a58fd13ca64cSantos Cordon } 295a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 296f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon return false; 297f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon } 298f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon 299924748fa3fc663c780c3fb21ec1332bd9757fcd2Evan Charlton /** 300e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Obtain the {@code Phone} associated with this {@code InCallService}. 301ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * 302e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * @return The {@code Phone} object associated with this {@code InCallService}, or {@code null} 3032f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon * if the {@code InCallService} is not in a state where it has an associated 3042f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon * {@code Phone}. 305a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @hide 30629886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon * @deprecated Use direct methods on InCallService instead of {@link Phone}. 307ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal */ 308a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @SystemApi 30929886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon @Deprecated 31029886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon public Phone getPhone() { 311e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad return mPhone; 312924748fa3fc663c780c3fb21ec1332bd9757fcd2Evan Charlton } 313ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal 314ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal /** 315895d4b8f63389b79974dfd3e36f1ab10b5ceb4dcSantos Cordon * Obtains the current list of {@code Call}s to be displayed by this in-call service. 316a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 317a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @return A list of the relevant {@code Call}s. 318a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 319a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public final List<Call> getCalls() { 320a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon return mPhone == null ? Collections.<Call>emptyList() : mPhone.getCalls(); 321a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 322a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 323a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 324a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Returns if the device can support additional calls. 325a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 326a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @return Whether the phone supports adding more calls. 327a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 328a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public final boolean canAddCall() { 329a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon return mPhone == null ? false : mPhone.canAddCall(); 330a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 331a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 332a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 333a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Obtains the current phone call audio state. 334a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 335a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @return An object encapsulating the audio state. Returns null if the service is not 336a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * fully initialized. 3374af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @deprecated Use {@link #getCallAudioState()} instead. 3384af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @hide 339a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 3404af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee @Deprecated 341a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public final AudioState getAudioState() { 342a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon return mPhone == null ? null : mPhone.getAudioState(); 343a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 344a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 345a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 3464af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * Obtains the current phone call audio state. 3474af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * 3484af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @return An object encapsulating the audio state. Returns null if the service is not 3494af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * fully initialized. 3504af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee */ 3514af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee public final CallAudioState getCallAudioState() { 3524af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee return mPhone == null ? null : mPhone.getCallAudioState(); 3534af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee } 3544af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee 3554af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee /** 356a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Sets the microphone mute state. When this request is honored, there will be change to 3574af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * the {@link #getCallAudioState()}. 358a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 359a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param state {@code true} if the microphone should be muted; {@code false} otherwise. 360a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 361a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public final void setMuted(boolean state) { 362a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon if (mPhone != null) { 363a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon mPhone.setMuted(state); 364a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 365a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 366a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 367a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 368a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Sets the audio route (speaker, bluetooth, etc...). When this request is honored, there will 3694af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * be change to the {@link #getCallAudioState()}. 370a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 371a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param route The audio route to use. 372a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 373a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public final void setAudioRoute(int route) { 374a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon if (mPhone != null) { 375a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon mPhone.setAudioRoute(route); 376a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 377a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 378a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 379a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 380e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Invoked when the {@code Phone} has been created. This is a signal to the in-call experience 381e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * to start displaying in-call information to the user. Each instance of {@code InCallService} 3822f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon * will have only one {@code Phone}, and this method will be called exactly once in the lifetime 3832f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon * of the {@code InCallService}. 384b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal * 385e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * @param phone The {@code Phone} object associated with this {@code InCallService}. 386a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @hide 38729886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon * @deprecated Use direct methods on InCallService instead of {@link Phone}. 388b632e5b122d82333c390cc334ab17100bc2af7a2Sailesh Nepal */ 389a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @SystemApi 39029886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon @Deprecated 3912f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon public void onPhoneCreated(Phone phone) { 3922f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon } 3933534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon 3943534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon /** 395e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Invoked when a {@code Phone} has been destroyed. This is a signal to the in-call experience 396e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * to stop displaying in-call information to the user. This method will be called exactly once 397e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * in the lifetime of the {@code InCallService}, and it will always be called after a previous 398e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * call to {@link #onPhoneCreated(Phone)}. 3993534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon * 400e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * @param phone The {@code Phone} object associated with this {@code InCallService}. 401a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @hide 40229886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon * @deprecated Use direct methods on InCallService instead of {@link Phone}. 4033534ede5722b98c5be1526ba0bc2cd8acfbe0e55Santos Cordon */ 404a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon @SystemApi 40529886d8571b703c4b9559d51421e8051bb1641c1Santos Cordon @Deprecated 4062f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon public void onPhoneDestroyed(Phone phone) { 4072f42b11d40c631c471e03dc35f94ab32af45a9acSantos Cordon } 40850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 40950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 410a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Called when the audio state changes. 411a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 412a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param audioState The new {@link AudioState}. 4134af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @deprecated Use {@link #onCallAudioStateChanged(CallAudioState) instead}. 4144af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @hide 415a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 4164af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee @Deprecated 417a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onAudioStateChanged(AudioState audioState) { 418a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 419a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 420a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 4214af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * Called when the audio state changes. 4224af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * 4234af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @param audioState The new {@link CallAudioState}. 4244af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee */ 4254af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee public void onCallAudioStateChanged(CallAudioState audioState) { 4264af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee } 4274af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee 4284af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee /** 429a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Called to bring the in-call screen to the foreground. The in-call experience should 430a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * respond immediately by coming to the foreground to inform the user of the state of 431a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * ongoing {@code Call}s. 432a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 433a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param showDialpad If true, put up the dialpad when the screen is shown. 434a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 435a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onBringToForeground(boolean showDialpad) { 436a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 437a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 438a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 439a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Called when a {@code Call} has been added to this in-call session. The in-call user 440a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * experience should add necessary state listeners to the specified {@code Call} and 441a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * immediately start to show the user information about the existence 442a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * and nature of this {@code Call}. Subsequent invocations of {@link #getCalls()} will 443a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * include this {@code Call}. 444a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 445a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param call A newly added {@code Call}. 446a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 447a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCallAdded(Call call) { 448a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 449a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 450a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 451a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Called when a {@code Call} has been removed from this in-call session. The in-call user 452a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * experience should remove any state listeners from the specified {@code Call} and 453a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * immediately stop displaying any information about this {@code Call}. 454a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Subsequent invocations of {@link #getCalls()} will no longer include this {@code Call}. 455a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 456a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param call A newly removed {@code Call}. 457a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 458a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCallRemoved(Call call) { 459a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 460a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 461a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 462a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * Called when the ability to add more calls changes. If the phone cannot 463a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * support more calls then {@code canAddCall} is set to {@code false}. If it can, then it 464a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * is set to {@code true}. This can be used to control the visibility of UI to add more calls. 465a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * 466a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon * @param canAddCall Indicates whether an additional call can be added. 467a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon */ 468a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon public void onCanAddCallChanged(boolean canAddCall) { 469a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon } 470a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon 471a2492810dfb0cd290b5466e33d5bdc5be4fb330eSantos Cordon /** 4729c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal * Called to silence the ringer if a ringing call exists. 4739c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal */ 4749c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal public void onSilenceRinger() { 4759c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal } 4769c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal 4779c2618b17fe580d70994ba8f5d999f20804575f9Sailesh Nepal /** 47806f3fa66b7af74f8168963468d0932032fadb74dTyler Gunn * Unused; to handle connection events issued by a {@link ConnectionService}, implement the 47906f3fa66b7af74f8168963468d0932032fadb74dTyler Gunn * {@link android.telecom.Call.Callback#onConnectionEvent(Call, String, Bundle)} callback. 480876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * <p> 481876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * See {@link Connection#sendConnectionEvent(String, Bundle)}. 482876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * 483876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * @param call The call the event is associated with. 484876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * @param event The event. 485876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn * @param extras Any associated extras. 486876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn */ 487876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn public void onConnectionEvent(Call call, String event, Bundle extras) { 488876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn } 489876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn 490876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn /** 491b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Used to issue commands to the {@link Connection.VideoProvider} associated with a 492b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Call}. 49350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 49450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public static abstract class VideoCall { 49550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 496011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee /** @hide */ 497011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public abstract void destroy(); 498011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 49950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 5007c9ee2b0c59b7f215511c3c9000f71d5e902715aAndrew Lee * Registers a callback to receive commands and state changes for video calls. 50150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 5027c9ee2b0c59b7f215511c3c9000f71d5e902715aAndrew Lee * @param callback The video call callback. 50350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 504da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee public abstract void registerCallback(VideoCall.Callback callback); 505da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee 506da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee /** 507011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee * Registers a callback to receive commands and state changes for video calls. 508011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee * 509011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee * @param callback The video call callback. 510011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee * @param handler A handler which commands and status changes will be delivered to. 511011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee */ 512011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public abstract void registerCallback(VideoCall.Callback callback, Handler handler); 513011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee 514011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee /** 515b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Clears the video call callback set via {@link #registerCallback}. 516295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn * 517295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn * @param callback The video call callback to clear. 51875958420f2d294ceda517c2782b294002dc2969fTyler Gunn */ 519011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee public abstract void unregisterCallback(VideoCall.Callback callback); 52075958420f2d294ceda517c2782b294002dc2969fTyler Gunn 52175958420f2d294ceda517c2782b294002dc2969fTyler Gunn /** 522b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Sets the camera to be used for the outgoing video. 523b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 524b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetCamera(String)}. 52550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 526b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param cameraId The id of the camera (use ids as reported by 527b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link CameraManager#getCameraIdList()}). 52850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 52950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void setCamera(String cameraId); 53050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 53150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 53250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Sets the surface to be used for displaying a preview of what the user's camera is 53350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * currently capturing. When video transmission is enabled, this is the video signal which 53450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * is sent to the remote device. 535b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 536b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetPreviewSurface(Surface)}. 53750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 538b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param surface The {@link Surface}. 53950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 54050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void setPreviewSurface(Surface surface); 54150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 54250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 54350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Sets the surface to be used for displaying the video received from the remote device. 544b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 545b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetDisplaySurface(Surface)}. 54650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 547b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param surface The {@link Surface}. 54850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 54950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void setDisplaySurface(Surface surface); 55050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 55150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 55250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Sets the device orientation, in degrees. Assumes that a standard portrait orientation of 55350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * the device is 0 degrees. 554b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 555b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetDeviceOrientation(int)}. 55650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 55750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param rotation The device orientation, in degrees. 55850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 55950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void setDeviceOrientation(int rotation); 56050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 56150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 56250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * Sets camera zoom ratio. 563b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 564b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetZoom(float)}. 56550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 56650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param value The camera zoom ratio. 56750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 56850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void setZoom(float value); 56950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 57050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 571b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Issues a request to modify the properties of the current video session. 572b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 573b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Example scenarios include: requesting an audio-only call to be upgraded to a 574b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * bi-directional video call, turning on or off the user's camera, sending a pause signal 575b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * when the {@link InCallService} is no longer the foreground application. 576b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 577b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by 578b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#onSendSessionModifyRequest(VideoProfile, VideoProfile)}. 57950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 58050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param requestProfile The requested call video properties. 58150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void sendSessionModifyRequest(VideoProfile requestProfile); 58350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 58450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 585b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Provides a response to a request to change the current call video session 586b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * properties. This should be called in response to a request the {@link InCallService} has 587b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * received via {@link VideoCall.Callback#onSessionModifyRequestReceived}. 588b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 589b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by 590b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#onSendSessionModifyResponse(VideoProfile)}. 59150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 59250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param responseProfile The response call video properties. 59350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 594b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void sendSessionModifyResponse(VideoProfile responseProfile); 59550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 59650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 597b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Issues a request to the {@link Connection.VideoProvider} to retrieve the capabilities 598b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * of the current camera. The current camera is selected using 599b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall#setCamera(String)}. 600b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 601b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Camera capabilities are reported to the caller via 602b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall.Callback#onCameraCapabilitiesChanged(VideoProfile.CameraCapabilities)}. 603b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 604b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onRequestCameraCapabilities()}. 60550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 60650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void requestCameraCapabilities(); 60750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 60850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 609b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Issues a request to the {@link Connection.VideoProvider} to retrieve the cumulative data 610b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * usage for the video component of the current call (in bytes). Data usage is reported 611b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * to the caller via {@link VideoCall.Callback#onCallDataUsageChanged}. 612b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 613b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onRequestConnectionDataUsage()}. 61450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 61550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void requestCallDataUsage(); 61650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 61750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 618b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Provides the {@link Connection.VideoProvider} with the {@link Uri} of an image to be 619b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * displayed to the peer device when the video signal is paused. 620b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 621b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handled by {@link Connection.VideoProvider#onSetPauseImage(Uri)}. 62250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 62350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param uri URI of image to display. 62450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 62532f24731604fd81289a39619bbc925b65184b505Yorke Lee public abstract void setPauseImage(Uri uri); 62650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 62750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 628b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * The {@link InCallService} extends this class to provide a means of receiving callbacks 629295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn * from the {@link Connection.VideoProvider}. 630295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn * <p> 631b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * When the {@link InCallService} receives the 632b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Call.Callback#onVideoCallChanged(Call, VideoCall)} callback, it should create an 633b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * instance its {@link VideoCall.Callback} implementation and set it on the 634b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall} using {@link VideoCall#registerCallback(Callback)}. 63550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 636da80c870a8c6d796446c373db9c9a989ebf8a388Andrew Lee public static abstract class Callback { 63750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 638b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Called when the {@link Connection.VideoProvider} receives a session modification 639295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn * request from the peer device. 640b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 641b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * The {@link InCallService} may potentially prompt the user to confirm whether they 642b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * wish to accept the request, or decide to automatically accept the request. In either 643b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * case the {@link InCallService} should call 644b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall#sendSessionModifyResponse(VideoProfile)} to indicate the video 645b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * profile agreed upon. 646b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 647b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from 648b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#receiveSessionModifyRequest(VideoProfile)}. 64950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 650b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param videoProfile The requested video profile. 65150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 652b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSessionModifyRequestReceived(VideoProfile videoProfile); 65350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 65450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 655b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Called when the {@link Connection.VideoProvider} receives a response to a session 656b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * modification request previously sent to the peer device. 657b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 658b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * The new video state should not be considered active by the {@link InCallService} 659b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * until the {@link Call} video state changes (the 660b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Call.Callback#onDetailsChanged(Call, Call.Details)} callback is triggered 661b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * when the video state changes). 662b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 663b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from 664b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#receiveSessionModifyResponse(int, VideoProfile, 665b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * VideoProfile)}. 66650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 66750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param status Status of the session modify request. Valid values are 668b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS}, 669b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_FAIL}, 670b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_INVALID}, 671b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_TIMED_OUT}, 672b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE}. 673b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param requestedProfile The original request which was sent to the peer device. 674b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param responseProfile The actual profile changes made by the peer device. 67550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 67650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void onSessionModifyResponseReceived(int status, 677b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad VideoProfile requestedProfile, VideoProfile responseProfile); 67850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 67950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 680b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handles events related to the current video session which the {@link InCallService} 681b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * may wish to handle. These are separate from requested changes to the session due to 682b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * the underlying protocol or connection. 683b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 684b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from 685b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#handleCallSessionEvent(int)}. 68650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 687b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param event The event. Valid values are: 688b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_RX_PAUSE}, 689b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_RX_RESUME}, 690b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_TX_START}, 691b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_TX_STOP}, 692b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_CAMERA_FAILURE}, 693bf9c6fdb43413929787ee3abeb76e5aabd1551d8Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_CAMERA_READY}, 694bf9c6fdb43413929787ee3abeb76e5aabd1551d8Tyler Gunn * {@link Connection.VideoProvider#SESSION_EVENT_CAMERA_PERMISSION_ERROR}. 69550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 69650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void onCallSessionEvent(int event); 69750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 69850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 699b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handles a change to the video dimensions from the peer device. This could happen if, 700b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * for example, the peer changes orientation of their device, or switches cameras. 701b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 702b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from 703b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#changePeerDimensions(int, int)}. 70450aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 70550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param width The updated peer video width. 70650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * @param height The updated peer video height. 70750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 70850aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee public abstract void onPeerDimensionsChanged(int width, int height); 70950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 71050aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 71107366813cdf3768dcd69a1f744023747564d654aRekha Kumar * Handles a change to the video quality. 712b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 713b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from {@link Connection.VideoProvider#changeVideoQuality(int)}. 71407366813cdf3768dcd69a1f744023747564d654aRekha Kumar * 715b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param videoQuality The updated peer video quality. Valid values: 716b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoProfile#QUALITY_HIGH}, 717b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoProfile#QUALITY_MEDIUM}, 718b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoProfile#QUALITY_LOW}, 719b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoProfile#QUALITY_DEFAULT}. 72007366813cdf3768dcd69a1f744023747564d654aRekha Kumar */ 72107366813cdf3768dcd69a1f744023747564d654aRekha Kumar public abstract void onVideoQualityChanged(int videoQuality); 72207366813cdf3768dcd69a1f744023747564d654aRekha Kumar 72307366813cdf3768dcd69a1f744023747564d654aRekha Kumar /** 724b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handles an update to the total data used for the current video session. 725b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 726b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Used by the {@link Connection.VideoProvider} in response to 727b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall#requestCallDataUsage()}. May also be called periodically by the 728b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider}. 729b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 730b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from {@link Connection.VideoProvider#setCallDataUsage(long)}. 73150aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 732b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * @param dataUsage The updated data usage (in bytes). 73350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 73407366813cdf3768dcd69a1f744023747564d654aRekha Kumar public abstract void onCallDataUsageChanged(long dataUsage); 73550aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee 73650aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee /** 737b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Handles a change in the capabilities of the currently selected camera. 738b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 739b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Used by the {@link Connection.VideoProvider} in response to 740b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall#requestCameraCapabilities()}. The {@link Connection.VideoProvider} 741b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * may also report the camera capabilities after a call to 742b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link VideoCall#setCamera(String)}. 743b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * <p> 744b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * Callback originates from 745b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * {@link Connection.VideoProvider#changeCameraCapabilities( 746b702ef8a91c9adec68b11e36c50b89fd5bcbb607Tyler Gunn * VideoProfile.CameraCapabilities)}. 74750aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee * 748b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param cameraCapabilities The changed camera capabilities. 74950aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee */ 750400470fab932fe3374149ab89386e460ea161002Yorke Lee public abstract void onCameraCapabilitiesChanged( 751400470fab932fe3374149ab89386e460ea161002Yorke Lee VideoProfile.CameraCapabilities cameraCapabilities); 75250aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 75350aca23bd7f51a3cf32a1f7e32238cc1e26ca1a0Andrew Lee } 754ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal} 755