Merge changes I48717c7c,Idc111ccb into rvc-dev

* changes:
  Highlight provided channels
  Only use "apply" when there are changes
This commit is contained in:
Evan Laird
2020-05-01 13:22:29 +00:00
committed by Android (Google) Code Review
11 changed files with 260 additions and 61 deletions

View File

@@ -76,7 +76,6 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager.Keyg
import com.android.systemui.statusbar.notification.NotificationFilter;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.phone.AutoHideController;
@@ -308,7 +307,6 @@ public class Dependency {
@Inject Lazy<PackageManagerWrapper> mPackageManagerWrapper;
@Inject Lazy<SensorPrivacyController> mSensorPrivacyController;
@Inject Lazy<DockManager> mDockManager;
@Inject Lazy<ChannelEditorDialogController> mChannelEditorDialogController;
@Inject Lazy<INotificationManager> mINotificationManager;
@Inject Lazy<SysUiState> mSysUiStateFlagsContainer;
@Inject Lazy<AlarmManager> mAlarmManager;
@@ -498,7 +496,6 @@ public class Dependency {
mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get);
mProviders.put(SensorPrivacyController.class, mSensorPrivacyController::get);
mProviders.put(DockManager.class, mDockManager::get);
mProviders.put(ChannelEditorDialogController.class, mChannelEditorDialogController::get);
mProviders.put(INotificationManager.class, mINotificationManager::get);
mProviders.put(SysUiState.class, mSysUiStateFlagsContainer::get);
mProviders.put(AlarmManager.class, mAlarmManager::get);

View File

@@ -49,6 +49,7 @@ import com.android.systemui.statusbar.notification.interruption.NotificationInte
import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger;
import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController;
import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController;
@@ -109,6 +110,7 @@ public interface NotificationsModule {
INotificationManager notificationManager,
LauncherApps launcherApps,
ShortcutManager shortcutManager,
ChannelEditorDialogController channelEditorDialogController,
CurrentUserContextTracker contextTracker,
Provider<PriorityOnboardingDialogController.Builder> builderProvider) {
return new NotificationGutsManager(
@@ -121,6 +123,7 @@ public interface NotificationsModule {
notificationManager,
launcherApps,
shortcutManager,
channelEditorDialogController,
contextTracker,
builderProvider);
}

View File

@@ -22,8 +22,8 @@ import android.app.NotificationChannel
import android.app.NotificationChannel.DEFAULT_CHANNEL_ID
import android.app.NotificationChannelGroup
import android.app.NotificationManager.IMPORTANCE_NONE
import android.app.NotificationManager.Importance
import android.content.Context
import android.content.DialogInterface
import android.graphics.Color
import android.graphics.PixelFormat
import android.graphics.drawable.ColorDrawable
@@ -37,8 +37,10 @@ import android.view.Window
import android.view.WindowInsets.Type.statusBars
import android.view.WindowManager
import android.widget.TextView
import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.R
import javax.inject.Inject
import javax.inject.Singleton
@@ -59,11 +61,13 @@ private const val TAG = "ChannelDialogController"
@Singleton
class ChannelEditorDialogController @Inject constructor(
c: Context,
private val noMan: INotificationManager
private val noMan: INotificationManager,
private val dialogBuilder: ChannelEditorDialog.Builder
) {
val context: Context = c.applicationContext
lateinit var dialog: Dialog
private var prepared = false
private lateinit var dialog: ChannelEditorDialog
private var appIcon: Drawable? = null
private var appUid: Int? = null
@@ -74,13 +78,16 @@ class ChannelEditorDialogController @Inject constructor(
// Caller should set this if they care about when we dismiss
var onFinishListener: OnChannelEditorDialogFinishedListener? = null
// Channels handed to us from NotificationInfo
@VisibleForTesting
internal val providedChannels = mutableListOf<NotificationChannel>()
internal val paddedChannels = mutableListOf<NotificationChannel>()
// Channels handed to us from NotificationInfo
private val providedChannels = mutableListOf<NotificationChannel>()
// Map from NotificationChannel to importance
private val edits = mutableMapOf<NotificationChannel, Int>()
var appNotificationsEnabled = true
private var appNotificationsEnabled = true
// System settings for app notifications
private var appNotificationsCurrentlyEnabled: Boolean? = null
// Keep a mapping of NotificationChannel.getGroup() to the actual group name for display
@VisibleForTesting
@@ -106,10 +113,18 @@ class ChannelEditorDialogController @Inject constructor(
this.appNotificationsEnabled = checkAreAppNotificationsOn()
this.onSettingsClickListener = onSettingsClickListener
// These will always start out the same
appNotificationsCurrentlyEnabled = appNotificationsEnabled
channelGroupList.clear()
channelGroupList.addAll(fetchNotificationChannelGroups())
buildGroupNameLookup()
providedChannels.clear()
providedChannels.addAll(channels)
padToFourChannels(channels)
initDialog()
prepared = true
}
private fun buildGroupNameLookup() {
@@ -121,21 +136,21 @@ class ChannelEditorDialogController @Inject constructor(
}
private fun padToFourChannels(channels: Set<NotificationChannel>) {
providedChannels.clear()
paddedChannels.clear()
// First, add all of the given channels
providedChannels.addAll(channels.asSequence().take(4))
paddedChannels.addAll(channels.asSequence().take(4))
// Then pad to 4 if we haven't been given that many
providedChannels.addAll(getDisplayableChannels(channelGroupList.asSequence())
.filterNot { providedChannels.contains(it) }
paddedChannels.addAll(getDisplayableChannels(channelGroupList.asSequence())
.filterNot { paddedChannels.contains(it) }
.distinct()
.take(4 - providedChannels.size))
.take(4 - paddedChannels.size))
// If we only got one channel and it has the default miscellaneous tag, then we actually
// are looking at an app with a targetSdk <= O, and it doesn't make much sense to show the
// channel
if (providedChannels.size == 1 && DEFAULT_CHANNEL_ID == providedChannels[0].id) {
providedChannels.clear()
if (paddedChannels.size == 1 && DEFAULT_CHANNEL_ID == paddedChannels[0].id) {
paddedChannels.clear()
}
}
@@ -157,7 +172,9 @@ class ChannelEditorDialogController @Inject constructor(
}
fun show() {
initDialog()
if (!prepared) {
throw IllegalStateException("Must call prepareDialogForApp() before calling show()")
}
dialog.show()
}
@@ -178,8 +195,10 @@ class ChannelEditorDialogController @Inject constructor(
appUid = null
packageName = null
appName = null
appNotificationsCurrentlyEnabled = null
edits.clear()
paddedChannels.clear()
providedChannels.clear()
groupNameLookup.clear()
}
@@ -188,12 +207,27 @@ class ChannelEditorDialogController @Inject constructor(
return groupNameLookup[groupId] ?: ""
}
fun proposeEditForChannel(channel: NotificationChannel, edit: Int) {
fun proposeEditForChannel(channel: NotificationChannel, @Importance edit: Int) {
if (channel.importance == edit) {
edits.remove(channel)
} else {
edits[channel] = edit
}
dialog.updateDoneButtonText(hasChanges())
}
fun proposeSetAppNotificationsEnabled(enabled: Boolean) {
appNotificationsEnabled = enabled
dialog.updateDoneButtonText(hasChanges())
}
fun areAppNotificationsEnabled(): Boolean {
return appNotificationsEnabled
}
private fun hasChanges(): Boolean {
return edits.isNotEmpty() || (appNotificationsEnabled != appNotificationsCurrentlyEnabled)
}
@Suppress("unchecked_cast")
@@ -241,7 +275,7 @@ class ChannelEditorDialogController @Inject constructor(
}
}
if (appNotificationsEnabled != checkAreAppNotificationsOn()) {
if (appNotificationsEnabled != appNotificationsCurrentlyEnabled) {
applyAppNotificationsOn(appNotificationsEnabled)
}
}
@@ -252,7 +286,8 @@ class ChannelEditorDialogController @Inject constructor(
}
private fun initDialog() {
dialog = Dialog(context)
dialogBuilder.setContext(context)
dialog = dialogBuilder.build()
dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
// Prevent a11y readers from reading the first element in the dialog twice
@@ -260,16 +295,21 @@ class ChannelEditorDialogController @Inject constructor(
dialog.apply {
setContentView(R.layout.notif_half_shelf)
setCanceledOnTouchOutside(true)
setOnDismissListener(object : DialogInterface.OnDismissListener {
override fun onDismiss(dialog: DialogInterface?) {
onFinishListener?.onChannelEditorDialogFinished()
}
})
findViewById<ChannelEditorListView>(R.id.half_shelf_container).apply {
setOnDismissListener { onFinishListener?.onChannelEditorDialogFinished() }
val listView = findViewById<ChannelEditorListView>(R.id.half_shelf_container)
listView?.apply {
controller = this@ChannelEditorDialogController
appIcon = this@ChannelEditorDialogController.appIcon
appName = this@ChannelEditorDialogController.appName
channels = providedChannels
channels = paddedChannels
}
setOnShowListener {
// play a highlight animation for the given channels
for (channel in providedChannels) {
listView?.highlightChannel(channel)
}
}
findViewById<TextView>(R.id.done_button)?.setOnClickListener {
@@ -306,6 +346,28 @@ class ChannelEditorDialogController @Inject constructor(
or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
}
class ChannelEditorDialog(context: Context) : Dialog(context) {
fun updateDoneButtonText(hasChanges: Boolean) {
findViewById<TextView>(R.id.done_button)?.setText(
if (hasChanges)
R.string.inline_ok_button
else
R.string.inline_done_button)
}
class Builder @Inject constructor() {
private lateinit var context: Context
fun setContext(context: Context): Builder {
this.context = context
return this
}
fun build(): ChannelEditorDialog {
return ChannelEditorDialog(context)
}
}
}
interface OnChannelEditorDialogFinishedListener {
fun onChannelEditorDialogFinished()
}

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification.row
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.app.NotificationChannel
import android.app.NotificationManager.IMPORTANCE_DEFAULT
import android.app.NotificationManager.IMPORTANCE_NONE
@@ -33,8 +35,10 @@ import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Switch
import android.widget.TextView
import com.android.settingslib.Utils
import com.android.systemui.R
import com.android.systemui.util.Assert
/**
* Half-shelf for notification channel controls
@@ -51,6 +55,7 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a
// The first row is for the entire app
private lateinit var appControlRow: AppControlView
private val channelRows = mutableListOf<ChannelRow>()
override fun onFinishInflate() {
super.onFinishInflate()
@@ -58,8 +63,21 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a
appControlRow = findViewById(R.id.app_control)
}
/**
* Play a highlight animation for the given channel (it really should exist but this will just
* fail silently if it doesn't)
*/
fun highlightChannel(channel: NotificationChannel) {
Assert.isMainThread()
for (row in channelRows) {
if (row.channel == channel) {
row.playHighlight()
}
}
}
private fun updateRows() {
val enabled = controller.appNotificationsEnabled
val enabled = controller.areAppNotificationsEnabled()
val transition = AutoTransition()
transition.duration = 200
@@ -83,13 +101,10 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a
TransitionManager.beginDelayedTransition(this, transition)
// Remove any rows
val n = childCount
for (i in n.downTo(0)) {
val child = getChildAt(i)
if (child is ChannelRow) {
removeView(child)
}
for (row in channelRows) {
removeView(row)
}
channelRows.clear()
updateAppControlRow(enabled)
@@ -105,6 +120,8 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a
val row = inflater.inflate(R.layout.notif_half_shelf_row, null) as ChannelRow
row.controller = controller
row.channel = channel
channelRows.add(row)
addView(row)
}
@@ -114,7 +131,7 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a
.getString(R.string.notification_channel_dialog_title, appName)
appControlRow.switch.isChecked = enabled
appControlRow.switch.setOnCheckedChangeListener { _, b ->
controller.appNotificationsEnabled = b
controller.proposeSetAppNotificationsEnabled(b)
updateRows()
}
}
@@ -140,8 +157,14 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) {
private lateinit var channelName: TextView
private lateinit var channelDescription: TextView
private lateinit var switch: Switch
private val highlightColor: Int
var gentle = false
init {
highlightColor = Utils.getColorAttrDefaultColor(
context, android.R.attr.colorControlHighlight)
}
var channel: NotificationChannel? = null
set(newValue) {
field = newValue
@@ -150,6 +173,7 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) {
}
override fun onFinishInflate() {
super.onFinishInflate()
channelName = findViewById(R.id.channel_name)
channelDescription = findViewById(R.id.channel_description)
switch = findViewById(R.id.toggle)
@@ -161,6 +185,22 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) {
setOnClickListener { switch.toggle() }
}
/**
* Play an animation that highlights this row
*/
fun playHighlight() {
// Use 0 for the start value because our background is given to us by our parent
val fadeInLoop = ValueAnimator.ofObject(ArgbEvaluator(), 0, highlightColor)
fadeInLoop.duration = 200L
fadeInLoop.addUpdateListener { animator ->
setBackgroundColor(animator.animatedValue as Int)
}
fadeInLoop.repeatMode = ValueAnimator.REVERSE
// Repeat an odd number of times to we end up normal
fadeInLoop.repeatCount = 5
fadeInLoop.start()
}
private fun updateViews() {
val nc = channel ?: return

View File

@@ -87,6 +87,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
private final VisualStabilityManager mVisualStabilityManager;
private final AccessibilityManager mAccessibilityManager;
private final HighPriorityProvider mHighPriorityProvider;
private final ChannelEditorDialogController mChannelEditorDialogController;
// Dependencies:
private final NotificationLockscreenUserManager mLockscreenUserManager =
@@ -127,6 +128,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
INotificationManager notificationManager,
LauncherApps launcherApps,
ShortcutManager shortcutManager,
ChannelEditorDialogController channelEditorDialogController,
CurrentUserContextTracker contextTracker,
Provider<PriorityOnboardingDialogController.Builder> builderProvider) {
mContext = context;
@@ -140,6 +142,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
mShortcutManager = shortcutManager;
mContextTracker = contextTracker;
mBuilderProvider = builderProvider;
mChannelEditorDialogController = channelEditorDialogController;
}
public void setUpWithPresenter(NotificationPresenter presenter,
@@ -348,6 +351,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
pmUser,
mNotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
packageName,
row.getEntry().getChannel(),
row.getUniqueChannels(),
@@ -390,6 +394,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
notificationInfoView.bindNotification(
pmUser,
mNotificationManager,
mChannelEditorDialogController,
packageName,
row.getEntry().getChannel(),
row.getUniqueChannels(),

View File

@@ -174,6 +174,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
PackageManager pm,
INotificationManager iNotificationManager,
VisualStabilityManager visualStabilityManager,
ChannelEditorDialogController channelEditorDialogController,
String pkg,
NotificationChannel notificationChannel,
Set<NotificationChannel> uniqueChannelsInRow,
@@ -187,7 +188,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
mINotificationManager = iNotificationManager;
mMetricsLogger = Dependency.get(MetricsLogger.class);
mVisualStabilityManager = visualStabilityManager;
mChannelEditorDialogController = Dependency.get(ChannelEditorDialogController.class);
mChannelEditorDialogController = channelEditorDialogController;
mPackageName = pkg;
mUniqueChannelsInRow = uniqueChannelsInRow;
mNumUniqueChannelsInRow = uniqueChannelsInRow.size();

View File

@@ -17,10 +17,6 @@
package com.android.systemui.statusbar.notification.row;
import static android.app.Notification.EXTRA_IS_GROUP_CONVERSATION;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN;
import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -39,10 +35,6 @@ import android.os.Parcelable;
import android.os.RemoteException;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.transition.ChangeBounds;
import android.transition.Fade;
import android.transition.TransitionManager;
import android.transition.TransitionSet;
import android.util.AttributeSet;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
@@ -51,7 +43,6 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -108,6 +99,7 @@ public class PartialConversationInfo extends LinearLayout implements
public void bindNotification(
PackageManager pm,
INotificationManager iNotificationManager,
ChannelEditorDialogController channelEditorDialogController,
String pkg,
NotificationChannel notificationChannel,
Set<NotificationChannel> uniqueChannelsInRow,
@@ -127,7 +119,7 @@ public class PartialConversationInfo extends LinearLayout implements
mDelegatePkg = mSbn.getOpPkg();
mIsDeviceProvisioned = isDeviceProvisioned;
mIsNonBlockable = isNonBlockable;
mChannelEditorDialogController = Dependency.get(ChannelEditorDialogController.class);
mChannelEditorDialogController = channelEditorDialogController;
mUniqueChannelsInRow = uniqueChannelsInRow;
bindHeader();

View File

@@ -36,12 +36,14 @@ import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.runner.RunWith
import org.junit.Test
import org.mockito.Answers
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
@SmallTest
@@ -59,11 +61,16 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
@Mock
private lateinit var mockNoMan: INotificationManager
@Mock(answer = Answers.RETURNS_SELF)
private lateinit var dialogBuilder: ChannelEditorDialog.Builder
@Mock
private lateinit var dialog: ChannelEditorDialog
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
controller = ChannelEditorDialogController(mContext, mockNoMan)
`when`(dialogBuilder.build()).thenReturn(dialog)
controller = ChannelEditorDialogController(mContext, mockNoMan, dialogBuilder)
channel1 = NotificationChannel(TEST_CHANNEL, TEST_CHANNEL_NAME, IMPORTANCE_DEFAULT)
channel2 = NotificationChannel(TEST_CHANNEL2, TEST_CHANNEL_NAME2, IMPORTANCE_DEFAULT)
@@ -86,7 +93,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, clickListener)
assertEquals(2, controller.providedChannels.size)
assertEquals(2, controller.paddedChannels.size)
}
@Test
@@ -97,7 +104,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
setOf(channelDefault), appIcon, clickListener)
assertEquals("No channels should be shown when there is only the miscellaneous channel",
0, controller.providedChannels.size)
0, controller.paddedChannels.size)
}
@Test
@@ -119,7 +126,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
setOf(channel1), appIcon, clickListener)
assertEquals("ChannelEditorDialog should fetch enough channels to show 4",
4, controller.providedChannels.size)
4, controller.paddedChannels.size)
}
@Test
@@ -147,7 +154,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, clickListener)
controller.appNotificationsEnabled = false
controller.proposeSetAppNotificationsEnabled(false)
controller.apply()
verify(mockNoMan, times(1)).setNotificationsEnabledForPackage(
@@ -162,7 +169,7 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, clickListener)
controller.appNotificationsEnabled = true
controller.proposeSetAppNotificationsEnabled(true)
controller.apply()
verify(mockNoMan, times(1)).setNotificationsEnabledForPackage(
@@ -171,12 +178,52 @@ class ChannelEditorDialogControllerTest : SysuiTestCase() {
@Test
fun testSettingsClickListenerNull_noCrash() {
// GIVEN editor dialog
group.channels = listOf(channel1, channel2)
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, null)
// WHEN user taps settings
// Pass in any old view, it should never actually be used
controller.launchSettings(View(context))
// THEN no crash
}
@Test
fun testDoneButtonSaysDone_noChanges() {
// GIVEN the editor dialog with no changes
`when`(dialogBuilder.build()).thenReturn(dialog)
group.channels = listOf(channel1, channel2)
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, null)
// WHEN the user proposes a change
controller.proposeEditForChannel(channel1, IMPORTANCE_NONE)
// THEN the "done" button has been updated to "apply"
verify(dialog).updateDoneButtonText(true /* hasChanges */)
}
@Test
fun testDoneButtonGoesBackToNormal_changeThenNoChange() {
val inOrderDialog = Mockito.inOrder(dialog)
// GIVEN the editor dialog with no changes
`when`(dialogBuilder.build()).thenReturn(dialog)
group.channels = listOf(channel1, channel2)
controller.prepareDialogForApp(TEST_APP_NAME, TEST_PACKAGE_NAME, TEST_UID,
setOf(channel1, channel2), appIcon, null)
// WHEN the user proposes a change
controller.proposeEditForChannel(channel1, IMPORTANCE_NONE)
// and WHEN the user sets the importance back to its original value
controller.proposeEditForChannel(channel1, channel1.importance)
// THEN the "done" button has been changed back to done
inOrderDialog.verify(dialog, times(1)).updateDoneButtonText(eq(true))
inOrderDialog.verify(dialog, times(1)).updateDoneButtonText(eq(false))
}
private val clickListener = object : NotificationInfo.OnSettingsClickListener {

View File

@@ -123,6 +123,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
@Mock private INotificationManager mINotificationManager;
@Mock private LauncherApps mLauncherApps;
@Mock private ShortcutManager mShortcutManager;
@Mock private ChannelEditorDialogController mChannelEditorDialogController;
@Mock private PeopleNotificationIdentifier mPeopleNotificationIdentifier;
@Mock private CurrentUserContextTracker mContextTracker;
@Mock(answer = Answers.RETURNS_SELF)
@@ -144,7 +145,8 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
mGutsManager = new NotificationGutsManager(mContext, mVisualStabilityManager,
() -> mStatusBar, mHandler, mAccessibilityManager, mHighPriorityProvider,
mINotificationManager, mLauncherApps, mShortcutManager, mContextTracker, mProvider);
mINotificationManager, mLauncherApps, mShortcutManager,
mChannelEditorDialogController, mContextTracker, mProvider);
mGutsManager.setUpWithPresenter(mPresenter, mStackScroller,
mCheckSaveListener, mOnSettingsClickListener);
mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter);
@@ -350,6 +352,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
any(PackageManager.class),
any(INotificationManager.class),
eq(mVisualStabilityManager),
eq(mChannelEditorDialogController),
eq(statusBarNotification.getPackageName()),
any(NotificationChannel.class),
anySet(),
@@ -381,6 +384,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
any(PackageManager.class),
any(INotificationManager.class),
eq(mVisualStabilityManager),
eq(mChannelEditorDialogController),
eq(statusBarNotification.getPackageName()),
any(NotificationChannel.class),
anySet(),
@@ -410,6 +414,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
any(PackageManager.class),
any(INotificationManager.class),
eq(mVisualStabilityManager),
eq(mChannelEditorDialogController),
eq(statusBarNotification.getPackageName()),
any(NotificationChannel.class),
anySet(),

View File

@@ -30,17 +30,13 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -53,13 +49,11 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.IBinder;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.PollingCheck;
import android.testing.TestableLooper;
import android.testing.UiThreadTest;
import android.view.LayoutInflater;
@@ -68,7 +62,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -120,6 +113,8 @@ public class NotificationInfoTest extends SysuiTestCase {
private PackageManager mMockPackageManager;
@Mock
private VisualStabilityManager mVisualStabilityManager;
@Mock
private ChannelEditorDialogController mChannelEditorDialogController;
@Before
public void setUp() throws Exception {
@@ -185,6 +180,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -208,6 +204,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -227,6 +224,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -257,6 +255,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -277,6 +276,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -304,6 +304,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -326,6 +327,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -345,6 +347,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mDefaultNotificationChannel,
mDefaultNotificationChannelSet,
@@ -368,6 +371,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mDefaultNotificationChannel,
mDefaultNotificationChannelSet,
@@ -387,6 +391,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -407,6 +412,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -432,6 +438,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -452,6 +459,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -473,6 +481,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -486,6 +495,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -506,6 +516,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME, mNotificationChannel,
createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT),
mEntry,
@@ -531,6 +542,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT),
@@ -552,6 +564,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
createMultipleChannelSet(MULTIPLE_CHANNEL_COUNT),
@@ -573,6 +586,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -596,6 +610,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -614,6 +629,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -632,6 +648,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -653,6 +670,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -677,6 +695,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -701,6 +720,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -726,6 +746,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -751,6 +772,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -782,6 +804,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -814,6 +837,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -846,6 +870,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -881,6 +906,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -915,6 +941,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -940,6 +967,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -968,6 +996,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -999,6 +1028,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -1025,6 +1055,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -1056,6 +1087,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -1080,6 +1112,7 @@ public class NotificationInfoTest extends SysuiTestCase {
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,

View File

@@ -98,6 +98,8 @@ public class PartialConversationInfoTest extends SysuiTestCase {
private INotificationManager mMockINotificationManager;
@Mock
private PackageManager mMockPackageManager;
@Mock
private ChannelEditorDialogController mChannelEditorDialogController;
@Mock
private Icon mIcon;
@@ -160,6 +162,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -181,6 +184,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -207,6 +211,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -223,6 +228,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -250,6 +256,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -267,6 +274,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -291,6 +299,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -310,6 +319,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -327,6 +337,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -349,6 +360,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -365,6 +377,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,
@@ -383,6 +396,7 @@ public class PartialConversationInfoTest extends SysuiTestCase {
mInfo.bindNotification(
mMockPackageManager,
mMockINotificationManager,
mChannelEditorDialogController,
TEST_PACKAGE_NAME,
mNotificationChannel,
mNotificationChannelSet,