blob: d8b0aaf8db55a3f597c6302203c150739c020c98 [file] [log] [blame]
Hall Liue091ab92015-12-18 17:05:30 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.telecom;
18
Hall Liue091ab92015-12-18 17:05:30 -080019import android.media.AudioManager;
20import android.os.Message;
21import android.util.SparseArray;
22
Hall Liufbed0162016-01-14 18:06:29 -080023import com.android.internal.util.IState;
Hall Liue091ab92015-12-18 17:05:30 -080024import com.android.internal.util.State;
25import com.android.internal.util.StateMachine;
26
27public class CallAudioModeStateMachine extends StateMachine {
28 public static class MessageArgs {
Hall Liufbed0162016-01-14 18:06:29 -080029 public boolean hasActiveOrDialingCalls;
Hall Liue091ab92015-12-18 17:05:30 -080030 public boolean hasRingingCalls;
31 public boolean hasHoldingCalls;
32 public boolean isTonePlaying;
33 public boolean foregroundCallIsVoip;
34 public Session session;
35
Hall Liufbed0162016-01-14 18:06:29 -080036 public MessageArgs(boolean hasActiveOrDialingCalls, boolean hasRingingCalls,
37 boolean hasHoldingCalls, boolean isTonePlaying, boolean foregroundCallIsVoip,
38 Session session) {
39 this.hasActiveOrDialingCalls = hasActiveOrDialingCalls;
Hall Liue091ab92015-12-18 17:05:30 -080040 this.hasRingingCalls = hasRingingCalls;
41 this.hasHoldingCalls = hasHoldingCalls;
42 this.isTonePlaying = isTonePlaying;
43 this.foregroundCallIsVoip = foregroundCallIsVoip;
44 this.session = session;
45 }
46
47 @Override
48 public String toString() {
49 return "MessageArgs{" +
Hall Liufbed0162016-01-14 18:06:29 -080050 "hasActiveCalls=" + hasActiveOrDialingCalls +
Hall Liue091ab92015-12-18 17:05:30 -080051 ", hasRingingCalls=" + hasRingingCalls +
52 ", hasHoldingCalls=" + hasHoldingCalls +
53 ", isTonePlaying=" + isTonePlaying +
54 ", foregroundCallIsVoip=" + foregroundCallIsVoip +
55 ", session=" + session +
56 '}';
57 }
58 }
59
60 public static final int INITIALIZE = 1;
61 // These ENTER_*_FOCUS commands are for testing.
62 public static final int ENTER_CALL_FOCUS_FOR_TESTING = 2;
63 public static final int ENTER_COMMS_FOCUS_FOR_TESTING = 3;
64 public static final int ENTER_RING_FOCUS_FOR_TESTING = 4;
Hall Liufbed0162016-01-14 18:06:29 -080065 public static final int ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING = 5;
66 public static final int ABANDON_FOCUS_FOR_TESTING = 6;
Hall Liue091ab92015-12-18 17:05:30 -080067
68 public static final int NO_MORE_ACTIVE_OR_DIALING_CALLS = 1001;
69 public static final int NO_MORE_RINGING_CALLS = 1002;
70 public static final int NO_MORE_HOLDING_CALLS = 1003;
71
72 public static final int NEW_ACTIVE_OR_DIALING_CALL = 2001;
73 public static final int NEW_RINGING_CALL = 2002;
74 public static final int NEW_HOLDING_CALL = 2003;
75 public static final int MT_AUDIO_SPEEDUP_FOR_RINGING_CALL = 2004;
76
77 public static final int TONE_STARTED_PLAYING = 3001;
78 public static final int TONE_STOPPED_PLAYING = 3002;
79
80 public static final int FOREGROUND_VOIP_MODE_CHANGE = 4001;
81
Hall Liufbed0162016-01-14 18:06:29 -080082 public static final int RUN_RUNNABLE = 9001;
83
Hall Liue091ab92015-12-18 17:05:30 -080084 private static final SparseArray<String> MESSAGE_CODE_TO_NAME = new SparseArray<String>() {{
85 put(ENTER_CALL_FOCUS_FOR_TESTING, "ENTER_CALL_FOCUS_FOR_TESTING");
86 put(ENTER_COMMS_FOCUS_FOR_TESTING, "ENTER_COMMS_FOCUS_FOR_TESTING");
87 put(ENTER_RING_FOCUS_FOR_TESTING, "ENTER_RING_FOCUS_FOR_TESTING");
Hall Liufbed0162016-01-14 18:06:29 -080088 put(ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING, "ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING");
Hall Liue091ab92015-12-18 17:05:30 -080089 put(ABANDON_FOCUS_FOR_TESTING, "ABANDON_FOCUS_FOR_TESTING");
90 put(NO_MORE_ACTIVE_OR_DIALING_CALLS, "NO_MORE_ACTIVE_OR_DIALING_CALLS");
91 put(NO_MORE_RINGING_CALLS, "NO_MORE_RINGING_CALLS");
92 put(NO_MORE_HOLDING_CALLS, "NO_MORE_HOLDING_CALLS");
93 put(NEW_ACTIVE_OR_DIALING_CALL, "NEW_ACTIVE_OR_DIALING_CALL");
94 put(NEW_RINGING_CALL, "NEW_RINGING_CALL");
95 put(NEW_HOLDING_CALL, "NEW_HOLDING_CALL");
96 put(MT_AUDIO_SPEEDUP_FOR_RINGING_CALL, "MT_AUDIO_SPEEDUP_FOR_RINGING_CALL");
97 put(TONE_STARTED_PLAYING, "TONE_STARTED_PLAYING");
98 put(TONE_STOPPED_PLAYING, "TONE_STOPPED_PLAYING");
99 put(FOREGROUND_VOIP_MODE_CHANGE, "FOREGROUND_VOIP_MODE_CHANGE");
Hall Liufbed0162016-01-14 18:06:29 -0800100
101 put(RUN_RUNNABLE, "RUN_RUNNABLE");
Hall Liue091ab92015-12-18 17:05:30 -0800102 }};
103
Hall Liufbed0162016-01-14 18:06:29 -0800104 public static final String TONE_HOLD_STATE_NAME = OtherFocusState.class.getSimpleName();
105 public static final String UNFOCUSED_STATE_NAME = UnfocusedState.class.getSimpleName();
106 public static final String CALL_STATE_NAME = SimCallFocusState.class.getSimpleName();
107 public static final String RING_STATE_NAME = RingingFocusState.class.getSimpleName();
108 public static final String COMMS_STATE_NAME = VoipCallFocusState.class.getSimpleName();
109
Hall Liue091ab92015-12-18 17:05:30 -0800110 private class BaseState extends State {
111 @Override
112 public boolean processMessage(Message msg) {
113 switch (msg.what) {
114 case ENTER_CALL_FOCUS_FOR_TESTING:
115 transitionTo(mSimCallFocusState);
116 return HANDLED;
117 case ENTER_COMMS_FOCUS_FOR_TESTING:
118 transitionTo(mVoipCallFocusState);
119 return HANDLED;
120 case ENTER_RING_FOCUS_FOR_TESTING:
121 transitionTo(mRingingFocusState);
122 return HANDLED;
Hall Liufbed0162016-01-14 18:06:29 -0800123 case ENTER_TONE_OR_HOLD_FOCUS_FOR_TESTING:
124 transitionTo(mOtherFocusState);
125 return HANDLED;
Hall Liue091ab92015-12-18 17:05:30 -0800126 case ABANDON_FOCUS_FOR_TESTING:
127 transitionTo(mUnfocusedState);
128 return HANDLED;
129 case INITIALIZE:
130 mIsInitialized = true;
131 return HANDLED;
Hall Liufbed0162016-01-14 18:06:29 -0800132 case RUN_RUNNABLE:
133 Runnable r = (Runnable) msg.obj;
134 r.run();
135 return HANDLED;
Hall Liue091ab92015-12-18 17:05:30 -0800136 default:
137 return NOT_HANDLED;
138 }
139 }
140 }
141
142 private class UnfocusedState extends BaseState {
143 @Override
144 public void enter() {
145 if (mIsInitialized) {
146 Log.i(LOG_TAG, "Abandoning audio focus: now UNFOCUSED");
147 mAudioManager.abandonAudioFocusForCall();
148 mAudioManager.setMode(AudioManager.MODE_NORMAL);
149
150 mMostRecentMode = AudioManager.MODE_NORMAL;
151 mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.NO_FOCUS);
152 }
153 }
154
155 @Override
156 public boolean processMessage(Message msg) {
157 if (super.processMessage(msg) == HANDLED) {
158 return HANDLED;
159 }
160 MessageArgs args = (MessageArgs) msg.obj;
161 switch (msg.what) {
162 case NO_MORE_ACTIVE_OR_DIALING_CALLS:
163 // Do nothing.
164 return HANDLED;
165 case NO_MORE_RINGING_CALLS:
166 // Do nothing.
167 return HANDLED;
168 case NO_MORE_HOLDING_CALLS:
169 // Do nothing.
170 return HANDLED;
171 case NEW_ACTIVE_OR_DIALING_CALL:
Hall Liue091ab92015-12-18 17:05:30 -0800172 transitionTo(args.foregroundCallIsVoip
173 ? mVoipCallFocusState : mSimCallFocusState);
174 return HANDLED;
175 case NEW_RINGING_CALL:
176 transitionTo(mRingingFocusState);
177 return HANDLED;
178 case NEW_HOLDING_CALL:
179 // This really shouldn't happen, but transition to the focused state anyway.
180 Log.w(LOG_TAG, "Call was surprisingly put into hold from an unknown state." +
181 " Args are: \n" + args.toString());
182 transitionTo(mOtherFocusState);
183 return HANDLED;
184 case TONE_STARTED_PLAYING:
185 // This shouldn't happen either, but perform the action anyway.
186 Log.w(LOG_TAG, "Tone started playing unexpectedly. Args are: \n"
187 + args.toString());
188 return HANDLED;
189 default:
190 // The forced focus switch commands are handled by BaseState.
191 return NOT_HANDLED;
192 }
193 }
194 }
195
196 private class RingingFocusState extends BaseState {
197 @Override
198 public void enter() {
199 Log.i(LOG_TAG, "Audio focus entering RINGING state");
200 mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING,
201 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
202 if (mMostRecentMode == AudioManager.MODE_IN_CALL) {
203 // Preserving behavior from the old CallAudioManager.
204 Log.i(LOG_TAG, "Transition from IN_CALL -> RINGTONE."
205 + " Resetting to NORMAL first.");
206 mAudioManager.setMode(AudioManager.MODE_NORMAL);
207 }
208 mAudioManager.setMode(AudioManager.MODE_RINGTONE);
209
Hall Liufbed0162016-01-14 18:06:29 -0800210 mCallAudioManager.stopCallWaiting();
Hall Liue091ab92015-12-18 17:05:30 -0800211 mCallAudioManager.startRinging();
212 mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.HAS_FOCUS);
213 }
214
215 @Override
216 public void exit() {
217 // Audio mode and audio stream will be set by the next state.
218 mCallAudioManager.stopRinging();
219 }
220
221 @Override
222 public boolean processMessage(Message msg) {
223 if (super.processMessage(msg) == HANDLED) {
224 return HANDLED;
225 }
226 MessageArgs args = (MessageArgs) msg.obj;
227 switch (msg.what) {
228 case NO_MORE_ACTIVE_OR_DIALING_CALLS:
229 // Do nothing. Loss of an active call should not impact ringer.
230 return HANDLED;
231 case NO_MORE_HOLDING_CALLS:
232 // Do nothing and keep ringing.
233 return HANDLED;
234 case NO_MORE_RINGING_CALLS:
235 // If there are active or holding calls, switch to the appropriate focus.
236 // Otherwise abandon focus.
Hall Liufbed0162016-01-14 18:06:29 -0800237 if (args.hasActiveOrDialingCalls) {
Hall Liue091ab92015-12-18 17:05:30 -0800238 if (args.foregroundCallIsVoip) {
239 transitionTo(mVoipCallFocusState);
240 } else {
241 transitionTo(mSimCallFocusState);
242 }
243 } else if (args.hasHoldingCalls || args.isTonePlaying) {
244 transitionTo(mOtherFocusState);
245 } else {
246 transitionTo(mUnfocusedState);
247 }
248 return HANDLED;
249 case NEW_ACTIVE_OR_DIALING_CALL:
250 // If a call becomes active suddenly, give it priority over ringing.
251 transitionTo(args.foregroundCallIsVoip
252 ? mVoipCallFocusState : mSimCallFocusState);
253 return HANDLED;
254 case NEW_RINGING_CALL:
255 Log.w(LOG_TAG, "Unexpected behavior! New ringing call appeared while in " +
256 "ringing state.");
257 return HANDLED;
258 case NEW_HOLDING_CALL:
259 // This really shouldn't happen, but transition to the focused state anyway.
260 Log.w(LOG_TAG, "Call was surprisingly put into hold while ringing." +
261 " Args are: " + args.toString());
262 transitionTo(mOtherFocusState);
263 return HANDLED;
264 case MT_AUDIO_SPEEDUP_FOR_RINGING_CALL:
265 // This happens when an IMS call is answered by the in-call UI. Special case
266 // that we have to deal with for some reason.
267
268 // VOIP calls should never invoke this mechanism, so transition directly to
269 // the sim call focus state.
270 transitionTo(mSimCallFocusState);
271 return HANDLED;
272 default:
273 // The forced focus switch commands are handled by BaseState.
274 return NOT_HANDLED;
275 }
276 }
277 }
278
279 private class SimCallFocusState extends BaseState {
280 @Override
281 public void enter() {
282 Log.i(LOG_TAG, "Audio focus entering SIM CALL state");
283 mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
284 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
285 mAudioManager.setMode(AudioManager.MODE_IN_CALL);
286 mMostRecentMode = AudioManager.MODE_IN_CALL;
287 mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.HAS_FOCUS);
288 }
289
290 @Override
291 public boolean processMessage(Message msg) {
292 if (super.processMessage(msg) == HANDLED) {
293 return HANDLED;
294 }
295 MessageArgs args = (MessageArgs) msg.obj;
296 switch (msg.what) {
297 case NO_MORE_ACTIVE_OR_DIALING_CALLS:
298 // Switch to either ringing, holding, or inactive
Hall Liufbed0162016-01-14 18:06:29 -0800299 transitionTo(destinationStateAfterNoMoreActiveCalls(args));
Hall Liue091ab92015-12-18 17:05:30 -0800300 return HANDLED;
301 case NO_MORE_RINGING_CALLS:
302 // Don't transition state, but stop any call-waiting tones that may have been
303 // playing.
Hall Liufbed0162016-01-14 18:06:29 -0800304 if (args.isTonePlaying) {
305 mCallAudioManager.stopCallWaiting();
306 }
Hall Liue091ab92015-12-18 17:05:30 -0800307 return HANDLED;
308 case NO_MORE_HOLDING_CALLS:
309 // Do nothing.
310 return HANDLED;
311 case NEW_ACTIVE_OR_DIALING_CALL:
312 // Do nothing. Already active.
313 return HANDLED;
314 case NEW_RINGING_CALL:
315 // Don't make a call ring over an active call, but do play a call waiting tone.
316 mCallAudioManager.startCallWaiting();
317 return HANDLED;
318 case NEW_HOLDING_CALL:
319 // Don't do anything now. Putting an active call on hold will be handled when
320 // NO_MORE_ACTIVE_CALLS is processed.
321 return HANDLED;
322 case FOREGROUND_VOIP_MODE_CHANGE:
323 if (args.foregroundCallIsVoip) {
324 transitionTo(mVoipCallFocusState);
325 }
326 return HANDLED;
327 default:
328 // The forced focus switch commands are handled by BaseState.
329 return NOT_HANDLED;
330 }
331 }
332 }
333
334 private class VoipCallFocusState extends BaseState {
335 @Override
336 public void enter() {
337 Log.i(LOG_TAG, "Audio focus entering VOIP CALL state");
338 mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
339 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
340 mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
341 mMostRecentMode = AudioManager.MODE_IN_COMMUNICATION;
342 mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.HAS_FOCUS);
343 }
344
345 @Override
346 public boolean processMessage(Message msg) {
347 if (super.processMessage(msg) == HANDLED) {
348 return HANDLED;
349 }
350 MessageArgs args = (MessageArgs) msg.obj;
351 switch (msg.what) {
352 case NO_MORE_ACTIVE_OR_DIALING_CALLS:
353 // Switch to either ringing, holding, or inactive
Hall Liufbed0162016-01-14 18:06:29 -0800354 transitionTo(destinationStateAfterNoMoreActiveCalls(args));
Hall Liue091ab92015-12-18 17:05:30 -0800355 return HANDLED;
356 case NO_MORE_RINGING_CALLS:
357 // Don't transition state, but stop any call-waiting tones that may have been
358 // playing.
Hall Liufbed0162016-01-14 18:06:29 -0800359 if (args.isTonePlaying) {
360 mCallAudioManager.stopCallWaiting();
361 }
Hall Liue091ab92015-12-18 17:05:30 -0800362 return HANDLED;
363 case NO_MORE_HOLDING_CALLS:
364 // Do nothing.
365 return HANDLED;
366 case NEW_ACTIVE_OR_DIALING_CALL:
367 // Do nothing. Already active.
368 return HANDLED;
369 case NEW_RINGING_CALL:
370 // Don't make a call ring over an active call, but do play a call waiting tone.
371 mCallAudioManager.startCallWaiting();
372 return HANDLED;
373 case NEW_HOLDING_CALL:
374 // Don't do anything now. Putting an active call on hold will be handled when
375 // NO_MORE_ACTIVE_CALLS is processed.
376 return HANDLED;
377 case FOREGROUND_VOIP_MODE_CHANGE:
378 if (!args.foregroundCallIsVoip) {
379 transitionTo(mSimCallFocusState);
380 }
381 return HANDLED;
382 default:
383 // The forced focus switch commands are handled by BaseState.
384 return NOT_HANDLED;
385 }
386 }
387 }
388
389 /**
390 * This class is used for calls on hold and end-of-call tones.
391 */
392 private class OtherFocusState extends BaseState {
393 @Override
394 public void enter() {
395 Log.i(LOG_TAG, "Audio focus entering TONE/HOLDING state");
396 mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
397 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
398 mAudioManager.setMode(mMostRecentMode);
399 mCallAudioManager.setCallAudioRouteFocusState(CallAudioRouteStateMachine.HAS_FOCUS);
400 }
401
402 @Override
403 public boolean processMessage(Message msg) {
404 if (super.processMessage(msg) == HANDLED) {
405 return HANDLED;
406 }
407 MessageArgs args = (MessageArgs) msg.obj;
408 switch (msg.what) {
409 case NO_MORE_HOLDING_CALLS:
Hall Liufbed0162016-01-14 18:06:29 -0800410 if (args.hasActiveOrDialingCalls) {
Hall Liue091ab92015-12-18 17:05:30 -0800411 transitionTo(args.foregroundCallIsVoip
412 ? mVoipCallFocusState : mSimCallFocusState);
413 } else if (args.hasRingingCalls) {
414 transitionTo(mRingingFocusState);
415 } else if (!args.isTonePlaying) {
416 transitionTo(mUnfocusedState);
417 }
418 // Do nothing if a tone is playing.
419 return HANDLED;
420 case NEW_ACTIVE_OR_DIALING_CALL:
421 transitionTo(args.foregroundCallIsVoip
422 ? mVoipCallFocusState : mSimCallFocusState);
423 return HANDLED;
424 case NEW_RINGING_CALL:
425 // Apparently this is current behavior. Should this be the case?
426 transitionTo(mRingingFocusState);
427 return HANDLED;
428 case NEW_HOLDING_CALL:
429 // Do nothing.
430 return HANDLED;
431 case NO_MORE_RINGING_CALLS:
432 // If there are no more ringing calls in this state, then stop any call-waiting
433 // tones that may be playing.
434 mCallAudioManager.stopCallWaiting();
435 return HANDLED;
436 case TONE_STOPPED_PLAYING:
Hall Liufbed0162016-01-14 18:06:29 -0800437 if (!args.hasActiveOrDialingCalls && !args.hasRingingCalls
438 && !args.hasHoldingCalls && !args.isTonePlaying) {
Hall Liue091ab92015-12-18 17:05:30 -0800439 transitionTo(mUnfocusedState);
440 }
441 default:
442 return NOT_HANDLED;
443 }
444 }
445 }
446
447 private static final String LOG_TAG = CallAudioModeStateMachine.class.getSimpleName();
448
Hall Liufbed0162016-01-14 18:06:29 -0800449 private final BaseState mUnfocusedState = new UnfocusedState();
450 private final BaseState mRingingFocusState = new RingingFocusState();
451 private final BaseState mSimCallFocusState = new SimCallFocusState();
452 private final BaseState mVoipCallFocusState = new VoipCallFocusState();
453 private final BaseState mOtherFocusState = new OtherFocusState();
Hall Liue091ab92015-12-18 17:05:30 -0800454
Hall Liue091ab92015-12-18 17:05:30 -0800455 private final AudioManager mAudioManager;
456 private CallAudioManager mCallAudioManager;
457
458 private int mMostRecentMode;
459 private boolean mIsInitialized = false;
460
Hall Liufbed0162016-01-14 18:06:29 -0800461 public CallAudioModeStateMachine(AudioManager audioManager) {
Hall Liue091ab92015-12-18 17:05:30 -0800462 super(CallAudioModeStateMachine.class.getSimpleName());
Hall Liufbed0162016-01-14 18:06:29 -0800463 mAudioManager = audioManager;
Hall Liue091ab92015-12-18 17:05:30 -0800464 mMostRecentMode = AudioManager.MODE_NORMAL;
465
466 addState(mUnfocusedState);
467 addState(mRingingFocusState);
468 addState(mSimCallFocusState);
469 addState(mVoipCallFocusState);
470 addState(mOtherFocusState);
471 setInitialState(mUnfocusedState);
472 start();
473 sendMessage(INITIALIZE);
474 }
475
476 public void setCallAudioManager(CallAudioManager callAudioManager) {
477 mCallAudioManager = callAudioManager;
478 }
479
Hall Liufbed0162016-01-14 18:06:29 -0800480 public String getCurrentStateName() {
481 IState currentState = getCurrentState();
482 return currentState == null ? "no state" : currentState.getName();
483 }
484
Hall Liue091ab92015-12-18 17:05:30 -0800485 @Override
486 protected void onPreHandleMessage(Message msg) {
487 if (msg.obj != null && msg.obj instanceof MessageArgs) {
488 Log.continueSession(((MessageArgs) msg.obj).session, "CAMSM.pM_" + msg.what);
489 Log.i(LOG_TAG, "Message received: %s.", MESSAGE_CODE_TO_NAME.get(msg.what));
Hall Liufbed0162016-01-14 18:06:29 -0800490 } else if (msg.what == RUN_RUNNABLE && msg.obj instanceof Runnable) {
491 Log.i(LOG_TAG, "Running runnable for testing");
Hall Liue091ab92015-12-18 17:05:30 -0800492 } else {
Hall Liufbed0162016-01-14 18:06:29 -0800493 Log.w(LOG_TAG, "Message sent must be of type nonnull MessageArgs, but got " +
494 (msg.obj == null ? "null" : msg.obj.getClass().getSimpleName()));
495 Log.w(LOG_TAG, "The message was of code %d = %s",
496 msg.what, MESSAGE_CODE_TO_NAME.get(msg.what));
Hall Liue091ab92015-12-18 17:05:30 -0800497 }
498 }
499
500 @Override
501 protected void onPostHandleMessage(Message msg) {
502 Log.endSession();
503 }
504
Hall Liufbed0162016-01-14 18:06:29 -0800505 private BaseState destinationStateAfterNoMoreActiveCalls(MessageArgs args) {
506 if (args.hasRingingCalls) {
507 return mRingingFocusState;
508 } else if (args.hasHoldingCalls || args.isTonePlaying) {
509 return mOtherFocusState;
510 } else {
511 return mUnfocusedState;
512 }
Hall Liue091ab92015-12-18 17:05:30 -0800513 }
514}