summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mmikoda <mmikoda@google.com> 2021-11-04 15:31:08 +0100
committer Jingjiang Li <jingjiangli@google.com> 2022-03-02 22:25:18 +0000
commit5261cebc1db082f820b90f5d9745dc08b9a24a6a (patch)
treef9acba1a41818c9228529af234a17605a2057a97
parent65a265ff6c26ee927b5dfad07d55dfdcd23d894a (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)
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsFragment.kt112
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/television/TvUnusedAppsPreference.kt49
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
+ }
+}