summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java18
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java40
2 files changed, 51 insertions, 7 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index 5e4f53181706..42536fef17aa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -30,6 +30,7 @@ import android.service.quicksettings.IQSService;
import android.service.quicksettings.Tile;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.SparseArrayMap;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -64,7 +65,7 @@ public class TileServices extends IQSService.Stub {
private static final String TAG = "TileServices";
private final ArrayMap<CustomTile, TileServiceManager> mServices = new ArrayMap<>();
- private final ArrayMap<ComponentName, CustomTile> mTiles = new ArrayMap<>();
+ private final SparseArrayMap<ComponentName, CustomTile> mTiles = new SparseArrayMap<>();
private final ArrayMap<IBinder, CustomTile> mTokenMap = new ArrayMap<>();
private final Context mContext;
private final Handler mMainHandler;
@@ -112,10 +113,11 @@ public class TileServices extends IQSService.Stub {
public TileServiceManager getTileWrapper(CustomTile tile) {
ComponentName component = tile.getComponent();
+ int userId = tile.getUser();
TileServiceManager service = onCreateTileService(component, mBroadcastDispatcher);
synchronized (mServices) {
mServices.put(tile, service);
- mTiles.put(component, tile);
+ mTiles.add(userId, component, tile);
mTokenMap.put(service.getToken(), tile);
}
// Makes sure binding only happens after the maps have been populated
@@ -135,7 +137,7 @@ public class TileServices extends IQSService.Stub {
service.handleDestroy();
mServices.remove(tile);
mTokenMap.remove(service.getToken());
- mTiles.remove(tile.getComponent());
+ mTiles.delete(tile.getUser(), tile.getComponent());
final String slot = getStatusBarIconSlotName(tile.getComponent());
mMainHandler.post(() -> mStatusBarIconController.removeIconForTile(slot));
}
@@ -188,9 +190,10 @@ public class TileServices extends IQSService.Stub {
private void requestListening(ComponentName component) {
synchronized (mServices) {
- CustomTile customTile = getTileForComponent(component);
+ int userId = mUserTracker.getUserId();
+ CustomTile customTile = getTileForUserAndComponent(userId, component);
if (customTile == null) {
- Log.d("TileServices", "Couldn't find tile for " + component);
+ Log.d(TAG, "Couldn't find tile for " + component + "(" + userId + ")");
return;
}
TileServiceManager service = mServices.get(customTile);
@@ -362,9 +365,9 @@ public class TileServices extends IQSService.Stub {
}
@Nullable
- private CustomTile getTileForComponent(ComponentName component) {
+ private CustomTile getTileForUserAndComponent(int userId, ComponentName component) {
synchronized (mServices) {
- return mTiles.get(component);
+ return mTiles.get(userId, component);
}
}
@@ -395,4 +398,5 @@ public class TileServices extends IQSService.Stub {
return -Integer.compare(left.getBindPriority(), right.getBindPriority());
}
};
+
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
index 7e052bfa15d2..fb9336734d99 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java
@@ -54,6 +54,7 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -95,6 +96,8 @@ public class TileServicesTest extends SysuiTestCase {
private QSHost mQSHost;
@Mock
private PanelInteractor mPanelInteractor;
+ @Captor
+ private ArgumentCaptor<CommandQueue.Callbacks> mCallbacksArgumentCaptor;
@Before
public void setUp() throws Exception {
@@ -251,6 +254,41 @@ public class TileServicesTest extends SysuiTestCase {
verify(mPanelInteractor).forceCollapsePanels();
}
+ @Test
+ public void tileFreedForCorrectUser() throws RemoteException {
+ verify(mCommandQueue).addCallback(mCallbacksArgumentCaptor.capture());
+
+ ComponentName componentName = new ComponentName("pkg", "cls");
+ CustomTile tileUser0 = mock(CustomTile.class);
+ CustomTile tileUser1 = mock(CustomTile.class);
+
+ when(tileUser0.getComponent()).thenReturn(componentName);
+ when(tileUser1.getComponent()).thenReturn(componentName);
+ when(tileUser0.getUser()).thenReturn(0);
+ when(tileUser1.getUser()).thenReturn(1);
+
+ // Create a tile for user 0
+ TileServiceManager manager0 = mTileService.getTileWrapper(tileUser0);
+ when(manager0.isActiveTile()).thenReturn(true);
+ // Then create a tile for user 1
+ TileServiceManager manager1 = mTileService.getTileWrapper(tileUser1);
+ when(manager1.isActiveTile()).thenReturn(true);
+
+ // When the tile for user 0 gets freed
+ mTileService.freeService(tileUser0, manager0);
+ // and the user is 1
+ when(mUserTracker.getUserId()).thenReturn(1);
+
+ // a call to requestListeningState
+ mCallbacksArgumentCaptor.getValue().requestTileServiceListeningState(componentName);
+ mTestableLooper.processAllMessages();
+
+ // will call in the correct tile
+ verify(manager1).setBindRequested(true);
+ // and set it to listening
+ verify(manager1.getTileService()).onStartListening();
+ }
+
private class TestTileServices extends TileServices {
TestTileServices(QSHost host, Provider<Handler> handlerProvider,
BroadcastDispatcher broadcastDispatcher, UserTracker userTracker,
@@ -268,6 +306,8 @@ public class TileServicesTest extends SysuiTestCase {
when(manager.isLifecycleStarted()).thenReturn(true);
Binder b = new Binder();
when(manager.getToken()).thenReturn(b);
+ IQSTileService service = mock(IQSTileService.class);
+ when(manager.getTileService()).thenReturn(service);
return manager;
}
}