Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5cfc86b2 authored by Hall Liu's avatar Hall Liu
Browse files

Ensure that audio routes are properly logged

Make sure that the first audio route is logged in analytics.

Change-Id: I04820ba37ccf160490ed3bd87db4c34769b4aa05
Fixes: 64584823
Test: unit
parent d7a47b9e
Loading
Loading
Loading
Loading
+28 −6
Original line number Diff line number Diff line
@@ -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;
@@ -115,7 +116,8 @@ public class CallAudioRouteStateMachine extends StateMachine {
    public static final int ACTIVE_FOCUS = 2;
    public static final int RINGING_FOCUS = 3;

    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);
@@ -186,6 +188,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
@@ -250,6 +256,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 {
@@ -387,6 +394,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) {
@@ -565,6 +577,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) {
@@ -845,6 +862,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) {
@@ -1031,6 +1053,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) {
@@ -1338,11 +1365,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);
+38 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
@@ -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();