Merge "Data saver fixes" into nyc-dev
am: 542f5d3e67
* commit '542f5d3e676df752b27712ba919dde6ca07f3064':
Data saver fixes
This commit is contained in:
@@ -14,24 +14,36 @@
|
|||||||
|
|
||||||
package com.android.settings.datausage;
|
package com.android.settings.datausage;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import com.android.settings.InstrumentedFragment;
|
import com.android.settings.InstrumentedFragment;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
|
import com.android.settings.applications.AppStateBaseBridge.Callback;
|
||||||
|
import com.android.settings.datausage.DataSaverBackend.Listener;
|
||||||
import com.android.settings.widget.SwitchBar;
|
import com.android.settings.widget.SwitchBar;
|
||||||
|
import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.Callbacks;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.Session;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class DataSaverSummary extends SettingsPreferenceFragment
|
public class DataSaverSummary extends SettingsPreferenceFragment
|
||||||
implements SwitchBar.OnSwitchChangeListener, DataSaverBackend.Listener {
|
implements OnSwitchChangeListener, Listener, Callback, Callbacks {
|
||||||
|
|
||||||
private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access";
|
private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access";
|
||||||
|
|
||||||
private SwitchBar mSwitchBar;
|
private SwitchBar mSwitchBar;
|
||||||
private DataSaverBackend mDataSaverBackend;
|
private DataSaverBackend mDataSaverBackend;
|
||||||
private Preference mUnrestrictedAccess;
|
private Preference mUnrestrictedAccess;
|
||||||
|
private ApplicationsState mApplicationsState;
|
||||||
|
private AppStateDataUsageBridge mDataUsageBridge;
|
||||||
|
private Session mSession;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
@@ -39,7 +51,11 @@ public class DataSaverSummary extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
addPreferencesFromResource(R.xml.data_saver);
|
addPreferencesFromResource(R.xml.data_saver);
|
||||||
mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
|
mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
|
||||||
|
mApplicationsState = ApplicationsState.getInstance(
|
||||||
|
(Application) getContext().getApplicationContext());
|
||||||
mDataSaverBackend = new DataSaverBackend(getContext());
|
mDataSaverBackend = new DataSaverBackend(getContext());
|
||||||
|
mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
|
||||||
|
mSession = mApplicationsState.newSession(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -53,17 +69,16 @@ public class DataSaverSummary extends SettingsPreferenceFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
mDataSaverBackend.addListener(this);
|
|
||||||
mDataSaverBackend.refreshWhitelist();
|
mDataSaverBackend.refreshWhitelist();
|
||||||
int count = mDataSaverBackend.getWhitelistedCount();
|
mSession.resume();
|
||||||
mUnrestrictedAccess.setSummary(getResources().getQuantityString(
|
mDataUsageBridge.resume();
|
||||||
R.plurals.data_saver_unrestricted_summary, count, count));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
mDataSaverBackend.remListener(this);
|
mDataUsageBridge.pause();
|
||||||
|
mSession.pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -80,4 +95,63 @@ public class DataSaverSummary extends SettingsPreferenceFragment
|
|||||||
public void onDataSaverChanged(boolean isDataSaving) {
|
public void onDataSaverChanged(boolean isDataSaving) {
|
||||||
mSwitchBar.setChecked(isDataSaving);
|
mSwitchBar.setChecked(isDataSaving);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onExtraInfoUpdated() {
|
||||||
|
int count = 0;
|
||||||
|
final ArrayList<AppEntry> allApps = mSession.getAllApps();
|
||||||
|
final int N = allApps.size();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
final AppEntry entry = allApps.get(i);
|
||||||
|
if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
|
||||||
|
entry.extraInfo).isDataSaverWhitelisted) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mUnrestrictedAccess.setSummary(getResources().getQuantityString(
|
||||||
|
R.plurals.data_saver_unrestricted_summary, count, count));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRunningStateChanged(boolean running) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageListChanged() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRebuildComplete(ArrayList<AppEntry> apps) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageIconChanged() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPackageSizeChanged(String packageName) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAllSizesComputed() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLauncherInfoChanged() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoadEntriesCompleted() {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,32 +20,75 @@ import android.os.Bundle;
|
|||||||
import android.support.v14.preference.SwitchPreference;
|
import android.support.v14.preference.SwitchPreference;
|
||||||
import android.support.v7.preference.Preference;
|
import android.support.v7.preference.Preference;
|
||||||
import android.support.v7.preference.PreferenceViewHolder;
|
import android.support.v7.preference.PreferenceViewHolder;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import com.android.settings.InstrumentedFragment;
|
import com.android.settings.InstrumentedFragment;
|
||||||
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
import com.android.settings.applications.AppStateBaseBridge;
|
import com.android.settings.applications.AppStateBaseBridge;
|
||||||
import com.android.settingslib.applications.ApplicationsState;
|
import com.android.settingslib.applications.ApplicationsState;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
|
import com.android.settingslib.applications.ApplicationsState.AppFilter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
||||||
implements ApplicationsState.Callbacks, AppStateBaseBridge.Callback, Preference.OnPreferenceChangeListener {
|
implements ApplicationsState.Callbacks, AppStateBaseBridge.Callback, Preference.OnPreferenceChangeListener {
|
||||||
|
|
||||||
|
private static final int MENU_SHOW_SYSTEM = Menu.FIRST + 42;
|
||||||
|
private static final String EXTRA_SHOW_SYSTEM = "show_system";
|
||||||
private ApplicationsState mApplicationsState;
|
private ApplicationsState mApplicationsState;
|
||||||
private AppStateDataUsageBridge mDataUsageBridge;
|
private AppStateDataUsageBridge mDataUsageBridge;
|
||||||
private ApplicationsState.Session mSession;
|
private ApplicationsState.Session mSession;
|
||||||
private DataSaverBackend mDataSaverBackend;
|
private DataSaverBackend mDataSaverBackend;
|
||||||
|
private boolean mShowSystem;
|
||||||
|
private boolean mExtraLoaded;
|
||||||
|
private AppFilter mFilter;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
|
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
|
||||||
getPreferenceScreen().setOrderingAsAdded(false);
|
|
||||||
mApplicationsState = ApplicationsState.getInstance(
|
mApplicationsState = ApplicationsState.getInstance(
|
||||||
(Application) getContext().getApplicationContext());
|
(Application) getContext().getApplicationContext());
|
||||||
mDataSaverBackend = new DataSaverBackend(getContext());
|
mDataSaverBackend = new DataSaverBackend(getContext());
|
||||||
mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
|
mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
|
||||||
mSession = mApplicationsState.newSession(this);
|
mSession = mApplicationsState.newSession(this);
|
||||||
|
mShowSystem = icicle != null && icicle.getBoolean(EXTRA_SHOW_SYSTEM);
|
||||||
|
mFilter = mShowSystem ? ApplicationsState.FILTER_ALL_ENABLED
|
||||||
|
: ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER;
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
|
||||||
|
mShowSystem ? R.string.menu_hide_system : R.string.menu_show_system);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case MENU_SHOW_SYSTEM:
|
||||||
|
mShowSystem = !mShowSystem;
|
||||||
|
item.setTitle(mShowSystem ? R.string.menu_hide_system : R.string.menu_show_system);
|
||||||
|
mFilter = mShowSystem ? ApplicationsState.FILTER_ALL_ENABLED
|
||||||
|
: ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER;
|
||||||
|
if (mExtraLoaded) {
|
||||||
|
rebuild();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,23 +120,15 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onExtraInfoUpdated() {
|
public void onExtraInfoUpdated() {
|
||||||
ArrayList<ApplicationsState.AppEntry> apps = mSession.getAllApps();
|
mExtraLoaded = true;
|
||||||
final int N = apps.size();
|
rebuild();
|
||||||
for (int i = 0; i < N; i++) {
|
}
|
||||||
ApplicationsState.AppEntry entry = apps.get(i);
|
|
||||||
String key = entry.info.packageName + "|" + entry.info.uid;
|
private void rebuild() {
|
||||||
AccessPreference preference = (AccessPreference) findPreference(key);
|
ArrayList<AppEntry> apps = mSession.rebuild(mFilter, ApplicationsState.ALPHA_COMPARATOR);
|
||||||
if (preference == null) {
|
if (apps != null) {
|
||||||
preference = new AccessPreference(getContext(), entry);
|
onRebuildComplete(apps);
|
||||||
preference.setKey(key);
|
|
||||||
preference.setOnPreferenceChangeListener(this);
|
|
||||||
getPreferenceScreen().addPreference(preference);
|
|
||||||
}
|
|
||||||
AppStateDataUsageBridge.DataUsageState state =
|
|
||||||
(AppStateDataUsageBridge.DataUsageState) entry.extraInfo;
|
|
||||||
preference.setChecked(state.isDataSaverWhitelisted);
|
|
||||||
}
|
}
|
||||||
setLoading(false, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -108,7 +143,24 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
|
public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
|
||||||
|
cacheRemoveAllPrefs(getPreferenceScreen());
|
||||||
|
final int N = apps.size();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
ApplicationsState.AppEntry entry = apps.get(i);
|
||||||
|
String key = entry.info.packageName + "|" + entry.info.uid;
|
||||||
|
AccessPreference preference = (AccessPreference) getCachedPreference(key);
|
||||||
|
if (preference == null) {
|
||||||
|
preference = new AccessPreference(getContext(), entry);
|
||||||
|
preference.setKey(key);
|
||||||
|
preference.setOnPreferenceChangeListener(this);
|
||||||
|
getPreferenceScreen().addPreference(preference);
|
||||||
|
} else {
|
||||||
|
preference.reuse();
|
||||||
|
}
|
||||||
|
preference.setOrder(i);
|
||||||
|
}
|
||||||
|
setLoading(false, true);
|
||||||
|
removeCachedPrefs(getPreferenceScreen());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -164,20 +216,31 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment
|
|||||||
setTitle(entry.label);
|
setTitle(entry.label);
|
||||||
setChecked(((AppStateDataUsageBridge.DataUsageState) entry.extraInfo)
|
setChecked(((AppStateDataUsageBridge.DataUsageState) entry.extraInfo)
|
||||||
.isDataSaverWhitelisted);
|
.isDataSaverWhitelisted);
|
||||||
|
if (mEntry.icon != null) {
|
||||||
|
setIcon(mEntry.icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reuse() {
|
||||||
|
setTitle(mEntry.label);
|
||||||
|
setChecked(((AppStateDataUsageBridge.DataUsageState) mEntry.extraInfo)
|
||||||
|
.isDataSaverWhitelisted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||||
holder.itemView.post(new Runnable() {
|
if (mEntry.icon == null) {
|
||||||
@Override
|
holder.itemView.post(new Runnable() {
|
||||||
public void run() {
|
@Override
|
||||||
// Ensure we have an icon before binding.
|
public void run() {
|
||||||
mApplicationsState.ensureIcon(mEntry);
|
// Ensure we have an icon before binding.
|
||||||
// This might trigger us to bind again, but it gives an easy way to only load the icon
|
mApplicationsState.ensureIcon(mEntry);
|
||||||
// once its needed, so its probably worth it.
|
// This might trigger us to bind again, but it gives an easy way to only
|
||||||
setIcon(mEntry.icon);
|
// load the icon once its needed, so its probably worth it.
|
||||||
}
|
setIcon(mEntry.icon);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
super.onBindViewHolder(holder);
|
super.onBindViewHolder(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user