Remove constructors and defer creating the Handler to onBind.

Previously, the Handler couldn't be built because we tried to call
getMainLooper() before the Service's base context was attached.

Bug: 268741053
API-Coverage-Bug: 265968015
Test: atest SharedConnectivityServiceTest
Change-Id: I70caac89ca69545e62b177872ef144b031cc4846
This commit is contained in:
Isaac Katzenelson
2023-02-15 18:48:50 +00:00
committed by Andrew Sapperstein
parent 7137d9165d
commit e3d1e4caa9
3 changed files with 39 additions and 25 deletions

View File

@@ -10152,7 +10152,6 @@ package android.net.wifi.sharedconnectivity.service {
public abstract class SharedConnectivityService extends android.app.Service {
ctor public SharedConnectivityService();
ctor public SharedConnectivityService(@NonNull android.os.Handler);
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onConnectKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
method public abstract void onConnectTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);

View File

@@ -59,7 +59,7 @@ public abstract class SharedConnectivityService extends Service {
private static final String TAG = SharedConnectivityService.class.getSimpleName();
private static final boolean DEBUG = true;
private final Handler mHandler;
private Handler mHandler;
private final List<ISharedConnectivityCallback> mCallbacks = new ArrayList<>();
// Used to find DeathRecipient when unregistering a callback to call unlinkToDeath.
private final Map<ISharedConnectivityCallback, DeathRecipient> mDeathRecipientMap =
@@ -71,14 +71,6 @@ public abstract class SharedConnectivityService extends Service {
private TetherNetworkConnectionStatus mTetherNetworkConnectionStatus;
private KnownNetworkConnectionStatus mKnownNetworkConnectionStatus;
public SharedConnectivityService() {
mHandler = new Handler(getMainLooper());
}
public SharedConnectivityService(@NonNull Handler handler) {
mHandler = handler;
}
private final class DeathRecipient implements IBinder.DeathRecipient {
ISharedConnectivityCallback mCallback;
@@ -97,6 +89,7 @@ public abstract class SharedConnectivityService extends Service {
@Nullable
public final IBinder onBind(@NonNull Intent intent) {
if (DEBUG) Log.i(TAG, "onBind intent=" + intent);
mHandler = new Handler(getMainLooper());
return new ISharedConnectivityService.Stub() {
@Override
public void registerCallback(ISharedConnectivityCallback callback) {

View File

@@ -17,16 +17,21 @@
package android.net.wifi.sharedconnectivity.service;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.sharedconnectivity.app.KnownNetwork;
import android.net.wifi.sharedconnectivity.app.TetherNetwork;
import android.os.Handler;
import android.os.test.TestLooper;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* Unit tests for {@link android.net.wifi.sharedconnectivity.service.SharedConnectivityService}.
@@ -34,6 +39,33 @@ import org.junit.Test;
@SmallTest
public class SharedConnectivityServiceTest {
@Mock
Context mContext;
static class FakeSharedConnectivityService extends SharedConnectivityService {
public void attachBaseContext(Context context) {
super.attachBaseContext(context);
}
@Override
public void onConnectTetherNetwork(@NonNull TetherNetwork network) {}
@Override
public void onDisconnectTetherNetwork(@NonNull TetherNetwork network) {}
@Override
public void onConnectKnownNetwork(@NonNull KnownNetwork network) {}
@Override
public void onForgetKnownNetwork(@NonNull KnownNetwork network) {}
}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper());
}
/**
* Verifies service returns
*/
@@ -51,18 +83,8 @@ public class SharedConnectivityServiceTest {
}
private SharedConnectivityService createService() {
return new SharedConnectivityService(new Handler(new TestLooper().getLooper())) {
@Override
public void onConnectTetherNetwork(TetherNetwork network) {}
@Override
public void onDisconnectTetherNetwork(TetherNetwork network) {}
@Override
public void onConnectKnownNetwork(KnownNetwork network) {}
@Override
public void onForgetKnownNetwork(KnownNetwork network) {}
};
FakeSharedConnectivityService service = new FakeSharedConnectivityService();
service.attachBaseContext(mContext);
return service;
}
}