1764f45db9168b4f19623b72db8429016d1226cbeJason Monk/* 2764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Copyright (C) 2016 The Android Open Source Project 3764f45db9168b4f19623b72db8429016d1226cbeJason Monk * 4764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5764f45db9168b4f19623b72db8429016d1226cbeJason Monk * except in compliance with the License. You may obtain a copy of the License at 6764f45db9168b4f19623b72db8429016d1226cbeJason Monk * 7764f45db9168b4f19623b72db8429016d1226cbeJason Monk * http://www.apache.org/licenses/LICENSE-2.0 8764f45db9168b4f19623b72db8429016d1226cbeJason Monk * 9764f45db9168b4f19623b72db8429016d1226cbeJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 10764f45db9168b4f19623b72db8429016d1226cbeJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11764f45db9168b4f19623b72db8429016d1226cbeJason Monk * KIND, either express or implied. See the License for the specific language governing 12764f45db9168b4f19623b72db8429016d1226cbeJason Monk * permissions and limitations under the License. 13764f45db9168b4f19623b72db8429016d1226cbeJason Monk */ 14764f45db9168b4f19623b72db8429016d1226cbeJason Monk 15764f45db9168b4f19623b72db8429016d1226cbeJason Monkpackage com.android.settings.datausage; 16764f45db9168b4f19623b72db8429016d1226cbeJason Monk 17a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport android.app.Application; 18764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.os.Bundle; 19764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.support.v7.preference.Preference; 20764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport android.widget.Switch; 21cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme 22265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 23764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.R; 24764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.SettingsActivity; 25764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.SettingsPreferenceFragment; 26a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.applications.AppStateBaseBridge.Callback; 27a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.datausage.DataSaverBackend.Listener; 28764f45db9168b4f19623b72db8429016d1226cbeJason Monkimport com.android.settings.widget.SwitchBar; 29a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settings.widget.SwitchBar.OnSwitchChangeListener; 30a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState; 31a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.AppEntry; 32a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.Callbacks; 33a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport com.android.settingslib.applications.ApplicationsState.Session; 34a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 35a8b0366a028b321e41ee40b3c1372de77254b24dJason Monkimport java.util.ArrayList; 36764f45db9168b4f19623b72db8429016d1226cbeJason Monk 37764f45db9168b4f19623b72db8429016d1226cbeJason Monkpublic class DataSaverSummary extends SettingsPreferenceFragment 38a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk implements OnSwitchChangeListener, Listener, Callback, Callbacks { 39764f45db9168b4f19623b72db8429016d1226cbeJason Monk 40764f45db9168b4f19623b72db8429016d1226cbeJason Monk private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access"; 41764f45db9168b4f19623b72db8429016d1226cbeJason Monk 42764f45db9168b4f19623b72db8429016d1226cbeJason Monk private SwitchBar mSwitchBar; 43764f45db9168b4f19623b72db8429016d1226cbeJason Monk private DataSaverBackend mDataSaverBackend; 44764f45db9168b4f19623b72db8429016d1226cbeJason Monk private Preference mUnrestrictedAccess; 45a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk private ApplicationsState mApplicationsState; 46a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk private AppStateDataUsageBridge mDataUsageBridge; 47a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk private Session mSession; 48764f45db9168b4f19623b72db8429016d1226cbeJason Monk 49484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme // Flag used to avoid infinite loop due if user switch it on/off too quicky. 50484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme private boolean mSwitching; 51484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme 52764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 53764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onCreate(Bundle icicle) { 54764f45db9168b4f19623b72db8429016d1226cbeJason Monk super.onCreate(icicle); 55764f45db9168b4f19623b72db8429016d1226cbeJason Monk 56764f45db9168b4f19623b72db8429016d1226cbeJason Monk addPreferencesFromResource(R.xml.data_saver); 57ac81f26e30352dd441c099012c4489701d9aee2fFan Zhang mFooterPreferenceMixin.createFooterPreference() 58ac81f26e30352dd441c099012c4489701d9aee2fFan Zhang .setTitle(com.android.internal.R.string.data_saver_description); 59764f45db9168b4f19623b72db8429016d1226cbeJason Monk mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS); 60a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mApplicationsState = ApplicationsState.getInstance( 61a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk (Application) getContext().getApplicationContext()); 62764f45db9168b4f19623b72db8429016d1226cbeJason Monk mDataSaverBackend = new DataSaverBackend(getContext()); 63a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend); 64a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mSession = mApplicationsState.newSession(this); 65764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 66764f45db9168b4f19623b72db8429016d1226cbeJason Monk 67764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 68764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onActivityCreated(Bundle savedInstanceState) { 69764f45db9168b4f19623b72db8429016d1226cbeJason Monk super.onActivityCreated(savedInstanceState); 70764f45db9168b4f19623b72db8429016d1226cbeJason Monk mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar(); 71764f45db9168b4f19623b72db8429016d1226cbeJason Monk mSwitchBar.show(); 72764f45db9168b4f19623b72db8429016d1226cbeJason Monk mSwitchBar.addOnSwitchChangeListener(this); 73764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 74764f45db9168b4f19623b72db8429016d1226cbeJason Monk 75764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 76764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onResume() { 77764f45db9168b4f19623b72db8429016d1226cbeJason Monk super.onResume(); 78764f45db9168b4f19623b72db8429016d1226cbeJason Monk mDataSaverBackend.refreshWhitelist(); 79c2ef27faf4afca6c4f6634b5de975a1bdadf0752Felipe Leme mDataSaverBackend.refreshBlacklist(); 801636fedebe00aac4c21c72afafd7430ef6719e78Jason Monk mDataSaverBackend.addListener(this); 81a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mSession.resume(); 82a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mDataUsageBridge.resume(); 83764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 84764f45db9168b4f19623b72db8429016d1226cbeJason Monk 85764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 86764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onPause() { 87764f45db9168b4f19623b72db8429016d1226cbeJason Monk super.onPause(); 881636fedebe00aac4c21c72afafd7430ef6719e78Jason Monk mDataSaverBackend.remListener(this); 89a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mDataUsageBridge.pause(); 90a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mSession.pause(); 91764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 92764f45db9168b4f19623b72db8429016d1226cbeJason Monk 93764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 94764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onSwitchChanged(Switch switchView, boolean isChecked) { 95484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme synchronized(this) { 96484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme if (mSwitching) { 97484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme return; 98484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme } 99484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme mSwitching = true; 100484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme mDataSaverBackend.setDataSaverEnabled(isChecked); 101484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme } 102764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 103764f45db9168b4f19623b72db8429016d1226cbeJason Monk 104764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 1056507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang public int getMetricsCategory() { 1063e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk return MetricsEvent.DATA_SAVER_SUMMARY; 107764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 108764f45db9168b4f19623b72db8429016d1226cbeJason Monk 109764f45db9168b4f19623b72db8429016d1226cbeJason Monk @Override 110cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme protected int getHelpResource() { 111cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme return R.string.help_url_data_saver; 112cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme } 113cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme 114cf2c0b1b97605f8526a8a56b96a981aaa88cd63bFelipe Leme @Override 115764f45db9168b4f19623b72db8429016d1226cbeJason Monk public void onDataSaverChanged(boolean isDataSaving) { 116484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme synchronized(this) { 117484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme mSwitchBar.setChecked(isDataSaving); 118484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme mSwitching = false; 119484caa303561b2d22896f92d3ede9e5a03b9b131Felipe Leme } 120764f45db9168b4f19623b72db8429016d1226cbeJason Monk } 121a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 122a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 12385c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) { 12485c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme } 12585c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme 12685c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme @Override 12785c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme public void onBlacklistStatusChanged(int uid, boolean isBlacklisted) { 12885c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme } 12985c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme 13085c63f348f7bdccd47266ec9bbd083d49105af53Felipe Leme @Override 131a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onExtraInfoUpdated() { 1329d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk if (!isAdded()) { 1339d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk return; 1349d0542a314506de89cf24b1c7b3dde3a9899bf0cJason Monk } 135a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk int count = 0; 136a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk final ArrayList<AppEntry> allApps = mSession.getAllApps(); 137a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk final int N = allApps.size(); 138a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk for (int i = 0; i < N; i++) { 139a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk final AppEntry entry = allApps.get(i); 140a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) { 141a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk continue; 142a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 143a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState) 144a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk entry.extraInfo).isDataSaverWhitelisted) { 145a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk count++; 146a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 147a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 148a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk mUnrestrictedAccess.setSummary(getResources().getQuantityString( 149a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk R.plurals.data_saver_unrestricted_summary, count, count)); 150a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 151a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 152a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 153a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onRunningStateChanged(boolean running) { 154a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 155a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 156a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 157a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 158a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onPackageListChanged() { 159a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 160a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 161a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 162a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 163a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onRebuildComplete(ArrayList<AppEntry> apps) { 164a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 165a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 166a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 167a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 168a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onPackageIconChanged() { 169a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 170a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 171a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 172a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 173a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onPackageSizeChanged(String packageName) { 174a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 175a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 176a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 177a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 178a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onAllSizesComputed() { 179a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 180a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 181a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 182a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 183a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onLauncherInfoChanged() { 184a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 185a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 186a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 187a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk @Override 188a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk public void onLoadEntriesCompleted() { 189a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk 190a8b0366a028b321e41ee40b3c1372de77254b24dJason Monk } 191764f45db9168b4f19623b72db8429016d1226cbeJason Monk} 192