Add InteractAcrossProfilesDetailsPreference for Spa

To try:
1. adb shell am start -n com.android.settings/.spa.SpaActivity
2. Go to Apps -> All apps -> [One App] -> Connected work & personal apps

Bug: 236346018
Test: Unit test & Manual with Settings App
Change-Id: I4145ffdb46da6e0c4b7b5103207e7b75a8bbfb6a
This commit is contained in:
Chaohui Wang
2022-10-31 15:41:44 +08:00
parent 1e45e38c02
commit 49b7ebeb23
4 changed files with 226 additions and 3 deletions

View File

@@ -402,8 +402,7 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
* @return the summary for the current state of whether the app associated with the given
* {@code packageName} is allowed to interact across profiles.
*/
public static CharSequence getPreferenceSummary(
Context context, String packageName) {
public static String getPreferenceSummary(Context context, String packageName) {
return context.getString(isInteractAcrossProfilesEnabled(context, packageName)
? R.string.interact_across_profiles_summary_allowed
: R.string.interact_across_profiles_summary_not_allowed);

View File

@@ -115,7 +115,7 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) {
ModifySystemSettingsAppListProvider.InfoPageEntryItem(app)
PictureInPictureListProvider.InfoPageEntryItem(app)
InstallUnknownAppsListProvider.InfoPageEntryItem(app)
// TODO: interact_across_profiles
InteractAcrossProfilesDetailsPreference(app)
AlarmsAndRemindersAppListProvider.InfoPageEntryItem(app)
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.spa.app.appinfo
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.android.settings.R
import com.android.settings.applications.appinfo.AppInfoDashboardFragment
import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetails
import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spaprivileged.framework.common.crossProfileApps
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
@Composable
fun InteractAcrossProfilesDetailsPreference(app: ApplicationInfo) {
val context = LocalContext.current
val presenter = remember { InteractAcrossProfilesDetailsPresenter(context, app) }
if (!presenter.isAvailableFlow.collectAsStateWithLifecycle(initialValue = false).value) return
Preference(object : PreferenceModel {
override val title = stringResource(R.string.interact_across_profiles_title)
override val summary = presenter.summaryFlow.collectAsStateWithLifecycle(
initialValue = stringResource(R.string.summary_placeholder),
)
override val onClick = presenter::startActivity
})
}
private class InteractAcrossProfilesDetailsPresenter(
private val context: Context,
private val app: ApplicationInfo,
) {
private val crossProfileApps = context.crossProfileApps
val isAvailableFlow = flow {
emit(crossProfileApps.canUserAttemptToConfigureInteractAcrossProfiles(app.packageName))
}.flowOn(Dispatchers.IO)
val summaryFlow = flow {
emit(InteractAcrossProfilesDetails.getPreferenceSummary(context, app.packageName))
}.flowOn(Dispatchers.IO)
fun startActivity() {
AppInfoDashboardFragment.startAppInfoFragment(
InteractAcrossProfilesDetails::class.java,
app,
context,
AppInfoSettingsProvider.METRICS_CATEGORY,
)
}
}