Make active tiles always listen on creation
When a CustomTile corresponding to an active tile is created (either on process start or on user switch), perform one round of startListening/stopListening. This makes sure that the TileService has an opportunity to refresh the information after a user switch without having to request it. Also, make `requestListeningState` called on the wrong user a noop. Fixes: 242194868 Test: atest CustomTileTest Test: manual using test TileService app Change-Id: I5aea6f849e7a75ff71df8fb6c0d242785e94b8c3
This commit is contained in:
@@ -506,7 +506,7 @@ public class TileService extends Service {
|
||||
* the calling package or if the calling user cannot act on behalf of the user from the
|
||||
* {@code context}.</li>
|
||||
* <li> {@link IllegalArgumentException} if the user of the {@code context} is not the
|
||||
* current user.</li>
|
||||
* current user. Only thrown for apps targeting {@link Build.VERSION_CODES#TIRAMISU}</li>
|
||||
* </ul>
|
||||
*/
|
||||
public static final void requestListeningState(Context context, ComponentName component) {
|
||||
|
||||
@@ -328,7 +328,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener
|
||||
if (listening) {
|
||||
updateDefaultTileAndIcon();
|
||||
refreshState();
|
||||
if (!mServiceManager.isActiveTile()) {
|
||||
if (!mServiceManager.isActiveTile() || !isTileReady()) {
|
||||
mServiceManager.setBindRequested(true);
|
||||
mService.onStartListening();
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import org.mockito.ArgumentMatchers.anyInt
|
||||
import org.mockito.ArgumentMatchers.anyString
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.`when`
|
||||
import org.mockito.Mockito.clearInvocations
|
||||
import org.mockito.Mockito.mock
|
||||
import org.mockito.Mockito.never
|
||||
import org.mockito.Mockito.reset
|
||||
@@ -351,4 +352,44 @@ class CustomTileTest : SysuiTestCase() {
|
||||
.startPendingIntentDismissingKeyguard(
|
||||
eq(pi), nullable(), nullable<ActivityLaunchAnimator.Controller>())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testActiveTileListensOnceAfterCreated() {
|
||||
`when`(tileServiceManager.isActiveTile).thenReturn(true)
|
||||
|
||||
val tile = CustomTile.create(customTileBuilder, TILE_SPEC, mContext)
|
||||
tile.initialize()
|
||||
tile.postStale()
|
||||
testableLooper.processAllMessages()
|
||||
|
||||
verify(tileServiceManager).setBindRequested(true)
|
||||
verify(tileService).onStartListening()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testActiveTileDoesntListenAfterFirstTime() {
|
||||
`when`(tileServiceManager.isActiveTile).thenReturn(true)
|
||||
|
||||
val tile = CustomTile.create(customTileBuilder, TILE_SPEC, mContext)
|
||||
tile.initialize()
|
||||
// Make sure we have an icon in the tile because we don't have a default icon
|
||||
// This should not be overridden by the retrieved tile that has null icon.
|
||||
tile.qsTile.icon = mock(Icon::class.java)
|
||||
`when`(tile.qsTile.icon.loadDrawable(any(Context::class.java)))
|
||||
.thenReturn(mock(Drawable::class.java))
|
||||
|
||||
tile.postStale()
|
||||
testableLooper.processAllMessages()
|
||||
|
||||
// postStale will set it to not listening after it's done
|
||||
verify(tileService).onStopListening()
|
||||
|
||||
clearInvocations(tileServiceManager, tileService)
|
||||
|
||||
tile.setListening(Any(), true)
|
||||
testableLooper.processAllMessages()
|
||||
|
||||
verify(tileServiceManager, never()).setBindRequested(true)
|
||||
verify(tileService, never()).onStartListening()
|
||||
}
|
||||
}
|
||||
@@ -152,6 +152,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
|
||||
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S_V2)
|
||||
static final long REQUEST_LISTENING_MUST_MATCH_PACKAGE = 172251878L;
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@ChangeId
|
||||
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
|
||||
static final long REQUEST_LISTENING_OTHER_USER_NOOP = 242194868L;
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
private final Handler mHandler = new Handler();
|
||||
@@ -1859,7 +1866,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
|
||||
|
||||
// Check current user
|
||||
if (userId != currentUser) {
|
||||
throw new IllegalArgumentException("User " + userId + " is not the current user.");
|
||||
if (CompatChanges.isChangeEnabled(REQUEST_LISTENING_OTHER_USER_NOOP, callingUid)) {
|
||||
return;
|
||||
} else {
|
||||
throw new IllegalArgumentException(
|
||||
"User " + userId + " is not the current user.");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mBar != null) {
|
||||
|
||||
Reference in New Issue
Block a user