Merge "Handle bindService errors in ObservableServiceConnection" into tm-qpr-dev
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user