Loading packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java +13 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui; 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; Loading @@ -23,13 +24,13 @@ import android.util.SparseArray; 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. */ Loading @@ -44,12 +45,18 @@ public class ForegroundServiceController { 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); }); }); } /** Loading Loading @@ -113,7 +120,7 @@ public class ForegroundServiceController { * @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) { Loading @@ -132,7 +139,8 @@ public class ForegroundServiceController { // 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())) { Loading packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.app.AppOpsManager; 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; Loading Loading @@ -64,11 +65,12 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { 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 = Loading Loading
packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java +13 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui; 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; Loading @@ -23,13 +24,13 @@ import android.util.SparseArray; 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. */ Loading @@ -44,12 +45,18 @@ public class ForegroundServiceController { 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); }); }); } /** Loading Loading @@ -113,7 +120,7 @@ public class ForegroundServiceController { * @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) { Loading @@ -132,7 +139,8 @@ public class ForegroundServiceController { // 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())) { Loading
packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.app.AppOpsManager; 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; Loading Loading @@ -64,11 +65,12 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { 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 = Loading