1 /* 2 * Copyright (C) 2015 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 package com.android.settings.applications; 17 18 import android.app.Activity; 19 import android.content.BroadcastReceiver; 20 import android.content.Intent; 21 import android.content.pm.ApplicationInfo; 22 import android.os.Bundle; 23 import android.os.AsyncTask; 24 import android.preference.Preference; 25 import android.provider.Settings; 26 27 import com.android.internal.logging.MetricsLogger; 28 import com.android.settings.R; 29 import com.android.settings.SettingsPreferenceFragment; 30 import com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback; 31 import com.android.settings.fuelgauge.PowerWhitelistBackend; 32 import com.android.settingslib.applications.ApplicationsState; 33 import com.android.settingslib.applications.ApplicationsState.AppEntry; 34 import com.android.settingslib.applications.ApplicationsState.Session; 35 36 import java.util.ArrayList; 37 38 public class AdvancedAppSettings extends SettingsPreferenceFragment implements 39 ApplicationsState.Callbacks { 40 41 static final String TAG = "AdvancedAppSettings"; 42 43 private static final String KEY_APP_PERM = "manage_perms"; 44 private static final String KEY_APP_DOMAIN_URLS = "domain_urls"; 45 private static final String KEY_HIGH_POWER_APPS = "high_power_apps"; 46 private static final String KEY_SYSTEM_ALERT_WINDOW = "system_alert_window"; 47 private static final String KEY_WRITE_SETTINGS_APPS = "write_settings_apps"; 48 49 private Session mSession; 50 private Preference mAppPermsPreference; 51 private Preference mAppDomainURLsPreference; 52 private Preference mHighPowerPreference; 53 private Preference mSystemAlertWindowPreference; 54 private Preference mWriteSettingsPreference; 55 56 private BroadcastReceiver mPermissionReceiver; 57 58 @Override onCreate(Bundle icicle)59 public void onCreate(Bundle icicle) { 60 super.onCreate(icicle); 61 addPreferencesFromResource(R.xml.advanced_apps); 62 63 Preference permissions = getPreferenceScreen().findPreference(KEY_APP_PERM); 64 permissions.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSIONS)); 65 66 ApplicationsState applicationsState = ApplicationsState.getInstance( 67 getActivity().getApplication()); 68 mSession = applicationsState.newSession(this); 69 70 mAppPermsPreference = findPreference(KEY_APP_PERM); 71 mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS); 72 mHighPowerPreference = findPreference(KEY_HIGH_POWER_APPS); 73 mSystemAlertWindowPreference = findPreference(KEY_SYSTEM_ALERT_WINDOW); 74 mWriteSettingsPreference = findPreference(KEY_WRITE_SETTINGS_APPS); 75 } 76 77 @Override getMetricsCategory()78 protected int getMetricsCategory() { 79 return MetricsLogger.APPLICATIONS_ADVANCED; 80 } 81 82 @Override onRunningStateChanged(boolean running)83 public void onRunningStateChanged(boolean running) { 84 // No-op. 85 } 86 87 @Override onPackageListChanged()88 public void onPackageListChanged() { 89 // No-op. 90 } 91 92 @Override onRebuildComplete(ArrayList<AppEntry> apps)93 public void onRebuildComplete(ArrayList<AppEntry> apps) { 94 // No-op. 95 } 96 97 @Override onPackageIconChanged()98 public void onPackageIconChanged() { 99 // No-op. 100 } 101 102 @Override onPackageSizeChanged(String packageName)103 public void onPackageSizeChanged(String packageName) { 104 // No-op. 105 } 106 107 @Override onAllSizesComputed()108 public void onAllSizesComputed() { 109 // No-op. 110 } 111 112 @Override onLauncherInfoChanged()113 public void onLauncherInfoChanged() { 114 // No-op. 115 } 116 117 @Override onLoadEntriesCompleted()118 public void onLoadEntriesCompleted() { 119 // No-op. 120 } 121 122 private final PermissionsResultCallback mPermissionCallback = new PermissionsResultCallback() { 123 @Override 124 public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { 125 if (getActivity() == null) { 126 return; 127 } 128 mPermissionReceiver = null; 129 if (counts != null) { 130 mAppPermsPreference.setSummary(getContext().getString( 131 R.string.app_permissions_summary, counts[0], counts[1])); 132 } else { 133 mAppPermsPreference.setSummary(null); 134 } 135 } 136 }; 137 138 private class CountAppsWithOverlayPermission extends 139 AsyncTask<AppStateOverlayBridge, Void, Integer> { 140 int numOfPackagesRequestedPermission = 0; 141 142 @Override doInBackground(AppStateOverlayBridge... params)143 protected Integer doInBackground(AppStateOverlayBridge... params) { 144 AppStateOverlayBridge overlayBridge = params[0]; 145 numOfPackagesRequestedPermission = overlayBridge 146 .getNumberOfPackagesWithPermission(); 147 return overlayBridge.getNumberOfPackagesCanDrawOverlay(); 148 } 149 150 @Override onPostExecute(Integer result)151 protected void onPostExecute(Integer result) { 152 // checks if fragment is still there before updating the preference object 153 if (isAdded()) { 154 mSystemAlertWindowPreference.setSummary(getContext().getString( 155 R.string.system_alert_window_summary, result, 156 numOfPackagesRequestedPermission)); 157 } 158 } 159 } 160 161 private class CountAppsWithWriteSettingsPermission extends 162 AsyncTask<AppStateWriteSettingsBridge, Void, Integer> { 163 int numOfPackagesRequestedPermission = 0; 164 165 @Override doInBackground(AppStateWriteSettingsBridge... params)166 protected Integer doInBackground(AppStateWriteSettingsBridge... params) { 167 AppStateWriteSettingsBridge writeSettingsBridge = params[0]; 168 numOfPackagesRequestedPermission = writeSettingsBridge 169 .getNumberOfPackagesWithPermission(); 170 return writeSettingsBridge.getNumberOfPackagesCanWriteSettings(); 171 } 172 173 @Override onPostExecute(Integer result)174 protected void onPostExecute(Integer result) { 175 // checks if fragment is still there before updating the preference object 176 if (isAdded()) { 177 mWriteSettingsPreference.setSummary(getContext().getString( 178 R.string.write_settings_summary, result, 179 numOfPackagesRequestedPermission)); 180 } 181 } 182 } 183 } 184