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

Commit 070303ac authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Properly check for secondary user ServiceInfo" into main

parents e908b21c 0003864b
Loading
Loading
Loading
Loading
+65 −1
Original line number Diff line number Diff line
@@ -280,9 +280,12 @@ class CustomTileRepositoryTest : SysuiTestCase() {
        }

    @Test
    fun isActiveFollowsPackageManagerAdapter() =
    fun isActiveFollowsPackageManagerAdapter_user0() =
        with(kosmos) {
            testScope.runTest {
                packageManagerAdapterFacade.setExclusiveForUser(0)

                underTest.updateWithDefaults(UserHandle.of(0), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsActive(false)
                assertThat(underTest.isTileActive()).isFalse()

@@ -295,6 +298,37 @@ class CustomTileRepositoryTest : SysuiTestCase() {
    fun isToggleableFollowsPackageManagerAdapter() =
        with(kosmos) {
            testScope.runTest {
                underTest.updateWithDefaults(UserHandle.of(0), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsToggleable(false)
                assertThat(underTest.isTileToggleable()).isFalse()

                packageManagerAdapterFacade.setIsToggleable(true)
                assertThat(underTest.isTileToggleable()).isTrue()
            }
        }

    @Test
    fun isActiveFollowsPackageManagerAdapter_user10_withAdapterForUser10() =
        with(kosmos) {
            testScope.runTest {
                packageManagerAdapterFacade.setExclusiveForUser(10)

                underTest.updateWithDefaults(UserHandle.of(10), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsActive(false)
                assertThat(underTest.isTileActive()).isFalse()

                packageManagerAdapterFacade.setIsActive(true)
                assertThat(underTest.isTileActive()).isTrue()
            }
        }

    @Test
    fun isToggleableFollowsPackageManagerAdapter_user10_withAdapterForUser10() =
        with(kosmos) {
            testScope.runTest {
                packageManagerAdapterFacade.setExclusiveForUser(10)

                underTest.updateWithDefaults(UserHandle.of(10), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsToggleable(false)
                assertThat(underTest.isTileToggleable()).isFalse()

@@ -303,6 +337,36 @@ class CustomTileRepositoryTest : SysuiTestCase() {
            }
        }

    @Test
    fun isActiveDoesntFollowPackageManagerAdapter_user10() =
        with(kosmos) {
            testScope.runTest {
                packageManagerAdapterFacade.setExclusiveForUser(0)

                underTest.updateWithDefaults(UserHandle.of(10), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsActive(false)
                assertThat(underTest.isTileActive()).isFalse()

                packageManagerAdapterFacade.setIsActive(true)
                assertThat(underTest.isTileActive()).isFalse()
            }
        }

    @Test
    fun isToggleableDoesntFollowPackageManagerAdapter_user10() =
        with(kosmos) {
            testScope.runTest {
                packageManagerAdapterFacade.setExclusiveForUser(0)

                underTest.updateWithDefaults(UserHandle.of(10), TEST_DEFAULTS_1, true)
                packageManagerAdapterFacade.setIsToggleable(false)
                assertThat(underTest.isTileToggleable()).isFalse()

                packageManagerAdapterFacade.setIsToggleable(true)
                assertThat(underTest.isTileToggleable()).isFalse()
            }
        }

    private companion object {

        val TEST_COMPONENT = ComponentName("test.pkg", "test.cls")
+3 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.RemoteException;

import androidx.annotation.Nullable;

import javax.inject.Inject;

// Adapter that wraps calls to PackageManager or IPackageManager for {@link TileLifecycleManager}.
@@ -45,6 +47,7 @@ public class PackageManagerAdapter {
        mIPackageManager = AppGlobals.getPackageManager();
    }

    @Nullable
    public ServiceInfo getServiceInfo(ComponentName className, int flags, int userId)
            throws RemoteException {
        return mIPackageManager.getServiceInfo(className, flags, userId);
+6 −6
Original line number Diff line number Diff line
@@ -188,10 +188,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
    public boolean isActiveTile() {
        try {
            ServiceInfo info = mPackageManagerAdapter.getServiceInfo(mIntent.getComponent(),
                    META_DATA_QUERY_FLAGS);
            return info.metaData != null
                    META_DATA_QUERY_FLAGS, mUser.getIdentifier());
            return info != null && info.metaData != null
                    && info.metaData.getBoolean(TileService.META_DATA_ACTIVE_TILE, false);
        } catch (PackageManager.NameNotFoundException e) {
        } catch (RemoteException e) {
            return false;
        }
    }
@@ -206,10 +206,10 @@ public class TileLifecycleManager extends BroadcastReceiver implements
    public boolean isToggleableTile() {
        try {
            ServiceInfo info = mPackageManagerAdapter.getServiceInfo(mIntent.getComponent(),
                    META_DATA_QUERY_FLAGS);
            return info.metaData != null
                    META_DATA_QUERY_FLAGS, mUser.getIdentifier());
            return info != null && info.metaData != null
                    && info.metaData.getBoolean(TileService.META_DATA_TOGGLEABLE_TILE, false);
        } catch (PackageManager.NameNotFoundException e) {
        } catch (RemoteException e) {
            return false;
        }
    }
+11 −9
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@
package com.android.systemui.qs.tiles.impl.custom.data.repository

import android.content.pm.PackageManager
import android.content.pm.ServiceInfo
import android.graphics.drawable.Icon
import android.os.RemoteException
import android.os.UserHandle
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
@@ -163,13 +163,14 @@ constructor(
    override suspend fun isTileActive(): Boolean =
        withContext(backgroundContext) {
            try {
                val info: ServiceInfo =
                val info =
                    packageManagerAdapter.getServiceInfo(
                        tileSpec.componentName,
                        META_DATA_QUERY_FLAGS
                        META_DATA_QUERY_FLAGS,
                        getCurrentTileWithUser()?.user?.identifier ?: UserHandle.USER_CURRENT,
                    )
                info.metaData?.getBoolean(TileService.META_DATA_ACTIVE_TILE, false) == true
            } catch (e: PackageManager.NameNotFoundException) {
                info?.metaData?.getBoolean(TileService.META_DATA_ACTIVE_TILE, false) == true
            } catch (e: RemoteException) {
                false
            }
        }
@@ -177,13 +178,14 @@ constructor(
    override suspend fun isTileToggleable(): Boolean =
        withContext(backgroundContext) {
            try {
                val info: ServiceInfo =
                val info =
                    packageManagerAdapter.getServiceInfo(
                        tileSpec.componentName,
                        META_DATA_QUERY_FLAGS
                        META_DATA_QUERY_FLAGS,
                        getCurrentTileWithUser()?.user?.identifier ?: UserHandle.USER_CURRENT
                    )
                info.metaData?.getBoolean(TileService.META_DATA_TOGGLEABLE_TILE, false) == true
            } catch (e: PackageManager.NameNotFoundException) {
                info?.metaData?.getBoolean(TileService.META_DATA_TOGGLEABLE_TILE, false) == true
            } catch (e: RemoteException) {
                false
            }
        }
+131 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.systemui.Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX;

import static com.google.common.truth.Truth.assertThat;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;

@@ -50,6 +52,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.net.Uri;
import android.os.Bundle;
@@ -183,6 +186,40 @@ public class TileLifecycleManagerTest extends SysuiTestCase {
                .thenReturn(defaultPackageInfo);
    }

    private void setPackageInstalledForUser(
            boolean installed,
            boolean active,
            boolean toggleable,
            int user
    ) throws Exception {
        ServiceInfo defaultServiceInfo = null;
        if (installed) {
            defaultServiceInfo = new ServiceInfo();
            defaultServiceInfo.metaData = new Bundle();
            defaultServiceInfo.metaData.putBoolean(TileService.META_DATA_ACTIVE_TILE, active);
            defaultServiceInfo.metaData
                    .putBoolean(TileService.META_DATA_TOGGLEABLE_TILE, toggleable);
            when(mMockPackageManagerAdapter.getServiceInfo(any(), anyInt(), eq(user)))
                    .thenReturn(defaultServiceInfo);
            if (user == 0) {
                when(mMockPackageManagerAdapter.getServiceInfo(any(), anyInt()))
                        .thenReturn(defaultServiceInfo);
            }
            PackageInfo defaultPackageInfo = new PackageInfo();
            when(mMockPackageManagerAdapter.getPackageInfoAsUser(anyString(), anyInt(), eq(user)))
                    .thenReturn(defaultPackageInfo);
        } else {
            when(mMockPackageManagerAdapter.getServiceInfo(any(), anyInt(), eq(user)))
                    .thenReturn(null);
            if (user == 0) {
                when(mMockPackageManagerAdapter.getServiceInfo(any(), anyInt()))
                        .thenThrow(new PackageManager.NameNotFoundException());
            }
            when(mMockPackageManagerAdapter.getPackageInfoAsUser(anyString(), anyInt(), eq(user)))
                    .thenThrow(new PackageManager.NameNotFoundException());
        }
    }

    private void verifyBind(int times) {
        assertEquals(times > 0, mContext.isBound(mTileServiceComponentName));
    }
@@ -557,6 +594,100 @@ public class TileLifecycleManagerTest extends SysuiTestCase {
        verify(mockContext).unbindService(captor.getValue());
    }

    @Test
    public void testIsActive_user0_packageInstalled() throws Exception {
        setPackageInstalledForUser(true, true, false, 0);
        mUser = UserHandle.of(0);

        TileLifecycleManager manager = new TileLifecycleManager(mHandler, mWrappedContext,
                mock(IQSService.class),
                mMockPackageManagerAdapter,
                mMockBroadcastDispatcher,
                mTileServiceIntent,
                mUser,
                mActivityManager,
                mDeviceIdleController,
                mExecutor);

        assertThat(manager.isActiveTile()).isTrue();
    }

    @Test
    public void testIsActive_user10_packageInstalled_notForUser0() throws Exception {
        setPackageInstalledForUser(true, true, false, 10);
        setPackageInstalledForUser(false, false, false, 0);
        mUser = UserHandle.of(10);

        TileLifecycleManager manager = new TileLifecycleManager(mHandler, mWrappedContext,
                mock(IQSService.class),
                mMockPackageManagerAdapter,
                mMockBroadcastDispatcher,
                mTileServiceIntent,
                mUser,
                mActivityManager,
                mDeviceIdleController,
                mExecutor);

        assertThat(manager.isActiveTile()).isTrue();
    }

    @Test
    public void testIsToggleable_user0_packageInstalled() throws Exception {
        setPackageInstalledForUser(true, false, true, 0);
        mUser = UserHandle.of(0);

        TileLifecycleManager manager = new TileLifecycleManager(mHandler, mWrappedContext,
                mock(IQSService.class),
                mMockPackageManagerAdapter,
                mMockBroadcastDispatcher,
                mTileServiceIntent,
                mUser,
                mActivityManager,
                mDeviceIdleController,
                mExecutor);

        assertThat(manager.isToggleableTile()).isTrue();
    }

    @Test
    public void testIsToggleable_user10_packageInstalled_notForUser0() throws Exception {
        setPackageInstalledForUser(true, false, true, 10);
        setPackageInstalledForUser(false, false, false, 0);
        mUser = UserHandle.of(10);

        TileLifecycleManager manager = new TileLifecycleManager(mHandler, mWrappedContext,
                mock(IQSService.class),
                mMockPackageManagerAdapter,
                mMockBroadcastDispatcher,
                mTileServiceIntent,
                mUser,
                mActivityManager,
                mDeviceIdleController,
                mExecutor);

        assertThat(manager.isToggleableTile()).isTrue();
    }

    @Test
    public void testIsToggleableActive_installedForDifferentUser() throws Exception {
        setPackageInstalledForUser(true, false, false, 10);
        setPackageInstalledForUser(false, true, true, 0);
        mUser = UserHandle.of(10);

        TileLifecycleManager manager = new TileLifecycleManager(mHandler, mWrappedContext,
                mock(IQSService.class),
                mMockPackageManagerAdapter,
                mMockBroadcastDispatcher,
                mTileServiceIntent,
                mUser,
                mActivityManager,
                mDeviceIdleController,
                mExecutor);

        assertThat(manager.isToggleableTile()).isFalse();
        assertThat(manager.isActiveTile()).isFalse();
    }

    private void mockChangeEnabled(long changeId, boolean enabled) {
        doReturn(enabled).when(() -> CompatChanges.isChangeEnabled(eq(changeId), anyString(),
                any(UserHandle.class)));
Loading