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.compose.stateOf 28 import com.android.settingslib.spa.framework.util.filterItem 29 import com.android.settingslib.spa.framework.util.mapItem 30 import com.android.settingslib.spaprivileged.model.app.AppListModel 31 import com.android.settingslib.spaprivileged.model.app.AppRecord 32 import com.android.settingslib.spaprivileged.model.app.hasFlag 33 import com.android.settingslib.spaprivileged.model.app.userHandle 34 import com.android.settingslib.spaprivileged.template.app.AppListItem 35 import com.android.settingslib.spaprivileged.template.app.AppListItemModel 36 import kotlinx.coroutines.flow.Flow 37 38 data class PlatformCompatAppRecord( 39 override val app: ApplicationInfo, 40 ) : AppRecord 41 42 class PlatformCompatAppListModel( 43 private val context: Context, 44 ) : AppListModel<PlatformCompatAppRecord> { 45 46 override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = 47 appListFlow.mapItem(::PlatformCompatAppRecord) 48 49 override fun filter( 50 userIdFlow: Flow<Int>, option: Int, recordListFlow: Flow<List<PlatformCompatAppRecord>>, 51 ) = recordListFlow.filterItem { record -> 52 Build.IS_DEBUGGABLE || record.app.hasFlag(ApplicationInfo.FLAG_DEBUGGABLE) 53 } 54 55 @Composable 56 override fun getSummary(option: Int, record: PlatformCompatAppRecord) = 57 stateOf(record.app.packageName) 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