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