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 =