From 10d7e4c0608426292f54392ec62d3d67fc846525 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Mon, 22 Aug 2016 17:40:02 -0700 Subject: [PATCH] Prevent Data Usage Settings crash on phones without cellular history Refactored the logic to determine the data usage summary mark which now correctly tests for null. Bug: 30946416 Change-Id: Ida1281a771013fd807242f846edb4f2a9c0ccabb Test: make RunSettingsRoboTests --- .../datausage/DataUsageInfoController.java | 54 +++++++++++++++++++ .../settings/datausage/DataUsageSummary.java | 17 +++--- 2 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 src/com/android/settings/datausage/DataUsageInfoController.java diff --git a/src/com/android/settings/datausage/DataUsageInfoController.java b/src/com/android/settings/datausage/DataUsageInfoController.java new file mode 100644 index 00000000000..115e45e50a2 --- /dev/null +++ b/src/com/android/settings/datausage/DataUsageInfoController.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2016 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.datausage; + +import android.net.NetworkPolicy; +import com.android.settingslib.net.DataUsageController.DataUsageInfo; + +/** + * Controller to handle caching and mobile data logic. + */ +public class DataUsageInfoController { + /** + * Take the cached data usage values in the NetworkPolicy to update DataUsageInfo. + */ + public void updateDataLimit(DataUsageInfo info, NetworkPolicy policy) { + if (info == null || policy == null) { + return; + } + if (policy.warningBytes >= 0) { + info.warningLevel = policy.warningBytes; + } + if (policy.limitBytes >= 0) { + info.limitLevel = policy.limitBytes; + } + } + + /** + * @returns the most appropriate limit for the data usage summary. Use the total usage when it + * is higher than the limit and warning level. Use the limit when it is set and less than usage. + * Otherwise use warning level. + */ + public long getSummaryLimit(DataUsageInfo info) { + long limit = info.limitLevel; + if (limit <= 0) { + limit = info.warningLevel; + } + if (info.usageLevel > limit) { + limit = info.usageLevel; + } + return limit; + } +} diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java index e334a5af9a5..f975d115804 100644 --- a/src/com/android/settings/datausage/DataUsageSummary.java +++ b/src/com/android/settings/datausage/DataUsageSummary.java @@ -20,7 +20,6 @@ import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.INetworkStatsSession; -import android.net.NetworkPolicy; import android.net.NetworkTemplate; import android.net.TrafficStats; import android.os.Bundle; @@ -71,6 +70,7 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs private static final String KEY_RESTRICT_BACKGROUND = "restrict_background"; private DataUsageController mDataUsageController; + private DataUsageInfoController mDataInfoController; private SummaryPreference mSummaryPreference; private Preference mLimitPreference; private NetworkTemplate mDefaultTemplate; @@ -82,6 +82,7 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs boolean hasMobileData = hasMobileData(getContext()); mDataUsageController = new DataUsageController(getContext()); + mDataInfoController = new DataUsageInfoController(); addPreferencesFromResource(R.xml.data_usage); int defaultSubId = getDefaultSubscriptionId(getContext()); @@ -236,18 +237,14 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo( mDefaultTemplate); Context context = getContext(); - NetworkPolicy policy = services.mPolicyEditor.getPolicy(mDefaultTemplate); - info.warningLevel = policy.warningBytes; + + mDataInfoController.updateDataLimit(info, + services.mPolicyEditor.getPolicy(mDefaultTemplate)); + if (mSummaryPreference != null) { mSummaryPreference.setTitle( formatTitle(context, getString(mDataUsageTemplate), info.usageLevel)); - long limit = info.limitLevel; - if (limit <= 0) { - limit = info.warningLevel; - } - if (info.usageLevel > limit) { - limit = info.usageLevel; - } + long limit = mDataInfoController.getSummaryLimit(info); mSummaryPreference.setSummary(info.period); mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0), Formatter.formatFileSize(context, limit));