Merge "Factors out list of lifetime extenders from NotificationEntryManager."
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index e4c6981..25837e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -42,6 +42,7 @@
import android.view.View;
import android.widget.ImageView;
+import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.Interpolators;
@@ -159,6 +160,7 @@
Entry entry,
String key,
StatusBarNotification old,
+ NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
if (!lifetimeExtended) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
index 2e9f6d0..674e262 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java
@@ -255,6 +255,7 @@
NotificationData.Entry entry,
String key,
StatusBarNotification old,
+ NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
if (removedByUser) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
index 099b503..dbc6f43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java
@@ -24,6 +24,7 @@
import android.service.notification.StatusBarNotification;
import android.util.Log;
+import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.AmbientPulseManager;
import com.android.systemui.statusbar.NotificationListener;
@@ -84,6 +85,7 @@
NotificationData.Entry entry,
String key,
StatusBarNotification old,
+ NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
stopAlerting(key);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
index 8351c40..72f1d5b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java
@@ -15,8 +15,10 @@
*/
package com.android.systemui.statusbar.notification;
+import android.annotation.Nullable;
import android.service.notification.StatusBarNotification;
+import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.statusbar.notification.row.NotificationInflater;
/**
@@ -59,12 +61,21 @@
}
/**
+ * Called when an error occurred inflating the views for a notification.
+ */
+ default void onInflationError(StatusBarNotification notification, Exception exception) {
+ }
+
+ /**
* Called when a notification has been removed (either because the user swiped it away or
* because the developer retracted it).
* @param entry notification data entry that was removed. Null if no entry existed for the
* removed key at the time of removal.
* @param key key of notification that was removed
* @param old StatusBarNotification of the notification before it was removed
+ * @param visibility logging data related to the visibility of the notification at the time of
+ * removal, if it was removed by a user action. Null if it was not removed by
+ * a user action.
* @param lifetimeExtended true if something is artificially extending how long the notification
* @param removedByUser true if the notification was removed by a user action
*/
@@ -72,6 +83,7 @@
NotificationData.Entry entry,
String key,
StatusBarNotification old,
+ @Nullable NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index e9989ff..e0fa723 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -22,18 +22,14 @@
import android.content.Context;
import android.os.Handler;
import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
-import android.service.notification.NotificationStats;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
@@ -95,7 +91,6 @@
private final Handler mDeferredNotificationViewUpdateHandler;
private Runnable mUpdateNotificationViewsCallback;
- protected IStatusBarService mBarService;
private NotificationPresenter mPresenter;
protected PowerManager mPowerManager;
private NotificationListenerService.RankingMap mLatestRankingMap;
@@ -136,8 +131,6 @@
public NotificationEntryManager(Context context) {
mContext = context;
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mBarService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
mBubbleController.setDismissListener(this /* bubbleEventListener */);
mNotificationData = new NotificationData();
mDeferredNotificationViewUpdateHandler = new Handler();
@@ -216,26 +209,8 @@
final int count = mNotificationData.getActiveNotifications().size();
final NotificationVisibility nv = NotificationVisibility.obtain(n.getKey(), rank, count,
true);
-
- final String pkg = n.getPackageName();
- final String tag = n.getTag();
- final int id = n.getId();
- final int userId = n.getUserId();
- try {
- int dismissalSurface = NotificationStats.DISMISSAL_SHADE;
- if (mHeadsUpManager.isAlerting(n.getKey())) {
- dismissalSurface = NotificationStats.DISMISSAL_PEEK;
- } else if (mListContainer.hasPulsingNotifications()) {
- dismissalSurface = NotificationStats.DISMISSAL_AOD;
- }
- int dismissalSentiment = NotificationStats.DISMISS_SENTIMENT_NEUTRAL;
- mBarService.onNotificationClear(pkg, tag, id, userId, n.getKey(), dismissalSurface,
- dismissalSentiment, nv);
- removeNotificationInternal(
- n.getKey(), null, false /* forceRemove */, true /* removedByUser */);
- } catch (RemoteException ex) {
- // system process is dead if we're here.
- }
+ removeNotificationInternal(
+ n.getKey(), null, nv, false /* forceRemove */, true /* removedByUser */);
}
@Override
@@ -276,12 +251,9 @@
@Override
public void handleInflationException(StatusBarNotification n, Exception e) {
removeNotificationInternal(
- n.getKey(), null, true /* forceRemove */, false /* removedByUser */);
- try {
- mBarService.onNotificationError(n.getPackageName(), n.getTag(), n.getId(), n.getUid(),
- n.getInitialPid(), e.getMessage(), n.getUserId());
- } catch (RemoteException ex) {
- // The end is nigh.
+ n.getKey(), null, null, true /* forceRemove */, false /* removedByUser */);
+ for (NotificationEntryListener listener : mNotificationEntryListeners) {
+ listener.onInflationError(n, e);
}
}
@@ -334,12 +306,13 @@
@Override
public void removeNotification(String key, NotificationListenerService.RankingMap ranking) {
removeNotificationInternal(
- key, ranking, false /* forceRemove */, false /* removedByUser */);
+ key, ranking, null, false /* forceRemove */, false /* removedByUser */);
}
private void removeNotificationInternal(
String key,
@Nullable NotificationListenerService.RankingMap ranking,
+ @Nullable NotificationVisibility visibility,
boolean forceRemove,
boolean removedByUser) {
final NotificationData.Entry entry = mNotificationData.get(key);
@@ -386,7 +359,7 @@
}
for (NotificationEntryListener listener : mNotificationEntryListeners) {
- listener.onEntryRemoved(entry, key, old, lifetimeExtended, removedByUser);
+ listener.onEntryRemoved(entry, key, old, visibility, lifetimeExtended, removedByUser);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
index 75bad6d..060e755 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java
@@ -21,6 +21,8 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
+import android.service.notification.NotificationStats;
+import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.util.Log;
@@ -32,8 +34,10 @@
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
import java.util.ArrayList;
import java.util.Collection;
@@ -60,7 +64,8 @@
// Dependencies:
private final NotificationListenerService mNotificationListener;
private final UiOffloadThread mUiOffloadThread;
- protected NotificationEntryManager mEntryManager;
+ private final NotificationEntryManager mEntryManager;
+ private HeadsUpManager mHeadsUpManager;
protected Handler mHandler = new Handler();
protected IStatusBarService mBarService;
@@ -158,12 +163,38 @@
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
// Not expected to be destroyed, don't need to unsubscribe
statusBarStateController.addCallback(this);
+
+ entryManager.addNotificationEntryListener(new NotificationEntryListener() {
+ @Override
+ public void onEntryRemoved(
+ NotificationData.Entry entry,
+ String key,
+ StatusBarNotification old,
+ NotificationVisibility visibility,
+ boolean lifetimeExtended,
+ boolean removedByUser) {
+ if (removedByUser && visibility != null) {
+ logNotificationClear(key, entry.notification, visibility);
+ }
+ }
+
+ @Override
+ public void onInflationError(
+ StatusBarNotification notification,
+ Exception exception) {
+ logNotificationError(notification, exception);
+ }
+ });
}
public void setUpWithContainer(NotificationListContainer listContainer) {
mListContainer = listContainer;
}
+ public void setHeadsUpManager(HeadsUpManager headsUpManager) {
+ mHeadsUpManager = headsUpManager;
+ }
+
public void stopNotificationLogging() {
// Report all notifications as invisible and turn down the
// reporter.
@@ -193,6 +224,45 @@
}
}
+ private void logNotificationClear(String key, StatusBarNotification notification,
+ NotificationVisibility nv) {
+ final String pkg = notification.getPackageName();
+ final String tag = notification.getTag();
+ final int id = notification.getId();
+ final int userId = notification.getUserId();
+ try {
+ int dismissalSurface = NotificationStats.DISMISSAL_SHADE;
+ if (mHeadsUpManager.isAlerting(key)) {
+ dismissalSurface = NotificationStats.DISMISSAL_PEEK;
+ } else if (mListContainer.hasPulsingNotifications()) {
+ dismissalSurface = NotificationStats.DISMISSAL_AOD;
+ }
+ int dismissalSentiment = NotificationStats.DISMISS_SENTIMENT_NEUTRAL;
+ mBarService.onNotificationClear(pkg, tag, id, userId, notification.getKey(),
+ dismissalSurface,
+ dismissalSentiment, nv);
+ } catch (RemoteException ex) {
+ // system process is dead if we're here.
+ }
+ }
+
+ private void logNotificationError(
+ StatusBarNotification notification,
+ Exception exception) {
+ try {
+ mBarService.onNotificationError(
+ notification.getPackageName(),
+ notification.getTag(),
+ notification.getId(),
+ notification.getUid(),
+ notification.getInitialPid(),
+ exception.getMessage(),
+ notification.getUserId());
+ } catch (RemoteException ex) {
+ // The end is nigh.
+ }
+ }
+
private void logNotificationVisibilityChanges(
Collection<NotificationVisibility> newlyVisible,
Collection<NotificationVisibility> noLongerVisible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
index 1a78302..9fe30db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java
@@ -22,6 +22,7 @@
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
+import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.Dependency;
import com.android.systemui.statusbar.AlertingNotificationManager;
import com.android.systemui.statusbar.AmbientPulseManager;
@@ -220,6 +221,7 @@
Entry entry,
String key,
StatusBarNotification old,
+ NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
// Removes any alerts pending on this entry. Note that this will not stop any inflation
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 efe734e..e1a6cd3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -868,6 +868,7 @@
mNotificationPanel.setHeadsUpManager(mHeadsUpManager);
mGroupManager.setHeadsUpManager(mHeadsUpManager);
mGroupAlertTransferHelper.setHeadsUpManager(mHeadsUpManager);
+ mNotificationLogger.setHeadsUpManager(mHeadsUpManager);
putComponent(HeadsUpManager.class, mHeadsUpManager);
createNavigationBar();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index c15ddc0..7b6fef3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -37,6 +37,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
+import com.android.internal.statusbar.NotificationVisibility;
import com.android.internal.widget.MessagingGroup;
import com.android.internal.widget.MessagingMessage;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -195,6 +196,7 @@
Entry entry,
String key,
StatusBarNotification old,
+ NotificationVisibility visibility,
boolean lifetimeExtended,
boolean removedByUser) {
if (!lifetimeExtended) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index cb02dc6..a2d408e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -52,7 +52,6 @@
import android.widget.FrameLayout;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dependency;
import com.android.systemui.ForegroundServiceController;
import com.android.systemui.InitController;
@@ -109,7 +108,6 @@
@Mock private HeadsUpManager mHeadsUpManager;
@Mock private NotificationListenerService.RankingMap mRankingMap;
@Mock private RemoteInputController mRemoteInputController;
- @Mock private IStatusBarService mBarService;
// Dependency mocks:
@Mock private ForegroundServiceController mForegroundServiceController;
@@ -132,9 +130,8 @@
private class TestableNotificationEntryManager extends NotificationEntryManager {
private final CountDownLatch mCountDownLatch;
- public TestableNotificationEntryManager(Context context, IStatusBarService barService) {
+ TestableNotificationEntryManager(Context context) {
super(context);
- mBarService = barService;
mCountDownLatch = new CountDownLatch(1);
}
@@ -227,7 +224,7 @@
mEntry = new NotificationData.Entry(mSbn);
mEntry.expandedIcon = mock(StatusBarIconView.class);
- mEntryManager = new TestableNotificationEntryManager(mContext, mBarService);
+ mEntryManager = new TestableNotificationEntryManager(mContext);
Dependency.get(InitController.class).executePostInitTasks();
mEntryManager.setUpWithPresenter(mPresenter, mListContainer, mHeadsUpManager);
mEntryManager.addNotificationEntryListener(mEntryListener);
@@ -258,8 +255,7 @@
assertTrue(mEntryManager.getCountDownLatch().await(10, TimeUnit.SECONDS));
// Check that no inflation error occurred.
- verify(mBarService, never()).onNotificationError(any(), any(), anyInt(), anyInt(), anyInt(),
- any(), anyInt());
+ verify(mEntryListener, never()).onInflationError(any(), any());
verify(mForegroundServiceController).addNotification(eq(mSbn), anyInt());
// Row inflation:
@@ -293,8 +289,7 @@
// Wait for content update.
assertTrue(mEntryManager.getCountDownLatch().await(10, TimeUnit.SECONDS));
- verify(mBarService, never()).onNotificationError(any(), any(), anyInt(), anyInt(), anyInt(),
- any(), anyInt());
+ verify(mEntryListener, never()).onInflationError(any(), any());
verify(mPresenter).updateNotificationViews();
verify(mForegroundServiceController).updateNotification(eq(mSbn), anyInt());
@@ -313,14 +308,13 @@
mEntryManager.removeNotification(mSbn.getKey(), mRankingMap);
- verify(mBarService, never()).onNotificationError(any(), any(), anyInt(), anyInt(), anyInt(),
- any(), anyInt());
+ verify(mEntryListener, never()).onInflationError(any(), any());
verify(mForegroundServiceController).removeNotification(mSbn);
verify(mListContainer).cleanUpViewStateForEntry(mEntry);
verify(mPresenter).updateNotificationViews();
verify(mEntryListener).onEntryRemoved(mEntry, mSbn.getKey(), mSbn,
- false /* lifetimeExtended */, false /* removedByUser */);
+ null, false /* lifetimeExtended */, false /* removedByUser */);
verify(mRow).setRemoved();
assertNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
@@ -345,7 +339,7 @@
assertNotNull(mEntryManager.getNotificationData().get(mSbn.getKey()));
verify(extender).setShouldManageLifetime(mEntry, true /* shouldManage */);
verify(mEntryListener).onEntryRemoved(mEntry, mSbn.getKey(), null,
- true /* lifetimeExtended */, false /* removedByUser */);
+ null, true /* lifetimeExtended */, false /* removedByUser */);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
index caa3ca6..7b96518 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java
@@ -28,7 +28,6 @@
import android.app.Notification;
import android.os.Handler;
import android.os.Looper;
-import android.os.RemoteException;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.filters.SmallTest;
@@ -41,7 +40,6 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.statusbar.NotificationListener;
-import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationData;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -56,7 +54,6 @@
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import org.mockito.stubbing.Answer;
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -67,7 +64,6 @@
private static final String TEST_PACKAGE_NAME = "test";
private static final int TEST_UID = 0;
- @Mock private NotificationPresenter mPresenter;
@Mock private NotificationListContainer mListContainer;
@Mock private IStatusBarService mBarService;
@Mock private NotificationData mNotificationData;
@@ -78,21 +74,21 @@
@Mock private NotificationListener mListener;
private NotificationData.Entry mEntry;
- private StatusBarNotification mSbn;
private TestableNotificationLogger mLogger;
private ConcurrentLinkedQueue<AssertionError> mErrorQueue = new ConcurrentLinkedQueue<>();
@Before
- public void setUp() throws RemoteException {
+ public void setUp() {
MockitoAnnotations.initMocks(this);
mDependency.injectTestDependency(NotificationEntryManager.class, mEntryManager);
mDependency.injectTestDependency(NotificationListener.class, mListener);
when(mEntryManager.getNotificationData()).thenReturn(mNotificationData);
- mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID,
+ StatusBarNotification sbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME,
+ 0, null, TEST_UID,
0, new Notification(), UserHandle.CURRENT, null, 0);
- mEntry = new NotificationData.Entry(mSbn);
+ mEntry = new NotificationData.Entry(sbn);
mEntry.setRow(mRow);
mLogger = new TestableNotificationLogger(mListener, Dependency.get(UiOffloadThread.class),
@@ -106,7 +102,7 @@
NotificationVisibility.obtain(mEntry.key, 0, 1, true)
};
NotificationVisibility[] noLongerVisibleKeys = {};
- doAnswer((Answer) invocation -> {
+ doAnswer(invocation -> {
try {
assertArrayEquals(newlyVisibleKeys,
(NotificationVisibility[]) invocation.getArguments()[0]);
@@ -158,7 +154,7 @@
private class TestableNotificationLogger extends NotificationLogger {
- public TestableNotificationLogger(NotificationListener notificationListener,
+ TestableNotificationLogger(NotificationListener notificationListener,
UiOffloadThread uiOffloadThread,
NotificationEntryManager entryManager,
StatusBarStateController statusBarStateController,
@@ -169,13 +165,9 @@
mHandler = Handler.createAsync(Looper.myLooper());
}
- public OnChildLocationsChangedListener
+ OnChildLocationsChangedListener
getChildLocationsChangedListenerForTest() {
return mNotificationLocationsChangedListener;
}
-
- public Handler getHandlerForTest() {
- return mHandler;
- }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
index 916232b..56af400 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java
@@ -237,7 +237,8 @@
mGroupManager.onEntryAdded(summaryEntry);
mGroupManager.onEntryAdded(childEntry);
- mNotificationEntryListener.onEntryRemoved(childEntry, childEntry.key, null, false, false);
+ mNotificationEntryListener.onEntryRemoved(childEntry, childEntry.key, null, null,
+ false, false);
assertFalse(mGroupAlertTransferHelper.isAlertTransferPending(childEntry));
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index ad08861..99979c1 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -4237,11 +4237,15 @@
ArrayMap<String, List<InputMethodSubtype>> allSubtypes, AtomicFile subtypesFile,
ArrayMap<String, InputMethodInfo> methodMap) {
if (allSubtypes.isEmpty()) {
+ final File parentDir = subtypesFile.getBaseFile().getParentFile();
+ if (parentDir == null || !parentDir.exists()) {
+ // Even the parent directory doesn't exist. There is nothing to clean up.
+ return;
+ }
if (subtypesFile.exists()) {
subtypesFile.delete();
}
- final File parentDir = subtypesFile.getBaseFile().getParentFile();
- if (parentDir != null && FileUtils.listFilesOrEmpty(parentDir).length == 0) {
+ if (FileUtils.listFilesOrEmpty(parentDir).length == 0) {
if (!parentDir.delete()) {
Slog.e(TAG, "Failed to delete the empty parent directory " + parentDir);
}