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