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