Merge "Import translations. DO NOT MERGE" into pi-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5f29949..953480f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8786,15 +8786,15 @@
     <string name="data_remaining"><xliff:g name="bytes" example="2 GB">^1</xliff:g> left</string>
 
     <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
-    <string name="cycle_left_multiple_days"><xliff:g name="time" example="2d">%d</xliff:g> days left</string>
-
-    <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
     <plurals name="billing_cycle_days_left">
         <item quantity="one">%d day left</item>
         <item quantity="other">%d days left</item>
     </plurals>
 
     <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
+    <string name="billing_cycle_none_left">No time remaining</string>
+
+    <!-- Informational text about time left in billing cycle [CHAR LIMIT=60] -->
     <string name="billing_cycle_less_than_one_day_left">Less than 1 day left</string>
 
     <!-- Informational text about carrier and update time [CHAR LIMIT=30] -->
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index 6d9ef38..b05d180 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -28,6 +28,7 @@
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.SubscriptionPlan;
+import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -302,8 +303,18 @@
         @Override
         public void setListening(boolean listening) {
             if (listening) {
-                mSummaryLoader.setSummary(this,
-                        mActivity.getString(R.string.data_usage_summary_format, formatUsedData()));
+                TelephonyManager telephonyManager = (TelephonyManager) mActivity
+                        .getSystemService(Context.TELEPHONY_SERVICE);
+                final int simState = telephonyManager.getSimState();
+                // Note that pulling the SIM card returns UNKNOWN, not ABSENT.
+                if (simState == TelephonyManager.SIM_STATE_ABSENT
+                        || simState == TelephonyManager.SIM_STATE_UNKNOWN) {
+                    mSummaryLoader.setSummary(this, null);
+                } else {
+                    mSummaryLoader.setSummary(this,
+                            mActivity.getString(R.string.data_usage_summary_format,
+                                    formatUsedData()));
+                }
             }
         }
 
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 0ce8e4f..43ebecc 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -199,18 +199,18 @@
     }
 
     private void updateCycleTimeText(PreferenceViewHolder holder) {
-        float daysLeft =
-                ((float) mCycleEndTimeMs - System.currentTimeMillis()) / MILLIS_IN_A_DAY;
-        if (daysLeft < 0) {
-            daysLeft = 0;
-        }
-
         TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
-        cycleTime.setText(
-                (daysLeft > 0 && daysLeft < 1)
-                ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
-                : getContext().getResources().getQuantityString(
-                        R.plurals.billing_cycle_days_left, (int) daysLeft, (int) daysLeft));
+
+        long millisLeft = mCycleEndTimeMs - System.currentTimeMillis();
+        if (millisLeft <= 0) {
+            cycleTime.setText(getContext().getString(R.string.billing_cycle_none_left));
+        } else {
+            int daysLeft = (int)(millisLeft / MILLIS_IN_A_DAY);
+            cycleTime.setText(daysLeft < 1
+                            ? getContext().getString(R.string.billing_cycle_less_than_one_day_left)
+                            : getContext().getResources().getQuantityString(
+                            R.plurals.billing_cycle_days_left, daysLeft, daysLeft));
+        }
     }
 
 
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index 638ee79..58e42a0 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -179,7 +179,7 @@
     }
 
     @Test
-    public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayZeroDays() {
+    public void testSetUsageInfo_cycleRemainingTimeNegativeDaysLeft_shouldDisplayNoneLeft() {
         final long cycleEnd = System.currentTimeMillis() - 1L;
         mSummaryPreference.setUsageInfo(cycleEnd, mUpdateTime, DUMMY_CARRIER, 0 /* numPlans */,
                 new Intent());
@@ -187,7 +187,7 @@
         bindViewHolder();
         assertThat(mCycleTime.getVisibility()).isEqualTo(View.VISIBLE);
         assertThat(mCycleTime.getText()).isEqualTo(
-                mContext.getResources().getQuantityString(R.plurals.billing_cycle_days_left, 0, 0));
+                mContext.getString(R.string.billing_cycle_none_left));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 6892264..d065c73 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -18,13 +18,20 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.endsWith;
+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.net.ConnectivityManager;
+import android.telephony.TelephonyManager;
 import android.text.format.Formatter;
 
 import com.android.settings.R;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 
@@ -33,6 +40,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
 import org.robolectric.shadows.ShadowApplication;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -41,6 +49,12 @@
     @Mock
     private ConnectivityManager mManager;
     private Context mContext;
+    @Mock
+    TelephonyManager mTelephonyManager;
+    @Mock
+    private SummaryLoader mSummaryLoader;
+    private Activity mActivity;
+    private SummaryLoader.SummaryProvider mSummaryProvider;
 
     /**
      * This set up is contrived to get a passing test so that the build doesn't block without tests.
@@ -54,6 +68,12 @@
         shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager);
         mContext = shadowContext.getApplicationContext();
         when(mManager.isNetworkSupported(anyInt())).thenReturn(true);
+
+        mActivity = spy(Robolectric.buildActivity(Activity.class).get());
+        when(mActivity.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+
+        mSummaryProvider = DataUsageSummary.SUMMARY_PROVIDER_FACTORY
+                .createSummaryProvider(mActivity, mSummaryLoader);
     }
 
     @Test
@@ -66,4 +86,18 @@
         final String formattedAsFileSize = Formatter.formatFileSize(mContext, usage);
         assertThat(formattedUsage).isEqualTo(formattedAsFileSize);
     }
+
+    @Test
+    public void setListening_shouldBlankSummaryWithNoSim() {
+        when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
+        mSummaryProvider.setListening(true);
+        verify(mSummaryLoader).setSummary(mSummaryProvider, null);
+    }
+
+    @Test
+    public void setListening_shouldSetSummaryWithSim() {
+        when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_READY);
+        mSummaryProvider.setListening(true);
+        verify(mSummaryLoader).setSummary(anyObject(), endsWith(" of data used"));
+    }
 }