Home | History | Annotate | Download | only in policy
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
      5  * except in compliance with the License. You may obtain a copy of the License at
      6  *
      7  *      http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the
     10  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     11  * KIND, either express or implied. See the License for the specific language governing
     12  * permissions and limitations under the License.
     13  */
     14 
     15 package com.android.systemui.statusbar.policy;
     16 
     17 import android.content.Context;
     18 import android.net.INetworkPolicyListener;
     19 import android.net.NetworkPolicyManager;
     20 import android.os.Handler;
     21 import android.os.RemoteException;
     22 
     23 import java.util.ArrayList;
     24 
     25 public class DataSaverController {
     26 
     27     private final Handler mHandler = new Handler();
     28     private final ArrayList<Listener> mListeners = new ArrayList<>();
     29     private final NetworkPolicyManager mPolicyManager;
     30 
     31     public DataSaverController(Context context) {
     32         mPolicyManager = NetworkPolicyManager.from(context);
     33     }
     34 
     35     private void handleRestrictBackgroundChanged(boolean isDataSaving) {
     36         synchronized (mListeners) {
     37             for (int i = 0; i < mListeners.size(); i++) {
     38                 mListeners.get(i).onDataSaverChanged(isDataSaving);
     39             }
     40         }
     41     }
     42 
     43     public void addListener(Listener listener) {
     44         synchronized (mListeners) {
     45             mListeners.add(listener);
     46             if (mListeners.size() == 1) {
     47                 mPolicyManager.registerListener(mPolicyListener);
     48             }
     49         }
     50         listener.onDataSaverChanged(isDataSaverEnabled());
     51     }
     52 
     53     public void remListener(Listener listener) {
     54         synchronized (mListeners) {
     55             mListeners.remove(listener);
     56             if (mListeners.size() == 0) {
     57                 mPolicyManager.unregisterListener(mPolicyListener);
     58             }
     59         }
     60     }
     61 
     62     public boolean isDataSaverEnabled() {
     63         return mPolicyManager.getRestrictBackground();
     64     }
     65 
     66     public void setDataSaverEnabled(boolean enabled) {
     67         mPolicyManager.setRestrictBackground(enabled);
     68         try {
     69             mPolicyListener.onRestrictBackgroundChanged(enabled);
     70         } catch (RemoteException e) {
     71         }
     72     }
     73 
     74     private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
     75         @Override
     76         public void onUidRulesChanged(int i, int i1) throws RemoteException {
     77         }
     78 
     79         @Override
     80         public void onMeteredIfacesChanged(String[] strings) throws RemoteException {
     81         }
     82 
     83         @Override
     84         public void onRestrictBackgroundChanged(final boolean isDataSaving) throws RemoteException {
     85             mHandler.post(new Runnable() {
     86                 @Override
     87                 public void run() {
     88                     handleRestrictBackgroundChanged(isDataSaving);
     89                 }
     90             });
     91         }
     92 
     93         @Override
     94         public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) {
     95         }
     96         @Override
     97         public void onRestrictBackgroundBlacklistChanged(int uid, boolean blacklisted) {
     98         }
     99     };
    100 
    101     public interface Listener {
    102         void onDataSaverChanged(boolean isDataSaving);
    103     }
    104 
    105 }
    106