Loading src/com/android/server/telecom/CallAudioRouteStateMachine.java +28 −6 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telecom.Log; import android.telecom.Logging.Session; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.State; Loading Loading @@ -119,7 +120,8 @@ public class CallAudioRouteStateMachine extends StateMachine { public static final int NO_INCLUDE_BLUETOOTH_IN_BASELINE = 0; public static final int INCLUDE_BLUETOOTH_IN_BASELINE = 1; private static final SparseArray<String> AUDIO_ROUTE_TO_LOG_EVENT = new SparseArray<String>() {{ @VisibleForTesting public static final SparseArray<String> AUDIO_ROUTE_TO_LOG_EVENT = new SparseArray<String>() {{ put(CallAudioState.ROUTE_BLUETOOTH, LogUtils.Events.AUDIO_ROUTE_BT); put(CallAudioState.ROUTE_EARPIECE, LogUtils.Events.AUDIO_ROUTE_EARPIECE); put(CallAudioState.ROUTE_SPEAKER, LogUtils.Events.AUDIO_ROUTE_SPEAKER); Loading Loading @@ -190,6 +192,10 @@ public class CallAudioRouteStateMachine extends StateMachine { super.enter(); Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE, "Entering state " + getName()); if (isActive()) { Log.addEvent(mCallsManager.getForegroundCall(), AUDIO_ROUTE_TO_LOG_EVENT.get(getRouteCode(), LogUtils.Events.AUDIO_ROUTE)); } } @Override Loading Loading @@ -256,6 +262,7 @@ public class CallAudioRouteStateMachine extends StateMachine { // Behavior will depend on whether the state is an active one or a quiescent one. abstract public void updateSystemAudioState(); abstract public boolean isActive(); abstract public int getRouteCode(); } class ActiveEarpieceRoute extends EarpieceRoute { Loading Loading @@ -393,6 +400,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class EarpieceRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_EARPIECE; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -571,6 +583,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class HeadsetRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_WIRED_HEADSET; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -851,6 +868,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class BluetoothRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_BLUETOOTH; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -1037,6 +1059,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class SpeakerRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_SPEAKER; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -1344,11 +1371,6 @@ public class CallAudioRouteStateMachine extends StateMachine { Log.i(this, "setSystemAudioState: changing from %s to %s", mLastKnownCallAudioState, newCallAudioState); if (force || !newCallAudioState.equals(mLastKnownCallAudioState)) { if (newCallAudioState.getRoute() != mLastKnownCallAudioState.getRoute()) { Log.addEvent(mCallsManager.getForegroundCall(), AUDIO_ROUTE_TO_LOG_EVENT.get(newCallAudioState.getRoute(), LogUtils.Events.AUDIO_ROUTE)); } mCallsManager.onCallAudioStateChanged(mLastKnownCallAudioState, newCallAudioState); updateAudioForForegroundCall(newCallAudioState); Loading tests/src/com/android/server/telecom/tests/AnalyticsTests.java +38 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,14 @@ package com.android.server.telecom.tests; import android.content.Context; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.telecom.CallAudioState; import android.telecom.Connection; import android.telecom.DisconnectCause; import android.telecom.InCallService; import android.telecom.Log; import android.telecom.Logging.EventManager; import android.telecom.ParcelableCallAnalytics; import android.telecom.TelecomAnalytics; import android.telecom.TelecomManager; Loading @@ -34,6 +38,7 @@ import android.util.Base64; import com.android.internal.util.IndentingPrintWriter; import com.android.server.telecom.Analytics; import com.android.server.telecom.CallAudioRouteStateMachine; import com.android.server.telecom.LogUtils; import com.android.server.telecom.nano.TelecomLogClass; Loading @@ -41,6 +46,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; Loading Loading @@ -308,6 +314,38 @@ public class AnalyticsTests extends TelecomSystemTest { ParcelableCallAnalytics.AnalyticsEvent.FILTERING_INITIATED)); } @MediumTest public void testAnalyticsAudioRoutes() throws Exception { Analytics.reset(); IdPair testCall = startAndMakeActiveIncomingCall( "650-555-1212", mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); List<Integer> audioRoutes = new LinkedList<>(); waitForHandlerAction( mTelecomSystem.getCallsManager().getCallAudioManager() .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT); audioRoutes.add(mInCallServiceFixtureX.mCallAudioState.getRoute()); mInCallServiceFixtureX.getInCallAdapter().setAudioRoute(CallAudioState.ROUTE_SPEAKER); waitForHandlerAction( mTelecomSystem.getCallsManager().getCallAudioManager() .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT); audioRoutes.add(CallAudioState.ROUTE_SPEAKER); Map<String, Analytics.CallInfoImpl> analyticsMap = Analytics.cloneData(); assertTrue(analyticsMap.containsKey(testCall.mCallId)); Analytics.CallInfoImpl callAnalytics = analyticsMap.get(testCall.mCallId); List<EventManager.Event> events = callAnalytics.callEvents.getEvents(); for (int route : audioRoutes) { String logEvent = CallAudioRouteStateMachine.AUDIO_ROUTE_TO_LOG_EVENT.get(route); assertTrue(events.stream().anyMatch(event -> event.eventId.equals(logEvent))); } } @MediumTest public void testAnalyticsConnectionProperties() throws Exception { Analytics.reset(); Loading Loading
src/com/android/server/telecom/CallAudioRouteStateMachine.java +28 −6 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telecom.Log; import android.telecom.Logging.Session; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.State; Loading Loading @@ -119,7 +120,8 @@ public class CallAudioRouteStateMachine extends StateMachine { public static final int NO_INCLUDE_BLUETOOTH_IN_BASELINE = 0; public static final int INCLUDE_BLUETOOTH_IN_BASELINE = 1; private static final SparseArray<String> AUDIO_ROUTE_TO_LOG_EVENT = new SparseArray<String>() {{ @VisibleForTesting public static final SparseArray<String> AUDIO_ROUTE_TO_LOG_EVENT = new SparseArray<String>() {{ put(CallAudioState.ROUTE_BLUETOOTH, LogUtils.Events.AUDIO_ROUTE_BT); put(CallAudioState.ROUTE_EARPIECE, LogUtils.Events.AUDIO_ROUTE_EARPIECE); put(CallAudioState.ROUTE_SPEAKER, LogUtils.Events.AUDIO_ROUTE_SPEAKER); Loading Loading @@ -190,6 +192,10 @@ public class CallAudioRouteStateMachine extends StateMachine { super.enter(); Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE, "Entering state " + getName()); if (isActive()) { Log.addEvent(mCallsManager.getForegroundCall(), AUDIO_ROUTE_TO_LOG_EVENT.get(getRouteCode(), LogUtils.Events.AUDIO_ROUTE)); } } @Override Loading Loading @@ -256,6 +262,7 @@ public class CallAudioRouteStateMachine extends StateMachine { // Behavior will depend on whether the state is an active one or a quiescent one. abstract public void updateSystemAudioState(); abstract public boolean isActive(); abstract public int getRouteCode(); } class ActiveEarpieceRoute extends EarpieceRoute { Loading Loading @@ -393,6 +400,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class EarpieceRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_EARPIECE; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -571,6 +583,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class HeadsetRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_WIRED_HEADSET; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -851,6 +868,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class BluetoothRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_BLUETOOTH; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -1037,6 +1059,11 @@ public class CallAudioRouteStateMachine extends StateMachine { } abstract class SpeakerRoute extends AudioState { @Override public int getRouteCode() { return CallAudioState.ROUTE_SPEAKER; } @Override public boolean processMessage(Message msg) { if (super.processMessage(msg) == HANDLED) { Loading Loading @@ -1344,11 +1371,6 @@ public class CallAudioRouteStateMachine extends StateMachine { Log.i(this, "setSystemAudioState: changing from %s to %s", mLastKnownCallAudioState, newCallAudioState); if (force || !newCallAudioState.equals(mLastKnownCallAudioState)) { if (newCallAudioState.getRoute() != mLastKnownCallAudioState.getRoute()) { Log.addEvent(mCallsManager.getForegroundCall(), AUDIO_ROUTE_TO_LOG_EVENT.get(newCallAudioState.getRoute(), LogUtils.Events.AUDIO_ROUTE)); } mCallsManager.onCallAudioStateChanged(mLastKnownCallAudioState, newCallAudioState); updateAudioForForegroundCall(newCallAudioState); Loading
tests/src/com/android/server/telecom/tests/AnalyticsTests.java +38 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,14 @@ package com.android.server.telecom.tests; import android.content.Context; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.telecom.CallAudioState; import android.telecom.Connection; import android.telecom.DisconnectCause; import android.telecom.InCallService; import android.telecom.Log; import android.telecom.Logging.EventManager; import android.telecom.ParcelableCallAnalytics; import android.telecom.TelecomAnalytics; import android.telecom.TelecomManager; Loading @@ -34,6 +38,7 @@ import android.util.Base64; import com.android.internal.util.IndentingPrintWriter; import com.android.server.telecom.Analytics; import com.android.server.telecom.CallAudioRouteStateMachine; import com.android.server.telecom.LogUtils; import com.android.server.telecom.nano.TelecomLogClass; Loading @@ -41,6 +46,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; Loading Loading @@ -308,6 +314,38 @@ public class AnalyticsTests extends TelecomSystemTest { ParcelableCallAnalytics.AnalyticsEvent.FILTERING_INITIATED)); } @MediumTest public void testAnalyticsAudioRoutes() throws Exception { Analytics.reset(); IdPair testCall = startAndMakeActiveIncomingCall( "650-555-1212", mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); List<Integer> audioRoutes = new LinkedList<>(); waitForHandlerAction( mTelecomSystem.getCallsManager().getCallAudioManager() .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT); audioRoutes.add(mInCallServiceFixtureX.mCallAudioState.getRoute()); mInCallServiceFixtureX.getInCallAdapter().setAudioRoute(CallAudioState.ROUTE_SPEAKER); waitForHandlerAction( mTelecomSystem.getCallsManager().getCallAudioManager() .getCallAudioRouteStateMachine().getHandler(), TEST_TIMEOUT); audioRoutes.add(CallAudioState.ROUTE_SPEAKER); Map<String, Analytics.CallInfoImpl> analyticsMap = Analytics.cloneData(); assertTrue(analyticsMap.containsKey(testCall.mCallId)); Analytics.CallInfoImpl callAnalytics = analyticsMap.get(testCall.mCallId); List<EventManager.Event> events = callAnalytics.callEvents.getEvents(); for (int route : audioRoutes) { String logEvent = CallAudioRouteStateMachine.AUDIO_ROUTE_TO_LOG_EVENT.get(route); assertTrue(events.stream().anyMatch(event -> event.eventId.equals(logEvent))); } } @MediumTest public void testAnalyticsConnectionProperties() throws Exception { Analytics.reset(); Loading