Handle onNullBinding

According to the docs, an onNullBinding requires the service to be
manually unbound

Test: A test NLS service that returns null from onBind; ensure that the ServiceRecord
does not appear in the bugreport when that app has NLS permission
Bug: 192475653

Change-Id: I784910865fa11a5f88c4e6821007564d3aea7ec9
This commit is contained in:
Julia Reynolds
2021-09-17 16:00:53 -04:00
parent 390edd0423
commit aaf8e1f3f4
2 changed files with 9 additions and 9 deletions

View File

@@ -1536,7 +1536,7 @@ abstract public class ManagedServices {
@Override
public void onNullBinding(ComponentName name) {
Slog.v(TAG, "onNullBinding() called with: name = [" + name + "]");
mServicesBound.remove(servicesBindingTag);
mContext.unbindService(this);
}
};
if (!mContext.bindServiceAsUser(intent,

View File

@@ -65,6 +65,7 @@ import com.google.android.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
@@ -1320,16 +1321,15 @@ public class ManagedServicesTest extends UiServiceTestCase {
APPROVAL_BY_COMPONENT);
ComponentName cn = ComponentName.unflattenFromString("a/a");
service.registerSystemService(cn, 0);
when(context.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer(invocation -> {
Object[] args = invocation.getArguments();
ServiceConnection sc = (ServiceConnection) args[1];
sc.onNullBinding(cn);
return true;
});
ArgumentCaptor<ServiceConnection> captor = ArgumentCaptor.forClass(ServiceConnection.class);
when(context.bindServiceAsUser(any(), captor.capture(), anyInt(), any()))
.thenAnswer(invocation -> {
captor.getValue().onNullBinding(cn);
return true;
});
service.registerSystemService(cn, 0);
assertFalse(service.isBound(cn, 0));
verify(context).unbindService(captor.getValue());
}
@Test