Close channel dialog when the guts go away

Also don't open the NotificationInfo panel from the keyguard without
authenticating first.

Test: long press on notification from lockscreen
Test: lock the device while the channel editor dialog is open
Bug: 133182818
Change-Id: I6686b77cf54ed5c1b82596217263a53d9664fc64
This commit is contained in:
Evan Laird
2019-05-31 16:46:48 -04:00
parent 445d7b38e4
commit 03cf35018a
4 changed files with 64 additions and 6 deletions

View File

@@ -86,6 +86,10 @@ class ChannelEditorDialogController @Inject constructor(
internal val groupNameLookup = hashMapOf<String, CharSequence>()
private val channelGroupList = mutableListOf<NotificationChannelGroup>()
/**
* Give the controller all of the information it needs to present the dialog
* for a given app. Does a bunch of querying of NoMan, but won't present anything yet
*/
fun prepareDialogForApp(
appName: String,
packageName: String,
@@ -156,6 +160,13 @@ class ChannelEditorDialogController @Inject constructor(
dialog.show()
}
/**
* Close the dialog without saving. For external callers
*/
fun close() {
done()
}
private fun done() {
resetState()
dialog.dismiss()

View File

@@ -41,12 +41,14 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationLifetimeExtender;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -97,6 +99,8 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
@VisibleForTesting
protected String mKeyToRemoveOnGutsClosed;
private StatusBar mStatusBar;
@Inject
public NotificationGutsManager(
Context context,
@@ -114,6 +118,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
mListContainer = listContainer;
mCheckSaveListener = checkSave;
mOnSettingsClickListener = onSettingsClick;
mStatusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class);
}
public void setNotificationActivityStarter(
@@ -376,6 +381,34 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx
int x,
int y,
NotificationMenuRowPlugin.MenuItem menuItem) {
if (menuItem.getGutsView() instanceof NotificationInfo) {
if (mStatusBarStateController instanceof StatusBarStateControllerImpl) {
((StatusBarStateControllerImpl) mStatusBarStateController)
.setLeaveOpenOnKeyguardHide(true);
}
Runnable r = () -> Dependency.get(Dependency.MAIN_HANDLER).post(
() -> openGutsInternal(view, x, y, menuItem));
mStatusBar.executeRunnableDismissingKeyguard(
r,
null /* cancelAction */,
false /* dismissShade */,
true /* afterKeyguardGone */,
true /* deferred */);
return true;
}
return openGutsInternal(view, x, y, menuItem);
}
@VisibleForTesting
boolean openGutsInternal(
View view,
int x,
int y,
NotificationMenuRowPlugin.MenuItem menuItem) {
if (!(view instanceof ExpandableNotificationRow)) {
return false;
}

View File

@@ -118,6 +118,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private int mStartingChannelImportance;
private boolean mWasShownHighPriority;
private boolean mPressedApply;
private boolean mPresentingChannelEditorDialog = false;
/**
* The last importance level chosen by the user. Null if the user has not chosen an importance
@@ -447,11 +448,15 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
private OnClickListener getTurnOffNotificationsClickListener() {
return ((View view) -> {
if (mChannelEditorDialogController != null) {
if (!mPresentingChannelEditorDialog && mChannelEditorDialogController != null) {
mPresentingChannelEditorDialog = true;
mChannelEditorDialogController.prepareDialogForApp(mAppName, mPackageName, mAppUid,
mUniqueChannelsInRow, mPkgIcon, mOnSettingsClickListener);
mChannelEditorDialogController.setOnFinishListener(
() -> closeControls(this, false));
mChannelEditorDialogController.setOnFinishListener(() -> {
mPresentingChannelEditorDialog = false;
closeControls(this, false);
});
mChannelEditorDialogController.show();
}
});
@@ -772,6 +777,13 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
@Override
public boolean handleCloseControls(boolean save, boolean force) {
if (mPresentingChannelEditorDialog && mChannelEditorDialogController != null) {
mPresentingChannelEditorDialog = false;
// No need for the finish listener because we're closing
mChannelEditorDialogController.setOnFinishListener(null);
mChannelEditorDialogController.close();
}
// Save regardless of the importance so we can lock the importance field if the user wants
// to keep getting notifications
if (save) {

View File

@@ -67,6 +67,7 @@ import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.util.Assert;
@@ -105,6 +106,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
@Mock private NotificationInfo.CheckSaveListener mCheckSaveListener;
@Mock private OnSettingsClickListener mOnSettingsClickListener;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
@Mock private StatusBar mStatusBar;
@Before
public void setUp() {
@@ -115,7 +117,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
mHandler = Handler.createAsync(mTestableLooper.getLooper());
mContext.putComponent(StatusBar.class, mStatusBar);
mHelper = new NotificationTestHelper(mContext);
mGutsManager = new NotificationGutsManager(mContext, mVisualStabilityManager);
@@ -150,7 +152,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
when(row.getWindowToken()).thenReturn(new Binder());
when(row.getGuts()).thenReturn(guts);
assertTrue(mGutsManager.openGuts(row, 0, 0, menuItem));
assertTrue(mGutsManager.openGutsInternal(row, 0, 0, menuItem));
assertEquals(View.INVISIBLE, guts.getVisibility());
mTestableLooper.processAllMessages();
verify(guts).openControls(
@@ -198,7 +200,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase {
when(entry.getRow()).thenReturn(row);
when(entry.getGuts()).thenReturn(guts);
assertTrue(mGutsManager.openGuts(row, 0, 0, menuItem));
assertTrue(mGutsManager.openGutsInternal(row, 0, 0, menuItem));
mTestableLooper.processAllMessages();
verify(guts).openControls(
eq(true),