Loading packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ 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 com.android.systemui.util.Assert; import javax.inject.Inject; import javax.inject.Singleton; Loading Loading @@ -121,6 +122,8 @@ public class ForegroundServiceController { * @param active whether the appOpCode is active or not */ void onAppOpChanged(int appOpCode, int uid, String packageName, boolean active) { Assert.isMainThread(); int userId = UserHandle.getUserId(uid); // Record active app ops synchronized (mMutex) { Loading packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; import static junit.framework.TestCase.fail; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; Loading @@ -34,12 +35,14 @@ import android.app.Notification; import android.app.NotificationManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.widget.RemoteViews; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.messages.nano.SystemMessageProto; import com.android.systemui.appops.AppOpsController; Loading @@ -58,7 +61,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidJUnit4.class) @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class ForegroundServiceControllerTest extends SysuiTestCase { private ForegroundServiceController mFsc; private ForegroundServiceNotificationListener mListener; Loading @@ -69,6 +73,9 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { // assume the TestLooper is the main looper for these tests com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper(); MockitoAnnotations.initMocks(this); mFsc = new ForegroundServiceController(mEntryManager, mAppOpsController, mMainHandler); mListener = new ForegroundServiceNotificationListener( Loading @@ -80,6 +87,26 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { mEntryListener = entryListenerCaptor.getValue(); } @Test public void testAppOpsChangedCalledFromBgThread() { try { // WHEN onAppOpChanged is called from a different thread than the MainLooper com.android.systemui.util.Assert.sMainLooper = Looper.getMainLooper(); NotificationEntry entry = createFgEntry(); mFsc.onAppOpChanged( AppOpsManager.OP_CAMERA, entry.getSbn().getUid(), entry.getSbn().getPackageName(), true); // This test is run on the TestableLooper, which is not the MainLooper, so // we expect an exception to be thrown fail("onAppOpChanged shouldn't be allowed to be called from a bg thread."); } catch (IllegalStateException e) { // THEN expect an exception } } @Test public void testAppOps_appOpChangedBeforeNotificationExists() { // GIVEN app op exists, but notification doesn't exist in NEM yet Loading Loading
packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ 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 com.android.systemui.util.Assert; import javax.inject.Inject; import javax.inject.Singleton; Loading Loading @@ -121,6 +122,8 @@ public class ForegroundServiceController { * @param active whether the appOpCode is active or not */ void onAppOpChanged(int appOpCode, int uid, String packageName, boolean active) { Assert.isMainThread(); int userId = UserHandle.getUserId(uid); // Record active app ops synchronized (mMutex) { Loading
packages/SystemUI/tests/src/com/android/systemui/ForegroundServiceControllerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; import static junit.framework.TestCase.fail; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; Loading @@ -34,12 +35,14 @@ import android.app.Notification; import android.app.NotificationManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.widget.RemoteViews; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.messages.nano.SystemMessageProto; import com.android.systemui.appops.AppOpsController; Loading @@ -58,7 +61,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidJUnit4.class) @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class ForegroundServiceControllerTest extends SysuiTestCase { private ForegroundServiceController mFsc; private ForegroundServiceNotificationListener mListener; Loading @@ -69,6 +73,9 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { // assume the TestLooper is the main looper for these tests com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper(); MockitoAnnotations.initMocks(this); mFsc = new ForegroundServiceController(mEntryManager, mAppOpsController, mMainHandler); mListener = new ForegroundServiceNotificationListener( Loading @@ -80,6 +87,26 @@ public class ForegroundServiceControllerTest extends SysuiTestCase { mEntryListener = entryListenerCaptor.getValue(); } @Test public void testAppOpsChangedCalledFromBgThread() { try { // WHEN onAppOpChanged is called from a different thread than the MainLooper com.android.systemui.util.Assert.sMainLooper = Looper.getMainLooper(); NotificationEntry entry = createFgEntry(); mFsc.onAppOpChanged( AppOpsManager.OP_CAMERA, entry.getSbn().getUid(), entry.getSbn().getPackageName(), true); // This test is run on the TestableLooper, which is not the MainLooper, so // we expect an exception to be thrown fail("onAppOpChanged shouldn't be allowed to be called from a bg thread."); } catch (IllegalStateException e) { // THEN expect an exception } } @Test public void testAppOps_appOpChangedBeforeNotificationExists() { // GIVEN app op exists, but notification doesn't exist in NEM yet Loading