Display and parse numbers properly in all locales

Change-Id: Iddf74fd6ed3139eede27733b69a31ce2fa7d1a92
Fix: 37311645
Test: make RunSettingsRoboTests
This commit is contained in:
Fan Zhang
2017-04-17 16:58:25 -07:00
parent 526185c89b
commit 8648c5ed3d
2 changed files with 25 additions and 18 deletions

View File

@@ -14,13 +14,16 @@
package com.android.settings.datausage; 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.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.res.Resources; import android.content.res.Resources;
import android.icu.text.NumberFormat;
import android.net.NetworkPolicy; import android.net.NetworkPolicy;
import android.net.NetworkTemplate; import android.net.NetworkTemplate;
import android.os.Bundle; import android.os.Bundle;
@@ -42,8 +45,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.NetworkPolicyEditor;
import com.android.settingslib.net.DataUsageController; import com.android.settingslib.net.DataUsageController;
import static android.net.NetworkPolicy.LIMIT_DISABLED; import java.text.ParseException;
import static android.net.NetworkPolicy.WARNING_DISABLED;
public class BillingCycleSettings extends DataUsageBase implements public class BillingCycleSettings extends DataUsageBase implements
Preference.OnPreferenceChangeListener, DataUsageEditController { Preference.OnPreferenceChangeListener, DataUsageEditController {
@@ -246,7 +248,6 @@ public class BillingCycleSettings extends DataUsageBase implements
final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
final long bytes = isLimit ? editor.getPolicyLimitBytes(template) final long bytes = isLimit ? editor.getPolicyLimitBytes(template)
: editor.getPolicyWarningBytes(template); : editor.getPolicyWarningBytes(template);
final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
if (bytes > 1.5f * GB_IN_BYTES) { if (bytes > 1.5f * GB_IN_BYTES) {
final String bytesText = formatText(bytes / (float) 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) { private String formatText(float v) {
v = Math.round(v * 100) / 100f; v = Math.round(v * 100) / 100f;
return String.valueOf(v); return NumberFormat.getInstance().format(v);
} }
@Override @Override
@@ -278,14 +279,19 @@ public class BillingCycleSettings extends DataUsageBase implements
final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE); final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE);
final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
EditText bytesField = (EditText) mView.findViewById(R.id.bytes); EditText bytesField = mView.findViewById(R.id.bytes);
Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner); Spinner spinner = mView.findViewById(R.id.size_spinner);
String bytesString = bytesField.getText().toString(); 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)
final long bytes = (long) (input
* (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES)); * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
// to fix the overflow problem // to fix the overflow problem

View File

@@ -16,16 +16,17 @@
package com.android.settings.utils; 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 com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail; 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) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class ThreadUtilsTest { public class ThreadUtilsTest {