1 /* <lambda>null2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.spa.development.compat 18 19 import android.app.settings.SettingsEnums 20 import android.content.Context 21 import android.content.pm.ApplicationInfo 22 import android.os.Build 23 import androidx.compose.runtime.Composable 24 import androidx.core.os.bundleOf 25 import com.android.settings.core.SubSettingLauncher 26 import com.android.settings.development.compat.PlatformCompatDashboard 27 import com.android.settingslib.spa.framework.util.filterItem 28 import com.android.settingslib.spa.framework.util.mapItem 29 import com.android.settingslib.spaprivileged.model.app.AppListModel 30 import com.android.settingslib.spaprivileged.model.app.AppRecord 31 import com.android.settingslib.spaprivileged.model.app.hasFlag 32 import com.android.settingslib.spaprivileged.model.app.userHandle 33 import com.android.settingslib.spaprivileged.template.app.AppListItem 34 import com.android.settingslib.spaprivileged.template.app.AppListItemModel 35 import kotlinx.coroutines.flow.Flow 36 37 data class PlatformCompatAppRecord( 38 override val app: ApplicationInfo, 39 ) : AppRecord 40 41 class PlatformCompatAppListModel( 42 private val context: Context, 43 ) : AppListModel<PlatformCompatAppRecord> { 44 45 override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = 46 appListFlow.mapItem(::PlatformCompatAppRecord) 47 48 override fun filter( 49 userIdFlow: Flow<Int>, option: Int, recordListFlow: Flow<List<PlatformCompatAppRecord>>, 50 ) = recordListFlow.filterItem { record -> 51 Build.IS_DEBUGGABLE || record.app.hasFlag(ApplicationInfo.FLAG_DEBUGGABLE) 52 } 53 54 @Composable 55 override fun getSummary(option: Int, record: PlatformCompatAppRecord): () -> String = { 56 record.app.packageName 57 } 58 59 @Composable 60 override fun AppListItemModel<PlatformCompatAppRecord>.AppItem() { 61 AppListItem { navigateToAppCompat(app = record.app) } 62 } 63 64 private fun navigateToAppCompat(app: ApplicationInfo) { 65 SubSettingLauncher(context) 66 .setDestination(PlatformCompatDashboard::class.qualifiedName) 67 .setSourceMetricsCategory(SettingsEnums.DEVELOPMENT) 68 .setArguments(bundleOf(PlatformCompatDashboard.COMPAT_APP to app.packageName)) 69 .setUserHandle(app.userHandle) 70 .launch() 71 } 72 } 73