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

Commit 76c8184a authored by Anton Potapov's avatar Anton Potapov Committed by Android (Google) Code Review
Browse files

Merge "Migrate CsdWarning dialog functionality" into main

parents f4c155a1 840dae17
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