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