• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.settings.datausage;
16 
17 import android.app.Application;
18 import android.app.settings.SettingsEnums;
19 import android.content.Context;
20 import android.os.Bundle;
21 import android.telephony.SubscriptionManager;
22 import android.widget.Switch;
23 
24 import androidx.preference.Preference;
25 
26 import com.android.settings.R;
27 import com.android.settings.SettingsActivity;
28 import com.android.settings.SettingsPreferenceFragment;
29 import com.android.settings.applications.AppStateBaseBridge.Callback;
30 import com.android.settings.datausage.DataSaverBackend.Listener;
31 import com.android.settings.search.BaseSearchIndexProvider;
32 import com.android.settings.widget.SwitchBar;
33 import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
34 import com.android.settingslib.applications.ApplicationsState;
35 import com.android.settingslib.applications.ApplicationsState.AppEntry;
36 import com.android.settingslib.applications.ApplicationsState.Callbacks;
37 import com.android.settingslib.applications.ApplicationsState.Session;
38 import com.android.settingslib.search.SearchIndexable;
39 
40 import java.util.ArrayList;
41 
42 @SearchIndexable
43 public class DataSaverSummary extends SettingsPreferenceFragment
44         implements OnSwitchChangeListener, Listener, Callback, Callbacks {
45 
46     private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access";
47 
48     private SwitchBar mSwitchBar;
49     private DataSaverBackend mDataSaverBackend;
50     private Preference mUnrestrictedAccess;
51     private ApplicationsState mApplicationsState;
52     private AppStateDataUsageBridge mDataUsageBridge;
53     private Session mSession;
54 
55     // Flag used to avoid infinite loop due if user switch it on/off too quicky.
56     private boolean mSwitching;
57 
58     @Override
onCreate(Bundle icicle)59     public void onCreate(Bundle icicle) {
60         super.onCreate(icicle);
61 
62         addPreferencesFromResource(R.xml.data_saver);
63         mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
64         mApplicationsState = ApplicationsState.getInstance(
65                 (Application) getContext().getApplicationContext());
66         mDataSaverBackend = new DataSaverBackend(getContext());
67         mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
68         mSession = mApplicationsState.newSession(this, getSettingsLifecycle());
69     }
70 
71     @Override
onActivityCreated(Bundle savedInstanceState)72     public void onActivityCreated(Bundle savedInstanceState) {
73         super.onActivityCreated(savedInstanceState);
74         mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
75         mSwitchBar.setSwitchBarText(
76                 R.string.data_saver_switch_title,
77                 R.string.data_saver_switch_title);
78         mSwitchBar.show();
79         mSwitchBar.addOnSwitchChangeListener(this);
80     }
81 
82     @Override
onResume()83     public void onResume() {
84         super.onResume();
85         mDataSaverBackend.refreshWhitelist();
86         mDataSaverBackend.refreshBlacklist();
87         mDataSaverBackend.addListener(this);
88         mDataUsageBridge.resume();
89     }
90 
91     @Override
onPause()92     public void onPause() {
93         super.onPause();
94         mDataSaverBackend.remListener(this);
95         mDataUsageBridge.pause();
96     }
97 
98     @Override
onSwitchChanged(Switch switchView, boolean isChecked)99     public void onSwitchChanged(Switch switchView, boolean isChecked) {
100         synchronized (this) {
101             if (mSwitching) {
102                 return;
103             }
104             mSwitching = true;
105             mDataSaverBackend.setDataSaverEnabled(isChecked);
106         }
107     }
108 
109     @Override
getMetricsCategory()110     public int getMetricsCategory() {
111         return SettingsEnums.DATA_SAVER_SUMMARY;
112     }
113 
114     @Override
getHelpResource()115     public int getHelpResource() {
116         return R.string.help_url_data_saver;
117     }
118 
119     @Override
onDataSaverChanged(boolean isDataSaving)120     public void onDataSaverChanged(boolean isDataSaving) {
121         synchronized (this) {
122             mSwitchBar.setChecked(isDataSaving);
123             mSwitching = false;
124         }
125     }
126 
127     @Override
onWhitelistStatusChanged(int uid, boolean isWhitelisted)128     public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
129     }
130 
131     @Override
onBlacklistStatusChanged(int uid, boolean isBlacklisted)132     public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) {
133     }
134 
135     @Override
onExtraInfoUpdated()136     public void onExtraInfoUpdated() {
137         if (!isAdded()) {
138             return;
139         }
140         int count = 0;
141         final ArrayList<AppEntry> allApps = mSession.getAllApps();
142         final int N = allApps.size();
143         for (int i = 0; i < N; i++) {
144             final AppEntry entry = allApps.get(i);
145             if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
146                 continue;
147             }
148             if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
149                     entry.extraInfo).isDataSaverWhitelisted) {
150                 count++;
151             }
152         }
153         mUnrestrictedAccess.setSummary(getResources().getQuantityString(
154                 R.plurals.data_saver_unrestricted_summary, count, count));
155     }
156 
157     @Override
onRunningStateChanged(boolean running)158     public void onRunningStateChanged(boolean running) {
159 
160     }
161 
162     @Override
onPackageListChanged()163     public void onPackageListChanged() {
164 
165     }
166 
167     @Override
onRebuildComplete(ArrayList<AppEntry> apps)168     public void onRebuildComplete(ArrayList<AppEntry> apps) {
169 
170     }
171 
172     @Override
onPackageIconChanged()173     public void onPackageIconChanged() {
174 
175     }
176 
177     @Override
onPackageSizeChanged(String packageName)178     public void onPackageSizeChanged(String packageName) {
179 
180     }
181 
182     @Override
onAllSizesComputed()183     public void onAllSizesComputed() {
184 
185     }
186 
187     @Override
onLauncherInfoChanged()188     public void onLauncherInfoChanged() {
189 
190     }
191 
192     @Override
onLoadEntriesCompleted()193     public void onLoadEntriesCompleted() {
194 
195     }
196 
197     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
198             new BaseSearchIndexProvider(R.xml.data_saver) {
199 
200                 @Override
201                 protected boolean isPageSearchEnabled(Context context) {
202                     return DataUsageUtils.hasMobileData(context)
203                             && DataUsageUtils.getDefaultSubscriptionId(context)
204                             != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
205                 }
206             };
207 }
208