1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 @file:Suppress("DEPRECATION") 17 18 package com.android.permissioncontroller.permission.ui.auto 19 20 import android.app.Application 21 import android.os.Bundle 22 import android.os.UserHandle 23 import androidx.preference.Preference 24 import androidx.preference.PreferenceCategory 25 import com.android.car.ui.utils.ViewUtils 26 import com.android.car.ui.utils.ViewUtils.LazyLayoutView 27 import com.android.permissioncontroller.R 28 import com.android.permissioncontroller.auto.AutoSettingsFrameFragment 29 import com.android.permissioncontroller.hibernation.isHibernationEnabled 30 import com.android.permissioncontroller.permission.ui.UnusedAppsFragment 31 import com.android.permissioncontroller.permission.ui.UnusedAppsFragment.Companion.INFO_MSG_CATEGORY 32 33 /** 34 * Auto wrapper, with customizations, around [UnusedAppsFragment]. 35 */ 36 class AutoUnusedAppsFragment : AutoSettingsFrameFragment(), 37 UnusedAppsFragment.Parent<AutoUnusedAppsPreference> { 38 39 companion object { 40 private const val UNUSED_PREFERENCE_KEY = "unused_pref_row_key" 41 42 /** Create a new instance of this fragment. */ 43 @JvmStatic newInstancenull44 fun newInstance(): AutoUnusedAppsFragment { 45 return AutoUnusedAppsFragment() 46 } 47 } 48 onCreatePreferencesnull49 override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 50 // Preferences will be added via shared logic in [UnusedAppsFragment]. 51 } 52 onActivityCreatednull53 override fun onActivityCreated(savedInstanceState: Bundle?) { 54 super.onActivityCreated(savedInstanceState) 55 if (savedInstanceState == null) { 56 val fragment: 57 UnusedAppsFragment<AutoUnusedAppsFragment, AutoUnusedAppsPreference> = 58 UnusedAppsFragment.newInstance() 59 fragment.arguments = arguments 60 // child fragment does not have its own UI - it will add to the preferences of this 61 // parent fragment 62 childFragmentManager.beginTransaction() 63 .add(fragment, null) 64 .commit() 65 } 66 67 // initially focus on focus parking view and then shift focus to recyclerview once it has 68 // loaded 69 ViewUtils.hideFocus(getCarUiRecyclerView().getView().getRootView()) 70 val lazyLayoutView = getCarUiRecyclerView() as LazyLayoutView 71 ViewUtils.initFocus(lazyLayoutView) 72 } 73 createFooterPreferencenull74 override fun createFooterPreference(): Preference { 75 val preference = Preference(context!!) 76 if (isHibernationEnabled()) { 77 preference.summary = getString(R.string.unused_apps_page_summary) 78 } else { 79 preference.summary = """ 80 ${getString(R.string.auto_revoked_apps_page_summary)} 81 ${getString(R.string.auto_revoke_open_app_message)} 82 """.trimIndent() 83 } 84 preference.setIcon(R.drawable.ic_info_outline) 85 preference.isSelectable = false 86 return preference 87 } 88 setLoadingStatenull89 override fun setLoadingState(loading: Boolean, animate: Boolean) { 90 setLoading(false) 91 } 92 createUnusedAppPrefnull93 override fun createUnusedAppPref( 94 app: Application, 95 packageName: String, 96 user: UserHandle 97 ): AutoUnusedAppsPreference { 98 return AutoUnusedAppsPreference(app, packageName, user, requireContext()) 99 } 100 setTitlenull101 override fun setTitle(title: CharSequence) { 102 headerLabel = title 103 } 104 setEmptyStatenull105 override fun setEmptyState(empty: Boolean) { 106 val infoMsgCategory = 107 preferenceScreen.findPreference<PreferenceCategory>(INFO_MSG_CATEGORY)!! 108 val noUnusedAppsPreference: Preference? = 109 infoMsgCategory.findPreference<Preference>(UNUSED_PREFERENCE_KEY) 110 if (empty && noUnusedAppsPreference == null) { 111 infoMsgCategory.addPreference(createNoUnusedAppsPreference()) 112 } else if (noUnusedAppsPreference != null) { 113 noUnusedAppsPreference.setVisible(empty) 114 } 115 } 116 createNoUnusedAppsPreferencenull117 private fun createNoUnusedAppsPreference(): Preference { 118 val preference = Preference(context!!) 119 preference.title = getString(R.string.zero_unused_apps) 120 preference.key = UNUSED_PREFERENCE_KEY 121 preference.isSelectable = false 122 preference.order = 0 123 return preference 124 } 125 } 126