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.Looper;
22 import android.os.RemoteException;
23 
24 import androidx.annotation.NonNull;
25 
26 import java.util.ArrayList;
27 
28 public class DataSaverControllerImpl implements DataSaverController {
29 
30     private final Handler mHandler = new Handler(Looper.getMainLooper());
31     private final ArrayList<Listener> mListeners = new ArrayList<>();
32     private final NetworkPolicyManager mPolicyManager;
33 
DataSaverControllerImpl(Context context)34     public DataSaverControllerImpl(Context context) {
35         mPolicyManager = NetworkPolicyManager.from(context);
36     }
37 
handleRestrictBackgroundChanged(boolean isDataSaving)38     private void handleRestrictBackgroundChanged(boolean isDataSaving) {
39         synchronized (mListeners) {
40             for (int i = 0; i < mListeners.size(); i++) {
41                 mListeners.get(i).onDataSaverChanged(isDataSaving);
42             }
43         }
44     }
45 
46     @Override
addCallback(@onNull Listener listener)47     public void addCallback(@NonNull Listener listener) {
48         synchronized (mListeners) {
49             mListeners.add(listener);
50             if (mListeners.size() == 1) {
51                 mPolicyManager.registerListener(mPolicyListener);
52             }
53         }
54         listener.onDataSaverChanged(isDataSaverEnabled());
55     }
56 
57     @Override
removeCallback(@onNull Listener listener)58     public void removeCallback(@NonNull Listener listener) {
59         synchronized (mListeners) {
60             mListeners.remove(listener);
61             if (mListeners.size() == 0) {
62                 mPolicyManager.unregisterListener(mPolicyListener);
63             }
64         }
65     }
66 
isDataSaverEnabled()67     public boolean isDataSaverEnabled() {
68         return mPolicyManager.getRestrictBackground();
69     }
70 
setDataSaverEnabled(boolean enabled)71     public void setDataSaverEnabled(boolean enabled) {
72         mPolicyManager.setRestrictBackground(enabled);
73         try {
74             mPolicyListener.onRestrictBackgroundChanged(enabled);
75         } catch (RemoteException e) {
76         }
77     }
78 
79     private final INetworkPolicyListener mPolicyListener = new NetworkPolicyManager.Listener() {
80         @Override
81         public void onRestrictBackgroundChanged(final boolean isDataSaving) {
82             mHandler.post(new Runnable() {
83                 @Override
84                 public void run() {
85                     handleRestrictBackgroundChanged(isDataSaving);
86                 }
87             });
88         }
89     };
90 
91 }
92