Skip to content

Commit dc7e204

Browse files
Fabian KozynskiInVictusXV
authored andcommitted
Handle onNullBinding
According to the docs, an onNullBinding requires the service to be manually unbound. Test: test apk that return null on onBind Test: atest ControlsProviderLifecycleManager Fixes: 212286849 Change-Id: I71a59b875bbf9eb411e6e92ddc5a04a7353a46c4 (cherry picked from commit d0e683b) Merged-In:I71a59b875bbf9eb411e6e92ddc5a04a7353a46c4
1 parent 4465b0d commit dc7e204

2 files changed

Lines changed: 47 additions & 9 deletions

File tree

packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ class ControlsProviderLifecycleManager(
131131
wrapper = null
132132
bindService(false)
133133
}
134+
135+
override fun onNullBinding(name: ComponentName?) {
136+
if (DEBUG) Log.d(TAG, "onNullBinding $name")
137+
wrapper = null
138+
context.unbindService(this)
139+
}
134140
}
135141

136142
private fun handlePendingServiceMethods() {

packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package com.android.systemui.controls.controller
1818

1919
import android.content.ComponentName
20+
import android.content.Context
21+
import android.content.Intent
22+
import android.content.ServiceConnection
2023
import android.os.UserHandle
2124
import android.service.controls.IControlsActionCallback
2225
import android.service.controls.IControlsProvider
@@ -43,6 +46,8 @@ import org.mockito.ArgumentMatchers.eq
4346
import org.mockito.Captor
4447
import org.mockito.Mock
4548
import org.mockito.Mockito.`when`
49+
import org.mockito.Mockito.anyInt
50+
import org.mockito.Mockito.mock
4651
import org.mockito.Mockito.never
4752
import org.mockito.Mockito.verify
4853
import org.mockito.MockitoAnnotations
@@ -57,8 +62,6 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
5762
private lateinit var subscriberService: IControlsSubscriber.Stub
5863
@Mock
5964
private lateinit var service: IControlsProvider.Stub
60-
@Mock
61-
private lateinit var loadCallback: ControlsBindingController.LoadCallback
6265

6366
@Captor
6467
private lateinit var wrapperCaptor: ArgumentCaptor<ControlActionWrapper>
@@ -75,7 +78,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
7578
fun setUp() {
7679
MockitoAnnotations.initMocks(this)
7780

78-
mContext.addMockService(componentName, service)
81+
context.addMockService(componentName, service)
7982
executor = FakeExecutor(FakeSystemClock())
8083
`when`(service.asBinder()).thenCallRealMethod()
8184
`when`(service.queryLocalInterface(ArgumentMatchers.anyString())).thenReturn(service)
@@ -98,7 +101,36 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
98101
fun testBindService() {
99102
manager.bindService()
100103
executor.runAllReady()
101-
assertTrue(mContext.isBound(componentName))
104+
assertTrue(context.isBound(componentName))
105+
}
106+
107+
@Test
108+
fun testNullBinding() {
109+
val mockContext = mock(Context::class.java)
110+
lateinit var serviceConnection: ServiceConnection
111+
`when`(mockContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer {
112+
val component = (it.arguments[0] as Intent).component
113+
if (component == componentName) {
114+
serviceConnection = it.arguments[1] as ServiceConnection
115+
serviceConnection.onNullBinding(component)
116+
true
117+
} else {
118+
false
119+
}
120+
}
121+
122+
val nullManager = ControlsProviderLifecycleManager(
123+
mockContext,
124+
executor,
125+
actionCallbackService,
126+
UserHandle.of(0),
127+
componentName
128+
)
129+
130+
nullManager.bindService()
131+
executor.runAllReady()
132+
133+
verify(mockContext).unbindService(serviceConnection)
102134
}
103135

104136
@Test
@@ -109,7 +141,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
109141
manager.unbindService()
110142
executor.runAllReady()
111143

112-
assertFalse(mContext.isBound(componentName))
144+
assertFalse(context.isBound(componentName))
113145
}
114146

115147
@Test
@@ -119,7 +151,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
119151

120152
verify(service).load(subscriberService)
121153

122-
assertTrue(mContext.isBound(componentName))
154+
assertTrue(context.isBound(componentName))
123155
}
124156

125157
@Test
@@ -129,7 +161,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
129161

130162
manager.unbindService()
131163
executor.runAllReady()
132-
assertFalse(mContext.isBound(componentName))
164+
assertFalse(context.isBound(componentName))
133165
}
134166

135167
@Test
@@ -162,7 +194,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
162194
manager.maybeBindAndSubscribe(list, subscriberService)
163195
executor.runAllReady()
164196

165-
assertTrue(mContext.isBound(componentName))
197+
assertTrue(context.isBound(componentName))
166198
verify(service).subscribe(list, subscriberService)
167199
}
168200

@@ -173,7 +205,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() {
173205
manager.maybeBindAndSendAction(controlId, action)
174206
executor.runAllReady()
175207

176-
assertTrue(mContext.isBound(componentName))
208+
assertTrue(context.isBound(componentName))
177209
verify(service).action(eq(controlId), capture(wrapperCaptor),
178210
eq(actionCallbackService))
179211
assertEquals(action, wrapperCaptor.getValue().getWrappedAction())

0 commit comments

Comments
 (0)