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
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index 587e325..2f676ba 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -23,6 +23,7 @@
 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.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 @@
     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 @@
         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 @@
         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 8789595..04b5030 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 @@
         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);
     }
 }