diff options
author | 2021-11-04 15:31:08 +0100 | |
---|---|---|
committer | 2022-03-02 22:25:18 +0000 | |
commit | 5261cebc1db082f820b90f5d9745dc08b9a24a6a (patch) | |
tree | f9acba1a41818c9228529af234a17605a2057a97 | |
parent | 65a265ff6c26ee927b5dfad07d55dfdcd23d894a (diff) |
Add TvUnusedAppsFragment to PermissionController
Add screen which shows hibernated apps. The screen can be opened from
TvSettings. The screen should only be visible if hibernation is
enabled on the device.
Gtv: http://screen/5cmU2dEm76LB75i.png
Atv: http://screen/6CcQyu7NJFhbNhX.png
Bug: 199453548
Test: m -j99 TvSettingsTwoPanel
Test: installmod TvSettingsTwoPanel
Test: adb shell device_config put app_hibernation app_hibernation_enabled true
Change-Id: Ia8d470c1233ec0c4712aeda86b30384cc7c35d45
(cherry picked from commit 25ab1e25092e48e4dd7095084d421fa1745c5084)
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 + } +} |