From 8648c5ed3d7c97915bd2ba0eeb413c98adf31eea Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 17 Apr 2017 16:58:25 -0700 Subject: [PATCH] Display and parse numbers properly in all locales Change-Id: Iddf74fd6ed3139eede27733b69a31ce2fa7d1a92 Fix: 37311645 Test: make RunSettingsRoboTests --- .../datausage/BillingCycleSettings.java | 28 +++++++++++-------- .../settings/utils/ThreadUtilsTest.java | 15 +++++----- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index dda984bd976..aca4809c8e2 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -14,13 +14,16 @@ package com.android.settings.datausage; +import static android.net.NetworkPolicy.LIMIT_DISABLED; +import static android.net.NetworkPolicy.WARNING_DISABLED; + import android.app.AlertDialog; import android.app.Dialog; -import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; +import android.icu.text.NumberFormat; import android.net.NetworkPolicy; import android.net.NetworkTemplate; import android.os.Bundle; @@ -42,8 +45,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.net.DataUsageController; -import static android.net.NetworkPolicy.LIMIT_DISABLED; -import static android.net.NetworkPolicy.WARNING_DISABLED; +import java.text.ParseException; public class BillingCycleSettings extends DataUsageBase implements Preference.OnPreferenceChangeListener, DataUsageEditController { @@ -246,7 +248,6 @@ public class BillingCycleSettings extends DataUsageBase implements final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); final long bytes = isLimit ? editor.getPolicyLimitBytes(template) : editor.getPolicyWarningBytes(template); - final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED; if (bytes > 1.5f * GB_IN_BYTES) { final String bytesText = formatText(bytes / (float) GB_IN_BYTES); @@ -265,7 +266,7 @@ public class BillingCycleSettings extends DataUsageBase implements private String formatText(float v) { v = Math.round(v * 100) / 100f; - return String.valueOf(v); + return NumberFormat.getInstance().format(v); } @Override @@ -278,15 +279,20 @@ public class BillingCycleSettings extends DataUsageBase implements final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE); final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); - EditText bytesField = (EditText) mView.findViewById(R.id.bytes); - Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner); + EditText bytesField = mView.findViewById(R.id.bytes); + Spinner spinner = mView.findViewById(R.id.size_spinner); String bytesString = bytesField.getText().toString(); - if (bytesString.isEmpty()) { - bytesString = "0"; + + double input = 0; + try { + input = NumberFormat.getInstance().parse(bytesString).doubleValue(); + } catch (ParseException e) { + Log.w(TAG, "Failed to parse byte value " + bytesString); } - final long bytes = (long) (Float.valueOf(bytesString) - * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES)); + + final long bytes = (long) (input + * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES)); // to fix the overflow problem final long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes); diff --git a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java index 4267ed18f8f..4ee42e0cd28 100644 --- a/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java +++ b/tests/robotests/src/com/android/settings/utils/ThreadUtilsTest.java @@ -16,16 +16,17 @@ package com.android.settings.utils; -import com.android.settings.TestConfig; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; -@RunWith(RobolectricTestRunner.class) +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class ThreadUtilsTest {