11eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk/* 21eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * Copyright (C) 2015 The Android Open Source Project 31eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * 41eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 51eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * you may not use this file except in compliance with the License. 61eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * You may obtain a copy of the License at 71eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * 81eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 91eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * 101eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * Unless required by applicable law or agreed to in writing, software 111eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 121eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * See the License for the specific language governing permissions and 141eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * limitations under the License. 151eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk */ 161eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkpackage com.android.settings.fuelgauge; 171eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 181eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.IDeviceIdleController; 191eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.RemoteException; 201eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.ServiceManager; 21781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyuleiimport android.support.annotation.VisibleForTesting; 22781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei 231eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.util.ArraySet; 241eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.util.Log; 251eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 261eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 271eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk/** 281eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk * Handles getting/changing the whitelist for the exceptions to battery saving features. 291eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk */ 301eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkpublic class PowerWhitelistBackend { 311eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 321eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String TAG = "PowerWhitelistBackend"; 331eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 341eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String DEVICE_IDLE_SERVICE = "deviceidle"; 351eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 36781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei private static PowerWhitelistBackend sInstance; 371eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 381eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private final IDeviceIdleController mDeviceIdleService; 391eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private final ArraySet<String> mWhitelistedApps = new ArraySet<>(); 401eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private final ArraySet<String> mSysWhitelistedApps = new ArraySet<>(); 411eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 421eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public PowerWhitelistBackend() { 431eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mDeviceIdleService = IDeviceIdleController.Stub.asInterface( 441eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk ServiceManager.getService(DEVICE_IDLE_SERVICE)); 451eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk refreshList(); 461eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 471eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 481eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public int getWhitelistSize() { 491eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return mWhitelistedApps.size(); 501eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 511eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 521eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public boolean isSysWhitelisted(String pkg) { 531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return mSysWhitelistedApps.contains(pkg); 541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 551eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public boolean isWhitelisted(String pkg) { 571eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return mWhitelistedApps.contains(pkg); 581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public void addApp(String pkg) { 611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk try { 621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mDeviceIdleService.addPowerSaveWhitelistApp(pkg); 631eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mWhitelistedApps.add(pkg); 641eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } catch (RemoteException e) { 651eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk Log.w(TAG, "Unable to reach IDeviceIdleController", e); 661eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 671eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public void removeApp(String pkg) { 701eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk try { 711eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mDeviceIdleService.removePowerSaveWhitelistApp(pkg); 721eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mWhitelistedApps.remove(pkg); 731eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } catch (RemoteException e) { 741eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk Log.w(TAG, "Unable to reach IDeviceIdleController", e); 751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 771eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 78781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei @VisibleForTesting 79781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei void refreshList() { 801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSysWhitelistedApps.clear(); 811eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mWhitelistedApps.clear(); 821eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk try { 831eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk String[] whitelistedApps = mDeviceIdleService.getFullPowerWhitelist(); 841eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (String app : whitelistedApps) { 851eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mWhitelistedApps.add(app); 861eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk String[] sysWhitelistedApps = mDeviceIdleService.getSystemPowerWhitelist(); 881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (String app : sysWhitelistedApps) { 891eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSysWhitelistedApps.add(app); 901eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 911eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } catch (RemoteException e) { 921eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk Log.w(TAG, "Unable to reach IDeviceIdleController", e); 931eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 941eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 951eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 961eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public static PowerWhitelistBackend getInstance() { 97781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei if (sInstance == null) { 98781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei sInstance = new PowerWhitelistBackend(); 99781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei } 100781c3000d1f895696beaefd4dd9d151bea8cbd6ejackqdyulei return sInstance; 1011eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 1021eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1031eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk} 104