AppFilterRegistry.java revision ff9500d0f99ac89e44772b8fbc93aa74c68760d8
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
17package com.android.settings.applications.manageapplications;
18
19import android.support.annotation.IntDef;
20
21import com.android.settings.R;
22import com.android.settings.applications.AppStateInstallAppsBridge;
23import com.android.settings.applications.AppStateNotificationBridge;
24import com.android.settings.applications.AppStateOverlayBridge;
25import com.android.settings.applications.AppStatePowerBridge;
26import com.android.settings.applications.AppStateDirectoryAccessBridge;
27import com.android.settings.applications.AppStateUsageBridge;
28import com.android.settings.applications.AppStateWriteSettingsBridge;
29import com.android.settings.wifi.AppStateChangeWifiStateBridge;
30import com.android.settingslib.applications.ApplicationsState;
31
32/**
33 * A registry and helper class that manages all {@link AppFilterItem}s for ManageApplications UI.
34 */
35public 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