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