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

Commit 840dae17 authored by Anton Potapov's avatar Anton Potapov
Browse files

Migrate CsdWarning dialog functionality

Flag: com.android.systemui.volume_redesign
Bug: 369993959
Test: manual on phone.
Change-Id: I23d99cd470a7763d1940c3bcf3fc4c7bbacc9121
parent 7acbff03
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -18,16 +18,13 @@ package com.android.systemui.volume;

import static android.media.AudioManager.CSD_WARNING_DOSE_REACHED_1X;
import static android.media.AudioManager.CSD_WARNING_DOSE_REPEATED_5X;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


import android.app.Notification;
import android.app.NotificationManager;
import android.content.Intent;
@@ -48,13 +45,12 @@ import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;

import com.google.common.collect.ImmutableList;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

@@ -69,8 +65,8 @@ public class CsdWarningDialogTest extends SysuiTestCase {
    private CsdWarningDialog mDialog;
    private static final String DISMISS_CSD_NOTIFICATION =
            "com.android.systemui.volume.DISMISS_CSD_NOTIFICATION";
    private final Optional<ImmutableList<CsdWarningAction>> mEmptyActions =
            Optional.of(ImmutableList.of());
    private final Optional<List<CsdWarningAction>> mEmptyActions =
            Optional.of(Collections.emptyList());

    @Before
    public void setup() {
@@ -122,7 +118,7 @@ public class CsdWarningDialogTest extends SysuiTestCase {
                .setPackage(mContext.getPackageName());
        mDialog = new CsdWarningDialog(CSD_WARNING_DOSE_REPEATED_5X, mContext,
                mAudioManager, mNotificationManager, executor, null,
                Optional.of(ImmutableList.of(new CsdWarningAction("Undo", undoIntent, false))),
                Optional.of(List.of(new CsdWarningAction("Undo", undoIntent, false))),
                mFakeBroadcastDispatcher);

        when(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)).thenReturn(25);
@@ -149,7 +145,7 @@ public class CsdWarningDialogTest extends SysuiTestCase {
                .setPackage(mContext.getPackageName());
        mDialog = new CsdWarningDialog(CSD_WARNING_DOSE_REPEATED_5X, mContext,
                mAudioManager, mNotificationManager, executor, null,
                Optional.of(ImmutableList.of(new CsdWarningAction("Undo", undoIntent, false))),
                Optional.of(List.of(new CsdWarningAction("Undo", undoIntent, false))),
                mFakeBroadcastDispatcher);
        Intent dismissIntent = new Intent(DISMISS_CSD_NOTIFICATION)
                .setPackage(mContext.getPackageName());
+6 −7
Original line number Diff line number Diff line
@@ -46,14 +46,13 @@ import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.util.NotificationChannels;
import com.android.systemui.util.concurrency.DelayableExecutor;

import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.Optional;

import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;

import java.util.Optional;

/**
 * A class that implements the three Computed Sound Dose-related warnings defined in
 * {@link AudioManager}:
@@ -108,7 +107,7 @@ public class CsdWarningDialog extends SystemUIDialog
    private long mShowTime;

    @VisibleForTesting public int mCachedMediaStreamVolume;
    private Optional<ImmutableList<CsdWarningAction>> mActionIntents;
    private Optional<List<CsdWarningAction>> mActionIntents;
    private final BroadcastDispatcher mBroadcastDispatcher;

    /**
@@ -120,7 +119,7 @@ public class CsdWarningDialog extends SystemUIDialog
        CsdWarningDialog create(
                int csdWarning,
                Runnable onCleanup,
                Optional<ImmutableList<CsdWarningAction>> actionIntents);
                Optional<List<CsdWarningAction>> actionIntents);
    }

    @AssistedInject
@@ -131,7 +130,7 @@ public class CsdWarningDialog extends SystemUIDialog
            NotificationManager notificationManager,
            @Background DelayableExecutor delayableExecutor,
            @Assisted Runnable onCleanup,
            @Assisted Optional<ImmutableList<CsdWarningAction>> actionIntents,
            @Assisted Optional<List<CsdWarningAction>> actionIntents,
            BroadcastDispatcher broadcastDispatcher) {
        super(context);
        mCsdWarning = csdWarning;
@@ -350,7 +349,7 @@ public class CsdWarningDialog extends SystemUIDialog
        if (Flags.sounddoseCustomization()
                && mActionIntents.isPresent()
                && !mActionIntents.get().isEmpty()) {
            ImmutableList<CsdWarningAction> actionIntentsList = mActionIntents.get();
            List<CsdWarningAction> actionIntentsList = mActionIntents.get();
            for (CsdWarningAction action : actionIntentsList) {
                if (action.getLabel() == null || action.getIntent() == null) {
                    Log.w(TAG, "Null action intent received. Skipping addition to notification");
+6 −8
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import static android.view.View.INVISIBLE;
import static android.view.View.LAYOUT_DIRECTION_RTL;
import static android.view.View.VISIBLE;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;

import static com.android.internal.jank.InteractionJankMonitor.CUJ_VOLUME_CONTROL;
import static com.android.internal.jank.InteractionJankMonitor.Configuration.Builder;
import static com.android.settingslib.flags.Flags.audioSharingDeveloperOption;
@@ -144,18 +143,17 @@ import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor;
import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag;
import com.android.systemui.volume.ui.navigation.VolumeNavigator;

import com.google.android.msdl.domain.MSDLPlayer;
import com.google.common.collect.ImmutableList;

import dagger.Lazy;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;

import dagger.Lazy;

/**
 * Visual presentation of the volume dialog.
 *
@@ -326,8 +324,8 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
    private final VolumePanelFlag mVolumePanelFlag;
    private final VolumeDialogInteractor mInteractor;
    // Optional actions for soundDose
    private Optional<ImmutableList<CsdWarningAction>>
            mCsdWarningNotificationActions = Optional.of(ImmutableList.of());
    private Optional<List<CsdWarningAction>>
            mCsdWarningNotificationActions = Optional.of(Collections.emptyList());

    public VolumeDialogImpl(
            Context context,
@@ -2237,7 +2235,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
    }

    public void setCsdWarningNotificationActionIntents(
            ImmutableList<CsdWarningAction> actionIntent) {
            List<CsdWarningAction> actionIntent) {
        mCsdWarningNotificationActions = Optional.of(actionIntent);
    }

+5 −1
Original line number Diff line number Diff line
@@ -43,13 +43,13 @@ import com.android.systemui.volume.VolumePanelDialogReceiver;
import com.android.systemui.volume.VolumeUI;
import com.android.systemui.volume.dialog.VolumeDialogPlugin;
import com.android.systemui.volume.dialog.dagger.VolumeDialogPluginComponent;
import com.android.systemui.volume.dialog.dagger.factory.VolumeDialogPluginComponentFactory;
import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor;
import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor;
import com.android.systemui.volume.panel.dagger.VolumePanelComponent;
import com.android.systemui.volume.panel.dagger.factory.VolumePanelComponentFactory;
import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag;
import com.android.systemui.volume.ui.navigation.VolumeNavigator;

import com.google.android.msdl.domain.MSDLPlayer;

import dagger.Binds;
@@ -104,6 +104,10 @@ public interface VolumeModule {
    @Binds
    VolumePanelComponentFactory bindVolumePanelComponentFactory(VolumePanelComponent.Factory impl);

    @Binds
    VolumeDialogPluginComponentFactory bindVolumeDialogPluginComponentFactory(
            VolumeDialogPluginComponent.Factory impl);

    /**  */
    @Provides
    static VolumeDialog provideVolumeDialog(
+35 −1
Original line number Diff line number Diff line
@@ -22,9 +22,13 @@ import com.android.app.tracing.coroutines.coroutineScopeTraced
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.VolumeDialog
import com.android.systemui.volume.CsdWarningAction
import com.android.systemui.volume.CsdWarningDialog
import com.android.systemui.volume.SafetyWarningDialog
import com.android.systemui.volume.dialog.dagger.VolumeDialogPluginComponent
import com.android.systemui.volume.dialog.dagger.factory.VolumeDialogPluginComponentFactory
import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogPluginViewModel
import java.util.Optional
import javax.inject.Inject
import kotlin.coroutines.resume
import kotlinx.coroutines.CoroutineScope
@@ -39,7 +43,8 @@ constructor(
    @Application private val applicationCoroutineScope: CoroutineScope,
    private val context: Context,
    private val audioManager: AudioManager,
    private val volumeDialogPluginComponentFactory: VolumeDialogPluginComponent.Factory,
    private val volumeDialogPluginComponentFactory: VolumeDialogPluginComponentFactory,
    private val csdWarningDialogFactory: CsdWarningDialog.Factory,
) : VolumeDialog {

    private var job: Job? = null
@@ -67,6 +72,16 @@ constructor(
                }
            }
            .launchIn(this)

        viewModel.csdWarning
            .mapLatest { csdWarning ->
                if (csdWarning != null) {
                    showCsdWarningDialog(csdWarning, viewModel.csdWarningConfigModel.actions) {
                        viewModel.onCsdWarningDismissed()
                    }
                }
            }
            .launchIn(this)
    }

    override fun destroy() {
@@ -86,4 +101,23 @@ constructor(
            dialog.show()
            continuation.invokeOnCancellation { dialog.dismiss() }
        }

    private suspend fun showCsdWarningDialog(
        warning: Int,
        actions: List<CsdWarningAction>,
        onDismissed: () -> Unit,
    ) = suspendCancellableCoroutine { continuation ->
        val dialog =
            csdWarningDialogFactory.create(
                warning,
                {
                    onDismissed()
                    continuation.resume(Unit)
                },
                Optional.of(actions),
            )

        dialog.show()
        continuation.invokeOnCancellation { dialog.dismiss() }
    }
}
Loading