Merge "Call appOps changed from main thread"
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java b/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
index c2d090e..385de4a 100644
--- a/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
@@ -16,6 +16,7 @@
import android.annotation.Nullable;
import android.app.AppOpsManager;
+import android.os.Handler;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
@@ -23,13 +24,13 @@
import com.android.internal.messages.nano.SystemMessageProto;
import com.android.systemui.appops.AppOpsController;
+import com.android.systemui.dagger.qualifiers.MainHandler;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import javax.inject.Inject;
import javax.inject.Singleton;
-
/**
* Tracks state of foreground services and notifications related to foreground services per user.
*/
@@ -44,12 +45,18 @@
private final SparseArray<ForegroundServicesUserState> mUserServices = new SparseArray<>();
private final Object mMutex = new Object();
private final NotificationEntryManager mEntryManager;
+ private final Handler mMainHandler;
@Inject
public ForegroundServiceController(NotificationEntryManager entryManager,
- AppOpsController appOpsController) {
+ AppOpsController appOpsController, @MainHandler Handler mainHandler) {
mEntryManager = entryManager;
- appOpsController.addCallback(APP_OPS, this::onAppOpChanged);
+ mMainHandler = mainHandler;
+ appOpsController.addCallback(APP_OPS, (code, uid, packageName, active) -> {
+ mMainHandler.post(() -> {
+ onAppOpChanged(code, uid, packageName, active);
+ });
+ });
}
/**
@@ -113,7 +120,7 @@
* @param packageName package that created the notification
* @param active whether the appOpCode is active or not
*/
- public void onAppOpChanged(int appOpCode, int uid, String packageName, boolean active) {
+ void onAppOpChanged(int appOpCode, int uid, String packageName, boolean active) {
int userId = UserHandle.getUserId(uid);
// Record active app ops
synchronized (mMutex) {
@@ -132,7 +139,8 @@
// Update appOp if there's an associated pending or visible notification:
final String foregroundKey = getStandardLayoutKey(userId, packageName);
if (foregroundKey != null) {
- final NotificationEntry entry = mEntryManager.getPendingOrCurrentNotif(foregroundKey);
+ final NotificationEntry entry = mEntryManager.getPendingOrCurrentNotif(
+ foregroundKey);
if (entry != null
&& uid == entry.getSbn().getUid()
&& packageName.equals(entry.getSbn().getPackageName())) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
index bb4387eb..e63b6d66 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java
@@ -33,6 +33,7 @@
import android.app.Notification;
import android.app.NotificationManager;
import android.os.Bundle;
+import android.os.Handler;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.widget.RemoteViews;
@@ -64,11 +65,12 @@
private NotificationEntryListener mEntryListener;
@Mock private NotificationEntryManager mEntryManager;
@Mock private AppOpsController mAppOpsController;
+ @Mock private Handler mMainHandler;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mFsc = new ForegroundServiceController(mEntryManager, mAppOpsController);
+ mFsc = new ForegroundServiceController(mEntryManager, mAppOpsController, mMainHandler);
mListener = new ForegroundServiceNotificationListener(
mContext, mFsc, mEntryManager);
ArgumentCaptor<NotificationEntryListener> entryListenerCaptor =