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

Commit 36973399 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/34326624',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/34326624', 'googleplex-android-review.googlesource.com/34331521'] into 25Q3-release.

Change-Id: I38777fbfeb37293bfe97d94487f1ec991e163be4
parents f880855b ac568126
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -78,14 +78,3 @@ flag {
    purpose: PURPOSE_BUGFIX
  }
}

# OWNER=pmadapurmath TARGET=25Q3
flag {
  name: "call_audio_routing_performance_improvemenent"
  namespace: "telecom"
  description: "Change the handler to use the main looper to improve performance with processing messages from the message queue"
  bug: "383466267"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
+57 −37
Original line number Diff line number Diff line
@@ -133,7 +133,9 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
    private AudioRoute.Factory mAudioRouteFactory;
    private StatusBarNotifier mStatusBarNotifier;
    private AudioManager.OnCommunicationDeviceChangedListener mCommunicationDeviceListener;
    private ExecutorService mCommunicationDeviceChangedExecutor;
    private ExecutorService mAudioManagerListenerExecutor;
    private AudioManager.OnPreferredDevicesForStrategyChangedListener mPreferredDeviceListener;
    private AudioRoute mPreferredDeviceRoute;
    private FeatureFlags mFeatureFlags;
    private int mFocusType;
    private int mCallSupportedRouteMask = -1;
@@ -287,12 +289,11 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        mUsePreferredDeviceStrategy = true;
        mWasOnSpeaker = false;
        setCurrentCommunicationDevice(null);
        mPreferredDeviceRoute = DUMMY_ROUTE;

        mTelecomLock = callsManager.getLock();
        HandlerThread handlerThread = new HandlerThread(this.getClass().getSimpleName());
        if (!mFeatureFlags.callAudioRoutingPerformanceImprovemenent()) {
        handlerThread.start();
        }

        IntentFilter micMuteChangedFilter = new IntentFilter(
                AudioManager.ACTION_MICROPHONE_MUTE_CHANGED);
@@ -306,7 +307,7 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        // Register AudioManager#onCommunicationDeviceChangedListener listener to receive updates
        // to communication device (via AudioManager#setCommunicationDevice). This is a replacement
        // to using broadcasts in the hopes of improving performance.
        mCommunicationDeviceChangedExecutor = Executors.newSingleThreadExecutor();
        mAudioManagerListenerExecutor = Executors.newSingleThreadExecutor();
        mCommunicationDeviceListener = new AudioManager.OnCommunicationDeviceChangedListener() {
            @Override
            public void onCommunicationDeviceChanged(AudioDeviceInfo device) {
@@ -329,11 +330,30 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
            }
        };

        Looper looper = mFeatureFlags.callAudioRoutingPerformanceImprovemenent()
                ? Looper.getMainLooper()
                : handlerThread.getLooper();
        // Register the  AudioManager. OnPreferredDevicesForStrategyChangedListener listener to
        // receive updates for the communication device. This is a replacement to directly querying
        // the preferred device via AudioManager#getPreferredDeviceForStrategy, which was known
        // to hold up the invoking thread.
        mPreferredDeviceListener = (strategy, devices) -> {
            try {
                Log.startSession("CARC.oPDFSCL");
                final AudioAttributes attr = new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                        .build();
                if (!devices.isEmpty() && strategy.supportsAudioAttributes(attr)) {
                    AudioRoute audioRoute = getPreferredDeviceAudioRoute(devices.getFirst());
                    Log.i(this, "OnPreferredDevicesForStrategyChangedListener: preferred device "
                            + "was updated to %s", audioRoute);
                    // Get the first device listed
                    setPreferredDeviceRoute(audioRoute);
                }
            } finally {
                Log.endSession();
            }
        };

        // Create handler
        mHandler = new Handler(looper) {
        mHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(@NonNull Message msg) {
                synchronized (this) {
@@ -515,9 +535,11 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        mCallAudioState = new CallAudioState(mIsMute, ROUTE_MAP.get(mCurrentRoute.getType()),
                supportMask, null, new HashSet<>());
        mAudioManager.addOnCommunicationDeviceChangedListener(
                mCommunicationDeviceChangedExecutor, mCommunicationDeviceListener);
                mAudioManagerListenerExecutor, mCommunicationDeviceListener);
        mAudioManager.addOnPreferredDevicesForStrategyChangedListener(mAudioManagerListenerExecutor,
                mPreferredDeviceListener);
        mAudioRoutesCallback = new AudioRoutesCallback();
        mAudioManager.registerAudioDeviceCallback(mAudioRoutesCallback, null);
        mAudioManager.registerAudioDeviceCallback(mAudioRoutesCallback, mHandler);
    }

    @Override
@@ -1382,12 +1404,10 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        }
    }

    private AudioRoute getPreferredAudioRouteFromStrategy() {
        // Get preferred device
        AudioDeviceAttributes deviceAttr = getPreferredDeviceForStrategy();
    private AudioRoute getPreferredDeviceAudioRoute(AudioDeviceAttributes deviceAttr) {
        Log.i(this, "getPreferredAudioRouteFromStrategy: preferred device is %s", deviceAttr);
        if (deviceAttr == null) {
            return null;
            return DUMMY_ROUTE;
        }

        // Get corresponding audio route
@@ -1413,25 +1433,6 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        }
    }

    private AudioDeviceAttributes getPreferredDeviceForStrategy() {
        // Get audio produce strategy
        AudioProductStrategy strategy = null;
        final AudioAttributes attr = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                .build();
        List<AudioProductStrategy> strategies = AudioManager.getAudioProductStrategies();
        for (AudioProductStrategy s : strategies) {
            if (s.supportsAudioAttributes(attr)) {
                strategy = s;
            }
        }
        if (strategy == null) {
            return null;
        }

        return mAudioManager.getPreferredDeviceForStrategy(strategy);
    }

    private AudioRoute getPreferredAudioRouteFromDefault(boolean isExplicitUserRequest,
            boolean includeBluetooth, String btAddressToExclude) {
        boolean skipEarpiece = false;
@@ -1550,9 +1551,16 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        if (!mUsePreferredDeviceStrategy) {
            return calculateBaselineRoute(false, includeBluetooth, btAddressToExclude);
        }
        AudioRoute destRoute = getPreferredAudioRouteFromStrategy();
        // Get the preferred device value cached from the listener
        AudioRoute destRoute = getPreferredDeviceRoute();
        boolean isPreferredDeviceSet = destRoute != null && !destRoute.equals(DUMMY_ROUTE);
        if (!isPreferredDeviceSet) {
            Log.i(this, "getBaseRoute: preferred audio route is not reported by "
                    + "AudioManager; telecom to determine");
        } else {
            Log.i(this, "getBaseRoute: preferred audio route is %s", destRoute);
        if (destRoute == null || (destRoute.getBluetoothAddress() != null && (!includeBluetooth
        }
        if (!isPreferredDeviceSet || (destRoute.getBluetoothAddress() != null && (!includeBluetooth
                || destRoute.getBluetoothAddress().equals(btAddressToExclude)))) {
            destRoute = getPreferredAudioRouteFromDefault(false, includeBluetooth, btAddressToExclude);
        }
@@ -1824,6 +1832,18 @@ public class CallAudioRouteController implements CallAudioRouteAdapter {
        }
    }

    public void setPreferredDeviceRoute(AudioRoute route) {
        synchronized (mLock) {
            mPreferredDeviceRoute = route;
        }
    }

    public AudioRoute getPreferredDeviceRoute() {
        synchronized (mLock) {
            return mPreferredDeviceRoute;
        }
    }

    private void maybeDisableWasOnSpeaker(boolean isUserRequest) {
        if (isUserRequest) {
            mWasOnSpeaker = false;
+0 −1
Original line number Diff line number Diff line
@@ -215,7 +215,6 @@ public class CallAudioRouteControllerTest extends TelecomTestCase {
        when(mCallAudioManager.getForegroundCall()).thenReturn(mCall);
        when(mCall.getVideoState()).thenReturn(VideoProfile.STATE_AUDIO_ONLY);
        when(mCall.getSupportedAudioRoutes()).thenReturn(CallAudioState.ROUTE_ALL);
        when(mFeatureFlags.callAudioRoutingPerformanceImprovemenent()).thenReturn(true);
        BLUETOOTH_DEVICES.add(BLUETOOTH_DEVICE_1);
    }