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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user