Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2ccb62e authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

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
parent 050627e4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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();
                }
+41 −0
Original line number Diff line number Diff line
@@ -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()
    }
}
 No newline at end of file
+13 −1
Original line number Diff line number Diff line
@@ -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) {