From a8b0366a028b321e41ee40b3c1372de77254b24d Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Tue, 1 Mar 2016 10:44:16 -0500 Subject: [PATCH] Data saver fixes - Correct summary for number of apps with unrestricted - Show system option on unrestricted access page - general betterness Bug: 26796370 Bug: 27378294 Bug: 27122309 Change-Id: Ia57b56a25175182cb1a5a1231c20dc3c71cc3427 --- .../settings/datausage/DataSaverSummary.java | 88 +++++++++++-- .../datausage/UnrestrictedDataAccess.java | 119 +++++++++++++----- 2 files changed, 172 insertions(+), 35 deletions(-) diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java index fa24fa397fa..e8fb2fc8a35 100644 --- a/src/com/android/settings/datausage/DataSaverSummary.java +++ b/src/com/android/settings/datausage/DataSaverSummary.java @@ -14,24 +14,36 @@ package com.android.settings.datausage; +import android.app.Application; import android.os.Bundle; import android.support.v7.preference.Preference; -import android.util.Log; import android.widget.Switch; import com.android.settings.InstrumentedFragment; import com.android.settings.R; import com.android.settings.SettingsActivity; 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.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 - implements SwitchBar.OnSwitchChangeListener, DataSaverBackend.Listener { + implements OnSwitchChangeListener, Listener, Callback, Callbacks { private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access"; private SwitchBar mSwitchBar; private DataSaverBackend mDataSaverBackend; private Preference mUnrestrictedAccess; + private ApplicationsState mApplicationsState; + private AppStateDataUsageBridge mDataUsageBridge; + private Session mSession; @Override public void onCreate(Bundle icicle) { @@ -39,7 +51,11 @@ public class DataSaverSummary extends SettingsPreferenceFragment addPreferencesFromResource(R.xml.data_saver); mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS); + mApplicationsState = ApplicationsState.getInstance( + (Application) getContext().getApplicationContext()); mDataSaverBackend = new DataSaverBackend(getContext()); + mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend); + mSession = mApplicationsState.newSession(this); } @Override @@ -53,17 +69,16 @@ public class DataSaverSummary extends SettingsPreferenceFragment @Override public void onResume() { super.onResume(); - mDataSaverBackend.addListener(this); mDataSaverBackend.refreshWhitelist(); - int count = mDataSaverBackend.getWhitelistedCount(); - mUnrestrictedAccess.setSummary(getResources().getQuantityString( - R.plurals.data_saver_unrestricted_summary, count, count)); + mSession.resume(); + mDataUsageBridge.resume(); } @Override public void onPause() { super.onPause(); - mDataSaverBackend.remListener(this); + mDataUsageBridge.pause(); + mSession.pause(); } @Override @@ -80,4 +95,63 @@ public class DataSaverSummary extends SettingsPreferenceFragment public void onDataSaverChanged(boolean isDataSaving) { mSwitchBar.setChecked(isDataSaving); } + + @Override + public void onExtraInfoUpdated() { + int count = 0; + final ArrayList 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 apps) { + + } + + @Override + public void onPackageIconChanged() { + + } + + @Override + public void onPackageSizeChanged(String packageName) { + + } + + @Override + public void onAllSizesComputed() { + + } + + @Override + public void onLauncherInfoChanged() { + + } + + @Override + public void onLoadEntriesCompleted() { + + } } diff --git a/src/com/android/settings/datausage/UnrestrictedDataAccess.java b/src/com/android/settings/datausage/UnrestrictedDataAccess.java index a88da882e8a..d53905f755d 100644 --- a/src/com/android/settings/datausage/UnrestrictedDataAccess.java +++ b/src/com/android/settings/datausage/UnrestrictedDataAccess.java @@ -20,32 +20,75 @@ import android.os.Bundle; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import com.android.settings.InstrumentedFragment; +import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.AppStateBaseBridge; import com.android.settingslib.applications.ApplicationsState; +import com.android.settingslib.applications.ApplicationsState.AppEntry; +import com.android.settingslib.applications.ApplicationsState.AppFilter; import java.util.ArrayList; public class UnrestrictedDataAccess extends SettingsPreferenceFragment 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 AppStateDataUsageBridge mDataUsageBridge; private ApplicationsState.Session mSession; private DataSaverBackend mDataSaverBackend; + private boolean mShowSystem; + private boolean mExtraLoaded; + private AppFilter mFilter; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); - getPreferenceScreen().setOrderingAsAdded(false); mApplicationsState = ApplicationsState.getInstance( (Application) getContext().getApplicationContext()); mDataSaverBackend = new DataSaverBackend(getContext()); mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend); 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 @@ -77,23 +120,15 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment @Override public void onExtraInfoUpdated() { - ArrayList apps = mSession.getAllApps(); - 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) findPreference(key); - if (preference == null) { - preference = new AccessPreference(getContext(), entry); - preference.setKey(key); - preference.setOnPreferenceChangeListener(this); - getPreferenceScreen().addPreference(preference); - } - AppStateDataUsageBridge.DataUsageState state = - (AppStateDataUsageBridge.DataUsageState) entry.extraInfo; - preference.setChecked(state.isDataSaverWhitelisted); + mExtraLoaded = true; + rebuild(); + } + + private void rebuild() { + ArrayList apps = mSession.rebuild(mFilter, ApplicationsState.ALPHA_COMPARATOR); + if (apps != null) { + onRebuildComplete(apps); } - setLoading(false, true); } @Override @@ -108,7 +143,24 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment @Override public void onRebuildComplete(ArrayList 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 @@ -164,20 +216,31 @@ public class UnrestrictedDataAccess extends SettingsPreferenceFragment setTitle(entry.label); setChecked(((AppStateDataUsageBridge.DataUsageState) entry.extraInfo) .isDataSaverWhitelisted); + if (mEntry.icon != null) { + setIcon(mEntry.icon); + } + } + + public void reuse() { + setTitle(mEntry.label); + setChecked(((AppStateDataUsageBridge.DataUsageState) mEntry.extraInfo) + .isDataSaverWhitelisted); } @Override public void onBindViewHolder(PreferenceViewHolder holder) { - holder.itemView.post(new Runnable() { - @Override - public void run() { - // Ensure we have an icon before binding. - mApplicationsState.ensureIcon(mEntry); - // This might trigger us to bind again, but it gives an easy way to only load the icon - // once its needed, so its probably worth it. - setIcon(mEntry.icon); - } - }); + if (mEntry.icon == null) { + holder.itemView.post(new Runnable() { + @Override + public void run() { + // Ensure we have an icon before binding. + mApplicationsState.ensureIcon(mEntry); + // This might trigger us to bind again, but it gives an easy way to only + // load the icon once its needed, so its probably worth it. + setIcon(mEntry.icon); + } + }); + } super.onBindViewHolder(holder); } }