diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java index 82dee0fe397..bed3be5d40f 100644 --- a/src/com/android/settings/DataUsageSummary.java +++ b/src/com/android/settings/DataUsageSummary.java @@ -37,10 +37,12 @@ import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentTransaction; +import android.app.LoaderManager.LoaderCallbacks; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.Loader; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -97,6 +99,7 @@ import android.widget.TextView; import com.android.internal.telephony.Phone; import com.android.settings.net.NetworkPolicyEditor; +import com.android.settings.net.SummaryForAllUidLoader; import com.android.settings.widget.DataUsageChartView; import com.android.settings.widget.DataUsageChartView.DataUsageChartListener; import com.google.android.collect.Lists; @@ -127,6 +130,8 @@ public class DataUsageSummary extends Fragment { private static final String TAG_CONFIRM_APP_RESTRICT = "confirmAppRestrict"; private static final String TAG_APP_DETAILS = "appDetails"; + private static final int LOADER_SUMMARY = 2; + private static final long KB_IN_BYTES = 1024; private static final long MB_IN_BYTES = KB_IN_BYTES * 1024; private static final long GB_IN_BYTES = MB_IN_BYTES * 1024; @@ -305,6 +310,23 @@ public class DataUsageSummary extends Fragment { if (ACTION_DATA_USAGE_LIMIT.equals(action)) { PolicyLimitFragment.show(this); } + + // kick off background task to update stats + new AsyncTask() { + @Override + protected Void doInBackground(Void... params) { + try { + mStatsService.forceUpdate(); + } catch (RemoteException e) { + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + updateBody(); + } + }.execute(); } @Override @@ -894,33 +916,35 @@ public class DataUsageSummary extends Fragment { mAppSubtitle.setText(Formatter.formatFileSize(context, totalCombined)); } - // clear any existing app list details - mAdapter.bindStats(null); + getLoaderManager().destroyLoader(LOADER_SUMMARY); - return; + } else { + // kick off loader for detailed stats + final long[] range = mChart.getInspectRange(); + getLoaderManager().restartLoader(LOADER_SUMMARY, + SummaryForAllUidLoader.buildArgs(mTemplate, range[0], range[1]), + mSummaryForAllUid); + + } + } + + private final LoaderCallbacks mSummaryForAllUid = new LoaderCallbacks< + NetworkStats>() { + /** {@inheritDoc} */ + public Loader onCreateLoader(int id, Bundle args) { + return new SummaryForAllUidLoader(getActivity(), mStatsService, args); } - // otherwise kick off task to update list - new AsyncTask() { - @Override - protected NetworkStats doInBackground(Void... params) { - try { - final long[] range = mChart.getInspectRange(); - return mStatsService.getSummaryForAllUid(mTemplate, range[0], range[1], false); - } catch (RemoteException e) { - Log.w(TAG, "problem reading stats"); - } - return null; - } + /** {@inheritDoc} */ + public void onLoadFinished(Loader loader, NetworkStats data) { + mAdapter.bindStats(data); + } - @Override - protected void onPostExecute(NetworkStats stats) { - if (stats != null) { - mAdapter.bindStats(stats); - } - } - }.execute(); - } + /** {@inheritDoc} */ + public void onLoaderReset(Loader loader) { + mAdapter.bindStats(null); + } + }; private boolean isMobilePolicySplit() { final String subscriberId = getActiveSubscriberId(getActivity()); @@ -1535,5 +1559,4 @@ public class DataUsageSummary extends Fragment { summary.setVisibility(View.VISIBLE); summary.setText(resId); } - } diff --git a/src/com/android/settings/net/SummaryForAllUidLoader.java b/src/com/android/settings/net/SummaryForAllUidLoader.java new file mode 100644 index 00000000000..c01de4539cb --- /dev/null +++ b/src/com/android/settings/net/SummaryForAllUidLoader.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.net; + +import android.content.AsyncTaskLoader; +import android.content.Context; +import android.net.INetworkStatsService; +import android.net.NetworkStats; +import android.net.NetworkTemplate; +import android.os.Bundle; +import android.os.RemoteException; + +public class SummaryForAllUidLoader extends AsyncTaskLoader { + private static final String KEY_TEMPLATE = "template"; + private static final String KEY_START = "start"; + private static final String KEY_END = "end"; + + private final INetworkStatsService mStatsService; + private final Bundle mArgs; + + public static Bundle buildArgs(NetworkTemplate template, long start, long end) { + final Bundle args = new Bundle(); + args.putParcelable(KEY_TEMPLATE, template); + args.putLong(KEY_START, start); + args.putLong(KEY_END, end); + return args; + } + + public SummaryForAllUidLoader( + Context context, INetworkStatsService statsService, Bundle args) { + super(context); + mStatsService = statsService; + mArgs = args; + } + + @Override + protected void onStartLoading() { + super.onStartLoading(); + forceLoad(); + } + + @Override + public NetworkStats loadInBackground() { + final NetworkTemplate template = mArgs.getParcelable(KEY_TEMPLATE); + final long start = mArgs.getLong(KEY_START); + final long end = mArgs.getLong(KEY_END); + + try { + return mStatsService.getSummaryForAllUid(template, start, end, false); + } catch (RemoteException e) { + return null; + } + } + + @Override + protected void onStopLoading() { + super.onStopLoading(); + cancelLoad(); + } + + @Override + protected void onReset() { + super.onReset(); + cancelLoad(); + } +}