Fix loopers in TileServices

For some reason, we were injecting a main Looper and also creating a
separate handler using mainLooper. Instead, just use the same injected
looper, but create a new handler for TileServiceManager.

Test: atest TileServicesTest
Test: atest CtsTileServiceTestCases
Bug: 172251878
Change-Id: I75ff29d7d80ccfe63051113ffa5ba15acad4bb82
This commit is contained in:
Fabian Kozynski
2022-03-08 12:59:38 -05:00
parent 612b7a69dc
commit 49ffa7e3ac
2 changed files with 17 additions and 12 deletions

View File

@@ -26,7 +26,6 @@ import android.graphics.drawable.Icon;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.service.quicksettings.IQSService;
@@ -51,6 +50,7 @@ import java.util.Comparator;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Provider;
/**
* Runs the day-to-day operations of which tiles should be bound and when.
@@ -64,8 +64,8 @@ public class TileServices extends IQSService.Stub {
private final ArrayMap<ComponentName, CustomTile> mTiles = new ArrayMap<>();
private final ArrayMap<IBinder, CustomTile> mTokenMap = new ArrayMap<>();
private final Context mContext;
private final Handler mHandler;
private final Handler mMainHandler;
private final Provider<Handler> mHandlerProvider;
private final QSTileHost mHost;
private final KeyguardStateController mKeyguardStateController;
private final BroadcastDispatcher mBroadcastDispatcher;
@@ -76,7 +76,7 @@ public class TileServices extends IQSService.Stub {
@Inject
public TileServices(
QSTileHost host,
@Main Looper looper,
@Main Provider<Handler> handlerProvider,
BroadcastDispatcher broadcastDispatcher,
UserTracker userTracker,
KeyguardStateController keyguardStateController) {
@@ -84,8 +84,8 @@ public class TileServices extends IQSService.Stub {
mKeyguardStateController = keyguardStateController;
mContext = mHost.getContext();
mBroadcastDispatcher = broadcastDispatcher;
mHandler = new Handler(looper);
mMainHandler = new Handler(Looper.getMainLooper());
mHandlerProvider = handlerProvider;
mMainHandler = mHandlerProvider.get();
mUserTracker = userTracker;
mBroadcastDispatcher.registerReceiver(
mRequestListeningReceiver,
@@ -118,7 +118,7 @@ public class TileServices extends IQSService.Stub {
protected TileServiceManager onCreateTileService(ComponentName component,
BroadcastDispatcher broadcastDispatcher) {
return new TileServiceManager(this, mHandler, component,
return new TileServiceManager(this, mHandlerProvider.get(), component,
broadcastDispatcher, mUserTracker);
}

View File

@@ -32,7 +32,6 @@ import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.service.quicksettings.TileService;
import android.test.suitebuilder.annotation.SmallTest;
@@ -68,6 +67,8 @@ import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Optional;
import javax.inject.Provider;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@@ -75,6 +76,7 @@ public class TileServicesTest extends SysuiTestCase {
private static int NUM_FAKES = TileServices.DEFAULT_MAX_BOUND * 2;
private TileServices mTileService;
private TestableLooper mTestableLooper;
private ArrayList<TileServiceManager> mManagers;
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@@ -116,17 +118,20 @@ public class TileServicesTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(BluetoothController.class);
mManagers = new ArrayList<>();
mTestableLooper = TestableLooper.get(this);
when(mTileServiceRequestControllerBuilder.create(any()))
.thenReturn(mTileServiceRequestController);
when(mTileLifecycleManagerFactory.create(any(Intent.class), any(UserHandle.class)))
.thenReturn(mTileLifecycleManager);
Provider<Handler> provider = () -> new Handler(mTestableLooper.getLooper());
QSTileHost host = new QSTileHost(mContext,
mStatusBarIconController,
mQSFactory,
new Handler(),
Looper.myLooper(),
provider.get(),
mTestableLooper.getLooper(),
mPluginManager,
mTunerService,
() -> mAutoTileManager,
@@ -140,7 +145,7 @@ public class TileServicesTest extends SysuiTestCase {
mock(CustomTileStatePersister.class),
mTileServiceRequestControllerBuilder,
mTileLifecycleManagerFactory);
mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher,
mTileService = new TestTileServices(host, provider, mBroadcastDispatcher,
mUserTracker, mKeyguardStateController);
}
@@ -226,10 +231,10 @@ public class TileServicesTest extends SysuiTestCase {
}
private class TestTileServices extends TileServices {
TestTileServices(QSTileHost host, Looper looper,
TestTileServices(QSTileHost host, Provider<Handler> handlerProvider,
BroadcastDispatcher broadcastDispatcher, UserTracker userTracker,
KeyguardStateController keyguardStateController) {
super(host, looper, broadcastDispatcher, userTracker, keyguardStateController);
super(host, handlerProvider, broadcastDispatcher, userTracker, keyguardStateController);
}
@Override