Merge "Handle bindService errors in ObservableServiceConnection" into tm-qpr-dev

This commit is contained in:
Lucas Silva
2023-03-09 19:01:32 +00:00
committed by Android (Google) Code Review
2 changed files with 29 additions and 6 deletions

View File

@@ -119,11 +119,11 @@ public class ObservableServiceConnection<T> implements ServiceConnection {
/** /**
* Default constructor for {@link ObservableServiceConnection}. * Default constructor for {@link ObservableServiceConnection}.
* @param context The context from which the service will be bound with. * @param context The context from which the service will be bound with.
* @param serviceIntent The intent to bind service with. * @param serviceIntent The intent to bind service with.
* @param executor The executor for connection callbacks to be delivered on * @param executor The executor for connection callbacks to be delivered on
* @param transformer A {@link ServiceTransformer} for transforming the resulting service * @param transformer A {@link ServiceTransformer} for transforming the resulting service
* into a desired type. * into a desired type.
*/ */
@Inject @Inject
public ObservableServiceConnection(Context context, Intent serviceIntent, public ObservableServiceConnection(Context context, Intent serviceIntent,
@@ -143,7 +143,13 @@ public class ObservableServiceConnection<T> implements ServiceConnection {
* @return {@code true} if initiating binding succeed, {@code false} otherwise. * @return {@code true} if initiating binding succeed, {@code false} otherwise.
*/ */
public boolean bind() { public boolean bind() {
final boolean bindResult = mContext.bindService(mServiceIntent, mFlags, mExecutor, this); boolean bindResult = false;
try {
bindResult = mContext.bindService(mServiceIntent, mFlags, mExecutor, this);
} catch (SecurityException e) {
Log.d(TAG, "Could not bind to service", e);
mContext.unbindService(this);
}
mBoundCalled = true; mBoundCalled = true;
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "bind. bound:" + bindResult); Log.d(TAG, "bind. bound:" + bindResult);
@@ -197,7 +203,7 @@ public class ObservableServiceConnection<T> implements ServiceConnection {
Log.d(TAG, "removeCallback:" + callback); Log.d(TAG, "removeCallback:" + callback);
} }
mExecutor.execute(()-> mCallbacks.removeIf(el -> el.get() == callback)); mExecutor.execute(() -> mCallbacks.removeIf(el-> el.get() == callback));
} }
private void onDisconnected(@DisconnectReason int reason) { private void onDisconnected(@DisconnectReason int reason) {

View File

@@ -16,6 +16,8 @@
package com.android.systemui.util.service; package com.android.systemui.util.service;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.clearInvocations;
@@ -169,4 +171,19 @@ public class ObservableServiceConnectionTest extends SysuiTestCase {
verify(mCallback).onDisconnected(eq(connection), verify(mCallback).onDisconnected(eq(connection),
eq(ObservableServiceConnection.DISCONNECT_REASON_UNBIND)); eq(ObservableServiceConnection.DISCONNECT_REASON_UNBIND));
} }
@Test
public void testBindServiceThrowsError() {
ObservableServiceConnection<Foo> connection = new ObservableServiceConnection<>(mContext,
mIntent, mExecutor, mTransformer);
connection.addCallback(mCallback);
when(mContext.bindService(eq(mIntent), anyInt(), eq(mExecutor), eq(connection)))
.thenThrow(new SecurityException());
// Verify that the exception was caught and that bind returns false, and we properly
// unbind.
assertThat(connection.bind()).isFalse();
verify(mContext).unbindService(connection);
}
} }