diff options
author | 2022-03-16 08:45:21 +0000 | |
---|---|---|
committer | 2022-03-16 08:45:21 +0000 | |
commit | 49aeec991f527ff50a7d66853d6b14f823a16fe1 (patch) | |
tree | 33dca87d2ea5e9da6451095410c4b72f97995c97 | |
parent | 9ae58f5403d6d249989fc7f2e8e77b4595cde038 (diff) | |
parent | 5261cebc1db082f820b90f5d9745dc08b9a24a6a (diff) |
Merge "Add TvUnusedAppsFragment to PermissionController" into tm-dev
3 files changed, 166 insertions, 1 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java index ecf9c00ea..d83714422 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java @@ -66,6 +66,7 @@ import com.android.permissioncontroller.permission.ui.handheld.PermissionAppsFra import com.android.permissioncontroller.permission.ui.handheld.dashboard.PermissionDetailsWrapperFragment; import com.android.permissioncontroller.permission.ui.handheld.dashboard.PermissionUsageV2WrapperFragment; import com.android.permissioncontroller.permission.ui.legacy.AppPermissionActivity; +import com.android.permissioncontroller.permission.ui.television.TvUnusedAppsFragment; import com.android.permissioncontroller.permission.ui.wear.AppPermissionsFragmentWear; import com.android.permissioncontroller.permission.utils.KotlinUtils; import com.android.permissioncontroller.permission.utils.Utils; @@ -375,7 +376,10 @@ public final class ManagePermissionsActivity extends SettingsActivity { if (DeviceUtils.isAuto(this)) { androidXFragment = AutoUnusedAppsFragment.newInstance(); androidXFragment.setArguments(UnusedAppsFragment.createArgs(sessionId)); - } else if (DeviceUtils.isWear(this) || DeviceUtils.isTelevision(this)) { + } else if (DeviceUtils.isTelevision(this)) { + androidXFragment = TvUnusedAppsFragment.newInstance(); + androidXFragment.setArguments(UnusedAppsFragment.createArgs(sessionId)); + } else if (DeviceUtils.isWear(this)) { androidXFragment = HandheldUnusedAppsWrapperFragment.newInstance(); androidXFragment.setArguments(UnusedAppsFragment.createArgs(sessionId)); } else { diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt new file mode 100644 index 000000000..6caaa7420 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt @@ -0,0 +1,112 @@ +/* + * 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.permissioncontroller.permission.ui.television + +import android.app.Application +import android.os.Bundle +import android.os.UserHandle +import androidx.preference.Preference +import androidx.preference.PreferenceCategory +import com.android.permissioncontroller.R +import com.android.permissioncontroller.hibernation.isHibernationEnabled +import com.android.permissioncontroller.permission.ui.UnusedAppsFragment +import com.android.permissioncontroller.permission.ui.UnusedAppsFragment.Companion.INFO_MSG_CATEGORY + +/** + * TV wrapper, with customizations, around [UnusedAppsFragment]. + */ +class TvUnusedAppsFragment : SettingsWithHeader(), + UnusedAppsFragment.Parent<TvUnusedAppsPreference> { + + companion object { + private const val UNUSED_PREFERENCE_KEY = "unused_pref_row_key" + + /** Create a new instance of this fragment. */ + @JvmStatic + fun newInstance(): TvUnusedAppsFragment { + return TvUnusedAppsFragment() + } + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + // Preferences will be added via shared logic in [UnusedAppsFragment]. + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + if (savedInstanceState == null) { + val fragment: + UnusedAppsFragment<TvUnusedAppsFragment, TvUnusedAppsPreference> = + UnusedAppsFragment.newInstance() + fragment.arguments = arguments + // child fragment does not have its own UI - it will add to the preferences of this + // parent fragment + childFragmentManager.beginTransaction() + .add(fragment, null) + .commit() + } + } + + override fun createFooterPreference(): Preference { + val preference = Preference(context) + if (isHibernationEnabled()) { + preference.summary = getString(R.string.unused_apps_page_summary) + } else { + preference.summary = + getString(R.string.auto_revoked_apps_page_summary) + } + preference.setIcon(R.drawable.ic_info_outline) + preference.isSelectable = false + return preference + } + + override fun setLoadingState(loading: Boolean, animate: Boolean) { + setLoading(loading, animate) + } + + override fun createUnusedAppPref( + app: Application, + packageName: String, + user: UserHandle + ): TvUnusedAppsPreference { + return TvUnusedAppsPreference(app, packageName, user, requireContext()) + } + + override fun setTitle(title: CharSequence) { + setHeader(null, null, null, title) + } + + override fun setEmptyState(empty: Boolean) { + val infoMsgCategory = + preferenceScreen.findPreference<PreferenceCategory>(INFO_MSG_CATEGORY)!! + val noUnusedAppsPreference: Preference? = + infoMsgCategory.findPreference<Preference>(UNUSED_PREFERENCE_KEY) + if (empty && noUnusedAppsPreference == null) { + infoMsgCategory.addPreference(createNoUnusedAppsPreference()) + } else if (noUnusedAppsPreference != null) { + noUnusedAppsPreference.setVisible(empty) + } + } + + private fun createNoUnusedAppsPreference(): Preference { + val preference = Preference(context) + preference.title = getString(R.string.zero_unused_apps) + preference.key = UNUSED_PREFERENCE_KEY + preference.isSelectable = false + preference.order = 0 + return preference + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsPreference.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsPreference.kt new file mode 100644 index 000000000..23f4a4589 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsPreference.kt @@ -0,0 +1,49 @@ +/* + * 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.permissioncontroller.permission.ui.television + +import androidx.preference.Preference +import android.app.Application +import android.content.Context +import android.os.UserHandle +import com.android.permissioncontroller.permission.ui.RemovablePref +import com.android.permissioncontroller.permission.utils.KotlinUtils + +/** + * A TV-styled preference which represents an app that has been auto revoked. Has the app icon and + * label, as well as a button to open the app. + * + * @param app The current application + * @param packageName The name of the package whose icon this preference will retrieve + * @param user The user whose package icon will be retrieved + * @param context The current context + */ +class TvUnusedAppsPreference( + app: Application, + packageName: String, + user: UserHandle, + context: Context +) : Preference(context), RemovablePref { + + init { + icon = KotlinUtils.getBadgedPackageIcon(app, packageName, user) + } + + override fun setRemoveClickRunnable(runnable: Runnable) { + // TV Settings don't have secondary icons and actions + } +} |