Home | History | Annotate | Download | only in manageapplications
      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