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

Commit e71e6695 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Catch exception when loadApps()

Since no method to recover from DeadObjectException.

Fix: 326333091
Test: manual - on App Settings
Test: unit test
Change-Id: I042868a4c348395fca81217092ab4c91603698ab
parent 09b53269
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.pm.PackageManager
import android.content.pm.PackageManager.ApplicationInfoFlags
import android.content.pm.ResolveInfo
import android.os.SystemProperties
import android.util.Log
import com.android.internal.R
import com.android.settingslib.spaprivileged.framework.common.userManager
import kotlinx.coroutines.async
@@ -85,7 +86,8 @@ class AppListRepositoryImpl(
        userId: Int,
        loadInstantApps: Boolean,
        matchAnyUserForAdmin: Boolean,
    ): List<ApplicationInfo> = coroutineScope {
    ): List<ApplicationInfo> = try {
        coroutineScope {
            val hiddenSystemModulesDeferred = async { packageManager.getHiddenSystemModules() }
            val hideWhenDisabledPackagesDeferred = async {
                context.resources.getStringArray(R.array.config_hideWhenDisabled_packageNames)
@@ -99,6 +101,10 @@ class AppListRepositoryImpl(
                app.isInAppList(loadInstantApps, hiddenSystemModules, hideWhenDisabledPackages)
            }
        }
    } catch (e: Exception) {
        Log.e(TAG, "loadApps failed", e)
        emptyList()
    }

    private suspend fun getInstalledApplications(
        userId: Int,
@@ -210,6 +216,8 @@ class AppListRepositoryImpl(
    }

    companion object {
        private const val TAG = "AppListRepository"

        private fun ApplicationInfo.isInAppList(
            showInstantApps: Boolean,
            hiddenSystemModules: Set<String>,
+16 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.content.pm.PackageManager.ResolveInfoFlags
import android.content.pm.ResolveInfo
import android.content.pm.UserInfo
import android.content.res.Resources
import android.os.BadParcelableException
import android.os.DeadObjectException
import android.os.UserManager
import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.core.app.ApplicationProvider
@@ -44,6 +46,7 @@ import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.doThrow
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
@@ -310,6 +313,19 @@ class AppListRepositoryTest {
        assertThat(appList).containsExactly(NORMAL_APP, HIDDEN_APEX_APP)
    }

    @Test
    fun loadApps_hasException_returnEmptyList() = runTest {
        packageManager.stub {
            on {
                getInstalledApplicationsAsUser(any<ApplicationInfoFlags>(), eq(ADMIN_USER_ID))
            } doThrow BadParcelableException(DeadObjectException())
        }

        val appList = repository.loadApps(userId = ADMIN_USER_ID)

        assertThat(appList).isEmpty()
    }

    @Test
    fun showSystemPredicate_showSystem() = runTest {
        val app = SYSTEM_APP