summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
+ }
+}