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

Commit 0f396b79 authored by Abner Huang's avatar Abner Huang Committed by Android (Google) Code Review
Browse files

Merge "Handle multi-user cases on Live Caption toggle in Volume rocker Please...

Merge "Handle multi-user cases on Live Caption toggle in Volume rocker Please refer to the design doc for the details: go/lc-multi-user-support" into main
parents 6db7c7c2 b0cd37ba
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaSession.Token;
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
@@ -57,6 +58,7 @@ import android.util.Slog;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.CaptioningManager;

import androidx.annotation.NonNull;
import androidx.lifecycle.Observer;

import com.android.internal.annotations.GuardedBy;
@@ -65,6 +67,7 @@ import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.VolumeDialogController;
@@ -131,7 +134,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
    private final Receiver mReceiver = new Receiver();
    private final RingerModeObservers mRingerModeObservers;
    private final MediaSessions mMediaSessions;
    private final CaptioningManager mCaptioningManager;
    private CaptioningManager mCaptioningManager;
    private final KeyguardManager mKeyguardManager;
    private final ActivityManager mActivityManager;
    private final UserTracker mUserTracker;
@@ -179,11 +182,11 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
            AccessibilityManager accessibilityManager,
            PackageManager packageManager,
            WakefulnessLifecycle wakefulnessLifecycle,
            CaptioningManager captioningManager,
            KeyguardManager keyguardManager,
            ActivityManager activityManager,
            UserTracker userTracker,
            DumpManager dumpManager
            DumpManager dumpManager,
            @Main Handler mainHandler
    ) {
        mContext = context.getApplicationContext();
        mPackageManager = packageManager;
@@ -209,10 +212,12 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
        mVibrator = vibrator;
        mHasVibrator = mVibrator.hasVibrator();
        mAudioService = iAudioService;
        mCaptioningManager = captioningManager;
        mKeyguardManager = keyguardManager;
        mActivityManager = activityManager;
        mUserTracker = userTracker;
        mUserTracker.addCallback(mUserChangedCallback, new HandlerExecutor(mainHandler));
        createCaptioningManagerServiceByUserContext(mUserTracker.getUserContext());

        dumpManager.registerDumpable("VolumeDialogControllerImpl", this);

        boolean accessibilityVolumeStreamActive = accessibilityManager
@@ -316,6 +321,25 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
        mWorker.sendEmptyMessage(W.GET_STATE);
    }

    /**
     * We met issues about the wrong state of System Caption in multi-user mode.
     * It happened in the usage of CaptioningManager Service from SysUI process
     * that is a global system process of User 0.
     * Therefore, we have to add callback on UserTracker that allows us to get the Context of
     * active User and then get the corresponding CaptioningManager Service for further usages.
     */
    private final UserTracker.Callback mUserChangedCallback =
            new UserTracker.Callback() {
                @Override
                public void onUserChanged(int newUser, @NonNull Context userContext) {
                    createCaptioningManagerServiceByUserContext(userContext);
                }
            };

    private void createCaptioningManagerServiceByUserContext(@NonNull Context userContext) {
        mCaptioningManager = userContext.getSystemService(CaptioningManager.class);
    }

    public boolean areCaptionsEnabled() {
        return mCaptioningManager.isSystemAudioCaptioningEnabled();
    }
@@ -719,7 +743,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
         * This method will never be called if the CSD (Computed Sound Dose) feature is
         * not enabled. See com.android.android.server.audio.SoundDoseHelper for the state of
         * the feature.
         * @param warning the type of warning to display, values are one of
         * @param csdWarning the type of warning to display, values are one of
         *        {@link android.media.AudioManager#CSD_WARNING_DOSE_REACHED_1X},
         *        {@link android.media.AudioManager#CSD_WARNING_DOSE_REPEATED_5X},
         *        {@link android.media.AudioManager#CSD_WARNING_MOMENTARY_EXPOSURE},
+15 −8
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import android.os.Process;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.CaptioningManager;

import androidx.test.filters.SmallTest;

@@ -64,6 +63,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.concurrent.Executor;

@RunWith(AndroidTestingRunner.class)
@SmallTest
@TestableLooper.RunWithLooper
@@ -96,8 +97,6 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
    @Mock
    private WakefulnessLifecycle mWakefullnessLifcycle;
    @Mock
    private CaptioningManager mCaptioningManager;
    @Mock
    private KeyguardManager mKeyguardManager;
    @Mock
    private ActivityManager mActivityManager;
@@ -105,6 +104,8 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
    private UserTracker mUserTracker;
    @Mock
    private DumpManager mDumpManager;
    @Mock
    private Handler mHandler;


    @Before
@@ -117,6 +118,7 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
        when(mRingerModeLiveData.getValue()).thenReturn(-1);
        when(mRingerModeInternalLiveData.getValue()).thenReturn(-1);
        when(mUserTracker.getUserId()).thenReturn(ActivityManager.getCurrentUser());
        when(mUserTracker.getUserContext()).thenReturn(mContext);
        // Enable group volume adjustments
        mContext.getOrCreateTestableResources().addOverride(
                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions,
@@ -127,8 +129,8 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
        mVolumeController = new TestableVolumeDialogControllerImpl(mContext,
                mBroadcastDispatcher, mRingerModeTracker, mThreadFactory, mAudioManager,
                mNotificationManager, mVibrator, mIAudioService, mAccessibilityManager,
                mPackageManager, mWakefullnessLifcycle, mCaptioningManager, mKeyguardManager,
                mActivityManager, mUserTracker, mDumpManager, mCallback);
                mPackageManager, mWakefullnessLifcycle, mKeyguardManager,
                mActivityManager, mUserTracker, mDumpManager, mHandler, mCallback);
        mVolumeController.setEnableDialogs(true, true);
    }

@@ -219,6 +221,11 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
        verify(mRingerModeInternalLiveData).observeForever(any());
    }

    @Test
    public void testAddCallbackWithUserTracker() {
        verify(mUserTracker).addCallback(any(UserTracker.Callback.class), any(Executor.class));
    }

    static class TestableVolumeDialogControllerImpl extends VolumeDialogControllerImpl {
        private final WakefulnessLifecycle.Observer mWakefullessLifecycleObserver;

@@ -234,16 +241,16 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
                AccessibilityManager accessibilityManager,
                PackageManager packageManager,
                WakefulnessLifecycle wakefulnessLifecycle,
                CaptioningManager captioningManager,
                KeyguardManager keyguardManager,
                ActivityManager activityManager,
                UserTracker userTracker,
                DumpManager dumpManager,
                Handler mainHandler,
                C callback) {
            super(context, broadcastDispatcher, ringerModeTracker, theadFactory, audioManager,
                    notificationManager, optionalVibrator, iAudioService, accessibilityManager,
                    packageManager, wakefulnessLifecycle, captioningManager, keyguardManager,
                    activityManager, userTracker, dumpManager);
                    packageManager, wakefulnessLifecycle, keyguardManager,
                    activityManager, userTracker, dumpManager, mainHandler);
            mCallbacks = callback;

            ArgumentCaptor<WakefulnessLifecycle.Observer> observerCaptor =