1214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer/* 2214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * Copyright (c) 2016, The Android Open Source Project 3214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * 4214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * Licensed under the Apache License, Version 2.0 (the "License"); 5214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * you may not use this file except in compliance with the License. 6214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * You may obtain a copy of the License at 7214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * 8214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * http://www.apache.org/licenses/LICENSE-2.0 9214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * 10214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * Unless required by applicable law or agreed to in writing, software 11214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * distributed under the License is distributed on an "AS IS" BASIS, 12214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * See the License for the specific language governing permissions and 14214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * limitations under the License. 15214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer */ 16214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerpackage com.android.car.stream.telecom; 17214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 18214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.BroadcastReceiver; 19214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.ComponentName; 20214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.Context; 21214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.Intent; 22214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.IntentFilter; 23214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.content.ServiceConnection; 24214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.os.AsyncTask; 25214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.os.IBinder; 26214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.os.SystemClock; 27214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.telecom.Call; 28214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.telecom.CallAudioState; 29214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.telecom.TelecomManager; 30214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport android.util.Log; 31214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport com.android.car.stream.StreamCard; 32214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport com.android.car.stream.StreamProducer; 33214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerimport com.android.car.stream.telecom.StreamInCallService.StreamInCallServiceBinder; 34214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 35214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer/** 36214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer * A {@link StreamProducer} that listens for active call events and produces a {@link StreamCard} 37214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer */ 38214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyerpublic class CurrentCallStreamProducer extends StreamProducer 39214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer implements StreamInCallService.InCallServiceCallback { 40214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private static final String TAG = "CurrentCallProducer"; 41214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 42214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private StreamInCallService mInCallService; 43214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private PhoneCallback mPhoneCallback; 44214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private CurrentCallActionReceiver mCallActionReceiver; 45214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private Call mCurrentCall; 46214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private long mCurrentCallStartTime; 47214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 48214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private CurrentCallConverter mConverter; 49214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private AsyncTask mUpdateStreamItemTask; 50214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 51214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private String mDialerPackage; 52214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private TelecomManager mTelecomManager; 53214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 54214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public CurrentCallStreamProducer(Context context) { 55214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer super(context); 56214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 57214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 58214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 59214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void start() { 60214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer super.start(); 61214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (Log.isLoggable(TAG, Log.DEBUG)) { 62214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.d(TAG, "current call producer started"); 63214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 64214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mTelecomManager = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); 65214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mDialerPackage = mTelecomManager.getDefaultDialerPackage(); 66214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mConverter = new CurrentCallConverter(mContext); 67214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mPhoneCallback = new PhoneCallback(); 68214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 69214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Intent inCallServiceIntent = new Intent(mContext, StreamInCallService.class); 70214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer inCallServiceIntent.setAction(StreamInCallService.LOCAL_INCALL_SERVICE_BIND_ACTION); 71214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mContext.bindService(inCallServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); 72214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 73214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 74214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 75214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void stop() { 76214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mContext.unbindService(mServiceConnection); 77214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer super.stop(); 78214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 79214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 80214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private void acceptCall() { 81214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer synchronized (mTelecomManager) { 82214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (mCurrentCall != null && mCurrentCall.getState() == Call.STATE_RINGING) { 83214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCall.answer(0 /* videoState */); 84214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 85214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 86214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 87214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 88214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private void disconnectCall() { 89214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer synchronized (mTelecomManager) { 90214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (mCurrentCall != null) { 91214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCall.disconnect(); 92214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 93214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 94214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 95214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 96214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 97214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onCallAdded(Call call) { 98214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (Log.isLoggable(TAG, Log.DEBUG)) { 99214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.d(TAG, "on call added, state: " + call.getState()); 100214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 101214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCall = call; 102214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer updateStreamCard(mCurrentCall, mContext); 103214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer call.registerCallback(mPhoneCallback); 104214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 105214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 106214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 107214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onCallRemoved(Call call) { 108214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (Log.isLoggable(TAG, Log.DEBUG)) { 109214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.d(TAG, "on call removed, state: " + call.getState()); 110214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 111214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer call.unregisterCallback(mPhoneCallback); 112214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer updateStreamCard(call, mContext); 113214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCall = null; 114214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 115214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 116214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 117214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onCallAudioStateChanged(CallAudioState audioState) { 118214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (mCurrentCall != null && audioState != null) { 119214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (Log.isLoggable(TAG, Log.DEBUG)) { 120214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.d(TAG, "audio state changed, is muted? " + audioState.isMuted()); 121214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 122214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer updateStreamCard(mCurrentCall, mContext); 123214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 124214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 125214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 126214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private void clearUpdateStreamItemTask() { 127214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (mUpdateStreamItemTask != null) { 128214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mUpdateStreamItemTask.cancel(false); 129214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mUpdateStreamItemTask = null; 130214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 131214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 132214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 133214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private void updateStreamCard(final Call call, final Context context) { 134214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer // Only one update may be active at a time. 135214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer clearUpdateStreamItemTask(); 136214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 137214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mUpdateStreamItemTask = new AsyncTask<Void, Void, StreamCard>() { 138214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 139214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer protected StreamCard doInBackground(Void... voids) { 140214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer try { 141214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer return mConverter.convert(call, context, mInCallService.isMuted(), 142214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCallStartTime, mDialerPackage); 143214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } catch (Exception e) { 144214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.e(TAG, "Failed to create StreamItem.", e); 145214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer throw e; 146214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 147214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 148214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 149214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 150214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer protected void onPostExecute(StreamCard card) { 151214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (call.getState() == Call.STATE_DISCONNECTED) { 152214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer removeCard(card); 153214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } else { 154214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer postCard(card); 155214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 156214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 157214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer }.execute(); 158214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 159214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 160214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private class PhoneCallback extends Call.Callback { 161214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 162214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onStateChanged(Call call, int state) { 163214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (Log.isLoggable(TAG, Log.DEBUG)) { 164214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer Log.d(TAG, "onStateChanged call: " + call + ", state: " + state); 165214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 166214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 167214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (state == Call.STATE_ACTIVE) { 168214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCallStartTime = SystemClock.elapsedRealtime(); 169214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } else { 170214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCallStartTime = 0; 171214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 172214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 173214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer switch (state) { 174214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer // TODO: Determine if a HUD or stream card should be displayed. 175214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case Call.STATE_RINGING: // Incoming call is ringing. 176214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case Call.STATE_DIALING: // Outgoing call that is dialing. 177214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case Call.STATE_ACTIVE: // Call is connected 178214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case Call.STATE_DISCONNECTING: // Call is being disconnected 179214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case Call.STATE_DISCONNECTED: // Call has finished. 180214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer updateStreamCard(call, mContext); 181214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCurrentCall = call; 182214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer break; 183214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer default: 184214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 185214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 186214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 187214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 188214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private class CurrentCallActionReceiver extends BroadcastReceiver { 189214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 190214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onReceive(Context context, Intent intent) { 191214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer String intentAction = intent.getAction(); 192214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (!TelecomConstants.INTENT_ACTION_STREAM_CALL_CONTROL.equals(intentAction)) { 193214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer return; 194214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 195214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 196214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer String action = intent.getStringExtra(TelecomConstants.EXTRA_STREAM_CALL_ACTION); 197214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer switch (action) { 198214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case TelecomConstants.ACTION_MUTE: 199214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mInCallService.setMuted(true); 200214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer break; 201214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case TelecomConstants.ACTION_UNMUTE: 202214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mInCallService.setMuted(false); 203214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer break; 204214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case TelecomConstants.ACTION_ACCEPT_CALL: 205214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer acceptCall(); 206214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer break; 207214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer case TelecomConstants.ACTION_HANG_UP_CALL: 208214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer disconnectCall(); 209214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer break; 210214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer default: 211214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 212214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 213214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 214214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 215214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer private ServiceConnection mServiceConnection = new ServiceConnection() { 216214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 217214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onServiceConnected(ComponentName name, IBinder service) { 218214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer StreamInCallServiceBinder binder = (StreamInCallServiceBinder) service; 219214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mInCallService = binder.getService(); 220214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mInCallService.setCallback(CurrentCallStreamProducer.this); 221214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 222214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer if (mCallActionReceiver == null) { 223214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mCallActionReceiver = new CurrentCallActionReceiver(); 224214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mContext.registerReceiver(mCallActionReceiver, 225214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer new IntentFilter(TelecomConstants.INTENT_ACTION_STREAM_CALL_CONTROL)); 226214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 227214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 228214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer 229214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer @Override 230214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer public void onServiceDisconnected(ComponentName name) { 231214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer mInCallService = null; 232214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer } 233214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer }; 234214c10ceef4ba736d8a7b3cbef06c27826822946Rakesh Iyer} 235