From 277fcc69138594bbf2bf17746dc7aac96a3af3df Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Fri, 25 Feb 2022 10:27:59 -0500 Subject: [PATCH] Add unbind if bind call returns false This should prevent target processes to remain at high priority. Test: atest TileLifecycleManagerTest Test: atest ControlsProviderLifecycleManagerTest Test: atest CtsTileServiceTest Test: atest CtsControlsDeviceTestCases Bug: 221223837 Change-Id: Ife0e1fed8f0f28273623b1f23ab59d58e2123dfd --- .../ControlsProviderLifecycleManager.kt | 6 +++- .../qs/external/TileLifecycleManager.java | 3 ++ .../ControlsProviderLifecycleManagerTest.kt | 21 +++++++++++++ .../qs/external/TileLifecycleManagerTest.java | 31 ++++++++++++++++--- 4 files changed, 55 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt index d2ded71487dcd..5b38e5b28be9f 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt @@ -97,7 +97,11 @@ class ControlsProviderLifecycleManager( } bindTryCount++ try { - context.bindServiceAsUser(intent, serviceConnection, BIND_FLAGS, user) + val bound = context + .bindServiceAsUser(intent, serviceConnection, BIND_FLAGS, user) + if (!bound) { + context.unbindService(serviceConnection) + } } catch (e: SecurityException) { Log.e(TAG, "Failed to bind to service", e) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index 32e0805b91ba5..a49d3fd165913 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -204,6 +204,9 @@ public class TileLifecycleManager extends BroadcastReceiver implements | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS | Context.BIND_WAIVE_PRIORITY, mUser); + if (!mIsBound) { + mContext.unbindService(this); + } } catch (SecurityException e) { Log.e(TAG, "Failed to bind to service", e); mIsBound = false; diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt index 12096bc06748d..af3f24a1c58a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt @@ -210,4 +210,25 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { eq(actionCallbackService)) assertEquals(action, wrapperCaptor.getValue().getWrappedAction()) } + + @Test + fun testFalseBindCallsUnbind() { + val falseContext = mock(Context::class.java) + `when`(falseContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenReturn(false) + val manager = ControlsProviderLifecycleManager( + falseContext, + executor, + actionCallbackService, + UserHandle.of(0), + componentName + ) + manager.bindService() + executor.runAllReady() + + val captor = ArgumentCaptor.forClass( + ServiceConnection::class.java + ) + verify(falseContext).bindServiceAsUser(any(), captor.capture(), anyInt(), any()) + verify(falseContext).unbindService(captor.value) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java index b559d18d95207..04b50d8d98c1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertNotEquals; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -34,6 +35,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; +import android.content.ServiceConnection; import android.content.pm.PackageInfo; import android.content.pm.ServiceInfo; import android.net.Uri; @@ -56,7 +58,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mockito; +import org.mockito.ArgumentCaptor; @SmallTest @RunWith(AndroidJUnit4.class) @@ -64,10 +66,10 @@ public class TileLifecycleManagerTest extends SysuiTestCase { private static final int TEST_FAIL_TIMEOUT = 5000; private final PackageManagerAdapter mMockPackageManagerAdapter = - Mockito.mock(PackageManagerAdapter.class); + mock(PackageManagerAdapter.class); private final BroadcastDispatcher mMockBroadcastDispatcher = - Mockito.mock(BroadcastDispatcher.class); - private final IQSTileService.Stub mMockTileService = Mockito.mock(IQSTileService.Stub.class); + mock(BroadcastDispatcher.class); + private final IQSTileService.Stub mMockTileService = mock(IQSTileService.Stub.class); private ComponentName mTileServiceComponentName; private Intent mTileServiceIntent; private UserHandle mUser; @@ -95,7 +97,7 @@ public class TileLifecycleManagerTest extends SysuiTestCase { mThread.start(); mHandler = Handler.createAsync(mThread.getLooper()); mStateManager = new TileLifecycleManager(mHandler, mWrappedContext, - Mockito.mock(IQSService.class), + mock(IQSService.class), mMockPackageManagerAdapter, mMockBroadcastDispatcher, mTileServiceIntent, @@ -269,6 +271,25 @@ public class TileLifecycleManagerTest extends SysuiTestCase { assertTrue(mStateManager.isToggleableTile()); } + @Test + public void testFalseBindCallsUnbind() { + Context falseContext = mock(Context.class); + when(falseContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenReturn(false); + TileLifecycleManager manager = new TileLifecycleManager(mHandler, falseContext, + mock(IQSService.class), + mMockPackageManagerAdapter, + mMockBroadcastDispatcher, + mTileServiceIntent, + mUser); + + manager.setBindService(true); + + ArgumentCaptor captor = ArgumentCaptor.forClass(ServiceConnection.class); + verify(falseContext).bindServiceAsUser(any(), captor.capture(), anyInt(), any()); + + verify(falseContext).unbindService(captor.getValue()); + } + private static class TestContextWrapper extends ContextWrapper { private IntentFilter mLastIntentFilter; private int mLastFlag;