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:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user