1 /* 2 * Copyright (C) 2017 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 17 package com.android.settings.applications.manageapplications; 18 19 import android.support.annotation.IntDef; 20 21 import com.android.settings.R; 22 import com.android.settings.applications.AppStateInstallAppsBridge; 23 import com.android.settings.applications.AppStateNotificationBridge; 24 import com.android.settings.applications.AppStateOverlayBridge; 25 import com.android.settings.applications.AppStatePowerBridge; 26 import com.android.settings.applications.AppStateDirectoryAccessBridge; 27 import com.android.settings.applications.AppStateUsageBridge; 28 import com.android.settings.applications.AppStateWriteSettingsBridge; 29 import com.android.settings.wifi.AppStateChangeWifiStateBridge; 30 import com.android.settingslib.applications.ApplicationsState; 31 32 /** 33 * A registry and helper class that manages all {@link AppFilterItem}s for ManageApplications UI. 34 */ 35 public class AppFilterRegistry { 36 37 @IntDef(value = { 38 FILTER_APPS_POWER_WHITELIST, 39 FILTER_APPS_POWER_WHITELIST_ALL, 40 FILTER_APPS_ALL, 41 FILTER_APPS_ENABLED, 42 FILTER_APPS_INSTANT, 43 FILTER_APPS_DISABLED, 44 FILTER_APPS_RECENT, 45 FILTER_APPS_FREQUENT, 46 FILTER_APPS_PERSONAL, 47 FILTER_APPS_WORK, 48 FILTER_APPS_USAGE_ACCESS, 49 FILTER_APPS_WITH_OVERLAY, 50 FILTER_APPS_WRITE_SETTINGS, 51 FILTER_APPS_INSTALL_SOURCES, 52 }) 53 @interface FilterType { 54 } 55 56 // Filter options used for displayed list of applications 57 // Filters will appear sorted based on their value defined here. 58 public static final int FILTER_APPS_POWER_WHITELIST = 0; 59 public static final int FILTER_APPS_POWER_WHITELIST_ALL = 1; 60 public static final int FILTER_APPS_ALL = 2; 61 public static final int FILTER_APPS_ENABLED = 3; 62 public static final int FILTER_APPS_INSTANT = 4; 63 public static final int FILTER_APPS_DISABLED = 5; 64 public static final int FILTER_APPS_RECENT = 6; 65 public static final int FILTER_APPS_FREQUENT = 7; 66 public static final int FILTER_APPS_PERSONAL = 8; 67 public static final int FILTER_APPS_WORK = 9; 68 public static final int FILTER_APPS_USAGE_ACCESS = 10; 69 public static final int FILTER_APPS_WITH_OVERLAY = 11; 70 public static final int FILTER_APPS_WRITE_SETTINGS = 12; 71 public static final int FILTER_APPS_INSTALL_SOURCES = 13; 72 public static final int FILTER_APP_HAS_DIRECTORY_ACCESS = 14; 73 public static final int FILTER_APP_CAN_CHANGE_WIFI_STATE = 15; 74 // Next id: 16 75 76 private static AppFilterRegistry sRegistry; 77 78 private final AppFilterItem[] mFilters; 79 80 private AppFilterRegistry() { 81 mFilters = new AppFilterItem[16]; 82 83 // High power whitelist, on 84 mFilters[FILTER_APPS_POWER_WHITELIST] = new AppFilterItem( 85 new ApplicationsState.CompoundFilter( 86 AppStatePowerBridge.FILTER_POWER_WHITELISTED, 87 ApplicationsState.FILTER_ALL_ENABLED), 88 FILTER_APPS_POWER_WHITELIST, 89 R.string.high_power_filter_on); 90 91 // Without disabled until used 92 mFilters[FILTER_APPS_POWER_WHITELIST_ALL] = new AppFilterItem( 93 new ApplicationsState.CompoundFilter( 94 ApplicationsState.FILTER_WITHOUT_DISABLED_UNTIL_USED, 95 ApplicationsState.FILTER_ALL_ENABLED), 96 FILTER_APPS_POWER_WHITELIST_ALL, 97 R.string.filter_all_apps); 98 99 // All apps 100 mFilters[FILTER_APPS_ALL] = new AppFilterItem( 101 ApplicationsState.FILTER_EVERYTHING, 102 FILTER_APPS_ALL, 103 R.string.filter_all_apps); 104 105 // Enabled 106 mFilters[FILTER_APPS_ENABLED] = new AppFilterItem( 107 ApplicationsState.FILTER_ALL_ENABLED, 108 FILTER_APPS_ENABLED, 109 R.string.filter_enabled_apps); 110 111 // Disabled 112 mFilters[FILTER_APPS_DISABLED] = new AppFilterItem( 113 ApplicationsState.FILTER_DISABLED, 114 FILTER_APPS_DISABLED, 115 R.string.filter_apps_disabled); 116 117 // Instant 118 mFilters[FILTER_APPS_INSTANT] = new AppFilterItem( 119 ApplicationsState.FILTER_INSTANT, 120 FILTER_APPS_INSTANT, 121 R.string.filter_instant_apps); 122 123 // Recent Notifications 124 mFilters[FILTER_APPS_RECENT] = new AppFilterItem( 125 AppStateNotificationBridge.FILTER_APP_NOTIFICATION_RECENCY, 126 FILTER_APPS_RECENT, 127 R.string.sort_order_recent_notification); 128 129 // Frequent Notifications 130 mFilters[FILTER_APPS_FREQUENT] = new AppFilterItem( 131 AppStateNotificationBridge.FILTER_APP_NOTIFICATION_FREQUENCY, 132 FILTER_APPS_FREQUENT, 133 R.string.sort_order_frequent_notification); 134 135 // Personal 136 mFilters[FILTER_APPS_PERSONAL] = new AppFilterItem( 137 ApplicationsState.FILTER_PERSONAL, 138 FILTER_APPS_PERSONAL, 139 R.string.filter_personal_apps); 140 141 // Work 142 mFilters[FILTER_APPS_WORK] = new AppFilterItem( 143 ApplicationsState.FILTER_WORK, 144 FILTER_APPS_WORK, 145 R.string.filter_work_apps); 146 147 // Usage access screen, never displayed. 148 mFilters[FILTER_APPS_USAGE_ACCESS] = new AppFilterItem( 149 AppStateUsageBridge.FILTER_APP_USAGE, 150 FILTER_APPS_USAGE_ACCESS, 151 R.string.filter_all_apps); 152 153 // Apps that can draw overlays 154 mFilters[FILTER_APPS_WITH_OVERLAY] = new AppFilterItem( 155 AppStateOverlayBridge.FILTER_SYSTEM_ALERT_WINDOW, 156 FILTER_APPS_WITH_OVERLAY, 157 R.string.filter_overlay_apps); 158 159 // Apps that can write system settings 160 mFilters[FILTER_APPS_WRITE_SETTINGS] = new AppFilterItem( 161 AppStateWriteSettingsBridge.FILTER_WRITE_SETTINGS, 162 FILTER_APPS_WRITE_SETTINGS, 163 R.string.filter_write_settings_apps); 164 165 // Apps that are trusted sources of apks 166 mFilters[FILTER_APPS_INSTALL_SOURCES] = new AppFilterItem( 167 AppStateInstallAppsBridge.FILTER_APP_SOURCES, 168 FILTER_APPS_INSTALL_SOURCES, 169 R.string.filter_install_sources_apps); 170 171 // Apps that interacted with directory access permissions (A.K.A. Scoped Directory Access) 172 mFilters[FILTER_APP_HAS_DIRECTORY_ACCESS] = new AppFilterItem( 173 AppStateDirectoryAccessBridge.FILTER_APP_HAS_DIRECTORY_ACCESS, 174 FILTER_APP_HAS_DIRECTORY_ACCESS, 175 R.string.filter_install_sources_apps); 176 177 mFilters[FILTER_APP_CAN_CHANGE_WIFI_STATE] = new AppFilterItem( 178 AppStateChangeWifiStateBridge.FILTER_CHANGE_WIFI_STATE, 179 FILTER_APP_CAN_CHANGE_WIFI_STATE, 180 R.string.filter_write_settings_apps); 181 } 182 183 public static AppFilterRegistry getInstance() { 184 if (sRegistry == null) { 185 sRegistry = new AppFilterRegistry(); 186 } 187 return sRegistry; 188 } 189 190 @FilterType 191 public int getDefaultFilterType(int listType) { 192 switch (listType) { 193 case ManageApplications.LIST_TYPE_USAGE_ACCESS: 194 return FILTER_APPS_USAGE_ACCESS; 195 case ManageApplications.LIST_TYPE_HIGH_POWER: 196 return FILTER_APPS_POWER_WHITELIST; 197 case ManageApplications.LIST_TYPE_OVERLAY: 198 return FILTER_APPS_WITH_OVERLAY; 199 case ManageApplications.LIST_TYPE_WRITE_SETTINGS: 200 return FILTER_APPS_WRITE_SETTINGS; 201 case ManageApplications.LIST_TYPE_MANAGE_SOURCES: 202 return FILTER_APPS_INSTALL_SOURCES; 203 case ManageApplications.LIST_TYPE_DIRECTORY_ACCESS: 204 return FILTER_APP_HAS_DIRECTORY_ACCESS; 205 case ManageApplications.LIST_TYPE_WIFI_ACCESS: 206 return FILTER_APP_CAN_CHANGE_WIFI_STATE; 207 case ManageApplications.LIST_TYPE_NOTIFICATION: 208 return FILTER_APPS_RECENT; 209 default: 210 return FILTER_APPS_ALL; 211 } 212 } 213 214 public AppFilterItem get(@FilterType int filterType) { 215 return mFilters[filterType]; 216 } 217 } 218