From 84dc96bea2392bd4e5080119d0edd48fc87ed2ff Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 14 Nov 2017 09:51:01 -0500 Subject: Provide more information to the assistant About user interactions with notifications. Bug: 63095540 Test: runtest systemui, manual Change-Id: I58cd45333cd084adbf2505c348d6b4e208959135 --- .../statusbar/NotificationGutsManager.java | 11 +++++++++- .../systemui/statusbar/phone/StatusBar.java | 24 +++++++++++++++++++--- .../notification/NotificationManagerService.java | 2 +- .../NotificationManagerServiceTest.java | 15 ++++++++++++-- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java index b585bdff292e..f451fda6235e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java @@ -37,6 +37,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.Interpolators; @@ -75,17 +76,20 @@ public class NotificationGutsManager implements Dumpable { private NotificationGuts mNotificationGutsExposed; private NotificationMenuRowPlugin.MenuItem mGutsMenuItem; private final NotificationInfo.CheckSaveListener mCheckSaveListener; + private final OnSettingsClickListener mOnSettingsClickListener; private String mKeyToRemoveOnGutsClosed; public NotificationGutsManager( NotificationPresenter presenter, NotificationStackScrollLayout stackScroller, NotificationInfo.CheckSaveListener checkSaveListener, - Context context) { + Context context, + OnSettingsClickListener onSettingsClickListener) { mPresenter = presenter; mStackScroller = stackScroller; mCheckSaveListener = checkSaveListener; mContext = context; + mOnSettingsClickListener = onSettingsClickListener; Resources res = context.getResources(); mNonBlockablePkgs = new HashSet<>(); @@ -189,6 +193,7 @@ public class NotificationGutsManager implements Dumpable { onSettingsClick = (View v, NotificationChannel channel, int appUid) -> { mMetricsLogger.action(MetricsProto.MetricsEvent.ACTION_NOTE_INFO); guts.resetFalsingCheck(); + mOnSettingsClickListener.onClick(sbn.getKey()); startAppNotificationSettingsActivity(pkg, appUid, channel); }; } @@ -352,4 +357,8 @@ public class NotificationGutsManager implements Dumpable { pw.print("mKeyToRemoveOnGutsClosed: "); pw.println(mKeyToRemoveOnGutsClosed); } + + public interface OnSettingsClickListener { + void onClick(String key); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 6775615923d0..1bbb94a6532c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -43,6 +43,7 @@ import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.KeyguardManager; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.RemoteInput; @@ -919,7 +920,14 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel = mStatusBarWindow.findViewById(R.id.notification_panel); mStackScroller = mStatusBarWindow.findViewById(R.id.notification_stack_scroller); mGutsManager = new NotificationGutsManager(this, mStackScroller, - mCheckSaveListener, mContext); + mCheckSaveListener, mContext, + key -> { + try { + mBarService.onNotificationSettingsViewed(key); + } catch (RemoteException e) { + // if we're here we're dead + } + }); mNotificationPanel.setStatusBar(this); mNotificationPanel.setGroupManager(mGroupManager); mAboveShelfObserver = new AboveShelfObserver(mStackScroller); @@ -1470,6 +1478,11 @@ public class StatusBar extends SystemUI implements DemoMode, } }, REMOTE_INPUT_KEPT_ENTRY_AUTO_CANCEL_DELAY); } + try { + mBarService.onNotificationDirectReplied(entry.key); + } catch (RemoteException e) { + // system process is dead if we're here. + } } }); @@ -1785,9 +1798,14 @@ public class StatusBar extends SystemUI implements DemoMode, final int id = n.getId(); final int userId = n.getUserId(); try { - // TODO: record actual dismissal surface + int dismissalSurface = NotificationStats.DISMISSAL_SHADE; + if (isHeadsUp(n.getKey())) { + dismissalSurface = NotificationStats.DISMISSAL_PEEK; + } else if (mStackScroller.hasPulsingNotifications()) { + dismissalSurface = NotificationStats.DISMISSAL_AOD; + } mBarService.onNotificationClear(pkg, tag, id, userId, n.getKey(), - NotificationStats.DISMISSAL_OTHER); + dismissalSurface); if (FORCE_REMOTE_INPUT_HISTORY && mKeysKeptForRemoteInput.contains(n.getKey())) { mKeysKeptForRemoteInput.remove(n.getKey()); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 557ba427e0f6..1372f2becafb 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -766,7 +766,7 @@ public class NotificationManagerService extends SystemService { .setType(expanded ? MetricsEvent.TYPE_DETAIL : MetricsEvent.TYPE_COLLAPSE)); } - if (expanded) { + if (expanded && userAction) { r.recordExpanded(); } EventLogTags.writeNotificationExpansion(key, diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java index 70e8a162b1cf..ef82de67e259 100644 --- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -1865,8 +1865,8 @@ public class NotificationManagerServiceTest extends NotificationTestCase { } @Test - public void testStats_updatedOnExpansion() throws Exception { - final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); + public void testStats_updatedOnUserExpansion() throws Exception { + NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); mService.addNotification(r); mService.mNotificationDelegate.onNotificationExpansionChanged(r.getKey(), true, true); @@ -1875,6 +1875,17 @@ public class NotificationManagerServiceTest extends NotificationTestCase { assertTrue(mService.getNotificationRecord(r.getKey()).getStats().hasExpanded()); } + @Test + public void testStats_notUpdatedOnAutoExpansion() throws Exception { + NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); + mService.addNotification(r); + + mService.mNotificationDelegate.onNotificationExpansionChanged(r.getKey(), false, true); + assertFalse(mService.getNotificationRecord(r.getKey()).getStats().hasExpanded()); + mService.mNotificationDelegate.onNotificationExpansionChanged(r.getKey(), false, false); + assertFalse(mService.getNotificationRecord(r.getKey()).getStats().hasExpanded()); + } + @Test public void testStats_updatedOnViewSettings() throws Exception { final NotificationRecord r = generateNotificationRecord(mTestNotificationChannel); -- cgit v1.2.3-59-g8ed1b