From 681c073fdb1fd2f28dc1cde61c6606a0b1a913f1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 21 Mar 2018 16:11:31 -0700 Subject: [PATCH] Fix crash when launching mobile data usage page via intent. Need to parse parameters from Intent if argument is empty or has no parameter. Change-Id: I23af434e1be794036dc711b72e0d9afa8bd65aa6 Fixes: 74235734 Test: robotests --- .../settings/datausage/DataUsageList.java | 28 ++++++++++--- .../settings/datausage/DataUsageListTest.java | 39 ++++++++++++++++++- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java index 587e325016c..2f676bafb47 100644 --- a/src/com/android/settings/datausage/DataUsageList.java +++ b/src/com/android/settings/datausage/DataUsageList.java @@ -23,6 +23,7 @@ import static android.telephony.TelephonyManager.SIM_STATE_READY; import android.app.ActivityManager; import android.app.LoaderManager.LoaderCallbacks; import android.content.Context; +import android.content.Intent; import android.content.Loader; import android.content.pm.UserInfo; import android.graphics.Color; @@ -39,6 +40,8 @@ import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; +import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.telephony.SubscriptionInfo; @@ -98,8 +101,10 @@ public class DataUsageList extends DataUsageBase { private INetworkStatsSession mStatsSession; private ChartDataUsagePreference mChart; - private NetworkTemplate mTemplate; - private int mSubId; + @VisibleForTesting + NetworkTemplate mTemplate; + @VisibleForTesting + int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ChartData mChartData; private LoadingViewController mLoadingViewController; @@ -138,10 +143,7 @@ public class DataUsageList extends DataUsageBase { mUsageAmount = findPreference(KEY_USAGE_AMOUNT); mChart = (ChartDataUsagePreference) findPreference(KEY_CHART_DATA); mApps = (PreferenceGroup) findPreference(KEY_APPS_GROUP); - - final Bundle args = getArguments(); - mSubId = args.getInt(EXTRA_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); - mTemplate = args.getParcelable(EXTRA_NETWORK_TEMPLATE); + processArgument(); } @Override @@ -232,6 +234,20 @@ public class DataUsageList extends DataUsageBase { super.onDestroy(); } + void processArgument() { + final Bundle args = getArguments(); + if (args != null) { + mSubId = args.getInt(EXTRA_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + mTemplate = args.getParcelable(EXTRA_NETWORK_TEMPLATE); + } + if (mTemplate == null && mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + final Intent intent = getIntent(); + mSubId = intent.getIntExtra(Settings.EXTRA_SUB_ID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + mTemplate = intent.getParcelableExtra(Settings.EXTRA_NETWORK_TEMPLATE); + } + } + /** * Update body content based on current tab. Loads * {@link NetworkStatsHistory} and {@link NetworkPolicy} from system, and diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java index 8789595d1fd..04b50305972 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java @@ -16,12 +16,19 @@ package com.android.settings.datausage; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.app.Activity; import android.content.Context; +import android.content.Intent; +import android.net.NetworkTemplate; +import android.os.Bundle; +import android.provider.Settings; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -62,10 +69,38 @@ public class DataUsageListTest { mDataUsageList.onAttach(mContext); mDataUsageList.onResume(); - verify(mListener).setListener(true, 0, mContext); + verify(mListener).setListener(true, mDataUsageList.mSubId, mContext); mDataUsageList.onPause(); - verify(mListener).setListener(false, 0, mContext); + verify(mListener).setListener(false, mDataUsageList.mSubId, mContext); + } + + @Test + public void processArgument_shouldGetTemplateFromArgument() { + final Bundle args = new Bundle(); + args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mock(NetworkTemplate.class)); + args.putInt(DataUsageList.EXTRA_SUB_ID, 3); + mDataUsageList.setArguments(args); + + mDataUsageList.processArgument(); + + assertThat(mDataUsageList.mTemplate).isNotNull(); + assertThat(mDataUsageList.mSubId).isEqualTo(3); + } + + @Test + public void processArgument_fromIntent_shouldGetTemplateFromIntent() { + final Activity activity = mock(Activity.class); + final Intent intent = new Intent(); + intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, mock(NetworkTemplate.class)); + intent.putExtra(Settings.EXTRA_SUB_ID, 3); + when(activity.getIntent()).thenReturn(intent); + doReturn(activity).when(mDataUsageList).getActivity(); + + mDataUsageList.processArgument(); + + assertThat(mDataUsageList.mTemplate).isNotNull(); + assertThat(mDataUsageList.mSubId).isEqualTo(3); } }