Loading packages/SystemUI/multivalentTests/src/com/android/systemui/volume/CsdWarningDialogTest.java +7 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading Loading @@ -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); Loading @@ -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()); Loading packages/SystemUI/src/com/android/systemui/volume/CsdWarningDialog.java +6 −7 Original line number Diff line number Diff line Loading @@ -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}: Loading Loading @@ -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; /** Loading @@ -120,7 +119,7 @@ public class CsdWarningDialog extends SystemUIDialog CsdWarningDialog create( int csdWarning, Runnable onCleanup, Optional<ImmutableList<CsdWarningAction>> actionIntents); Optional<List<CsdWarningAction>> actionIntents); } @AssistedInject Loading @@ -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; Loading Loading @@ -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"); Loading packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +6 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading Loading @@ -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, Loading Loading @@ -2237,7 +2235,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, } public void setCsdWarningNotificationActionIntents( ImmutableList<CsdWarningAction> actionIntent) { List<CsdWarningAction> actionIntent) { mCsdWarningNotificationActions = Optional.of(actionIntent); } Loading packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -104,6 +104,10 @@ public interface VolumeModule { @Binds VolumePanelComponentFactory bindVolumePanelComponentFactory(VolumePanelComponent.Factory impl); @Binds VolumeDialogPluginComponentFactory bindVolumeDialogPluginComponentFactory( VolumeDialogPluginComponent.Factory impl); /** */ @Provides static VolumeDialog provideVolumeDialog( Loading packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt +35 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() { Loading @@ -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
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/CsdWarningDialogTest.java +7 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading Loading @@ -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); Loading @@ -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()); Loading
packages/SystemUI/src/com/android/systemui/volume/CsdWarningDialog.java +6 −7 Original line number Diff line number Diff line Loading @@ -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}: Loading Loading @@ -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; /** Loading @@ -120,7 +119,7 @@ public class CsdWarningDialog extends SystemUIDialog CsdWarningDialog create( int csdWarning, Runnable onCleanup, Optional<ImmutableList<CsdWarningAction>> actionIntents); Optional<List<CsdWarningAction>> actionIntents); } @AssistedInject Loading @@ -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; Loading Loading @@ -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"); Loading
packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +6 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. * Loading Loading @@ -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, Loading Loading @@ -2237,7 +2235,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, } public void setCsdWarningNotificationActionIntents( ImmutableList<CsdWarningAction> actionIntent) { List<CsdWarningAction> actionIntent) { mCsdWarningNotificationActions = Optional.of(actionIntent); } Loading
packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -104,6 +104,10 @@ public interface VolumeModule { @Binds VolumePanelComponentFactory bindVolumePanelComponentFactory(VolumePanelComponent.Factory impl); @Binds VolumeDialogPluginComponentFactory bindVolumeDialogPluginComponentFactory( VolumeDialogPluginComponent.Factory impl); /** */ @Provides static VolumeDialog provideVolumeDialog( Loading
packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt +35 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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() { Loading @@ -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() } } }