[DataUsage] UX enhancement
Some of the field didn't take eu languages into consideration. Enhance it through changing the: 1. Format of display 2. Parser after user input 3. IME support for comma in eu language Bug: 141536928 Test: Manual input and check for results Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=BillingCycleSettingsTest Change-Id: Ia7afc88c9043e924f205f966c4091248261b0aee
This commit is contained in:
@@ -25,9 +25,11 @@ import android.content.res.Resources;
|
|||||||
import android.net.NetworkPolicy;
|
import android.net.NetworkPolicy;
|
||||||
import android.net.NetworkTemplate;
|
import android.net.NetworkTemplate;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.method.NumberKeyListener;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.NumberPicker;
|
import android.widget.NumberPicker;
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
@@ -45,6 +47,8 @@ import com.android.settingslib.NetworkPolicyEditor;
|
|||||||
import com.android.settingslib.net.DataUsageController;
|
import com.android.settingslib.net.DataUsageController;
|
||||||
import com.android.settingslib.search.SearchIndexable;
|
import com.android.settingslib.search.SearchIndexable;
|
||||||
|
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
@SearchIndexable
|
@SearchIndexable
|
||||||
@@ -279,30 +283,35 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements
|
|||||||
final DataUsageEditController target = (DataUsageEditController) getTargetFragment();
|
final DataUsageEditController target = (DataUsageEditController) getTargetFragment();
|
||||||
final NetworkPolicyEditor editor = target.getNetworkPolicyEditor();
|
final NetworkPolicyEditor editor = target.getNetworkPolicyEditor();
|
||||||
|
|
||||||
|
bytesPicker.setKeyListener(new NumberKeyListener() {
|
||||||
|
protected char[] getAcceptedChars() {
|
||||||
|
return new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
',', '.'};
|
||||||
|
}
|
||||||
|
public int getInputType() {
|
||||||
|
return EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_FLAG_DECIMAL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
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);
|
||||||
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;
|
final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
|
||||||
|
|
||||||
if (bytes > 1.5f * GIB_IN_BYTES) {
|
final boolean unitInGigaBytes = (bytes > 1.5f * GIB_IN_BYTES);
|
||||||
final String bytesText = formatText(bytes / (float) GIB_IN_BYTES);
|
final String bytesText = formatText(bytes,
|
||||||
|
unitInGigaBytes ? GIB_IN_BYTES : MIB_IN_BYTES);
|
||||||
bytesPicker.setText(bytesText);
|
bytesPicker.setText(bytesText);
|
||||||
bytesPicker.setSelection(0, bytesText.length());
|
bytesPicker.setSelection(0, bytesText.length());
|
||||||
|
|
||||||
type.setSelection(1);
|
type.setSelection(unitInGigaBytes ? 1 : 0);
|
||||||
} else {
|
|
||||||
final String bytesText = formatText(bytes / (float) MIB_IN_BYTES);
|
|
||||||
bytesPicker.setText(bytesText);
|
|
||||||
bytesPicker.setSelection(0, bytesText.length());
|
|
||||||
|
|
||||||
type.setSelection(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String formatText(float v) {
|
private String formatText(double v, double unitInBytes) {
|
||||||
v = Math.round(v * 100) / 100f;
|
final NumberFormat formatter = NumberFormat.getNumberInstance();
|
||||||
return String.valueOf(v);
|
formatter.setMaximumFractionDigits(2);
|
||||||
|
return formatter.format((double) (v / unitInBytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -315,15 +324,22 @@ public class BillingCycleSettings extends DataUsageBaseFragment 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);
|
final EditText bytesField = (EditText) mView.findViewById(R.id.bytes);
|
||||||
Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner);
|
final Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner);
|
||||||
|
|
||||||
String bytesString = bytesField.getText().toString();
|
final String bytesString = bytesField.getText().toString();
|
||||||
if (bytesString.isEmpty() || bytesString.equals(".")) {
|
|
||||||
bytesString = "0";
|
final NumberFormat formatter = NumberFormat.getNumberInstance();
|
||||||
|
Number number = null;
|
||||||
|
try {
|
||||||
|
number = formatter.parse(bytesString);
|
||||||
|
} catch (ParseException ex) {
|
||||||
}
|
}
|
||||||
final long bytes = (long) (Float.valueOf(bytesString)
|
long bytes = 0L;
|
||||||
|
if (number != null) {
|
||||||
|
bytes = (long) (number.floatValue()
|
||||||
* (spinner.getSelectedItemPosition() == 0 ? MIB_IN_BYTES : GIB_IN_BYTES));
|
* (spinner.getSelectedItemPosition() == 0 ? MIB_IN_BYTES : GIB_IN_BYTES));
|
||||||
|
}
|
||||||
|
|
||||||
// to fix the overflow problem
|
// to fix the overflow problem
|
||||||
final long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes);
|
final long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes);
|
||||||
|
Reference in New Issue
Block a user