Fix locale number formatting issues

pull/437/head
Alex Baker 8 years ago
parent 7871fdda6c
commit 33b8218463

@ -31,6 +31,7 @@ import org.tasks.filters.FilterProvider;
import org.tasks.filters.NavigationDrawerAction; import org.tasks.filters.NavigationDrawerAction;
import org.tasks.filters.NavigationDrawerSeparator; import org.tasks.filters.NavigationDrawerSeparator;
import org.tasks.filters.NavigationDrawerSubheader; import org.tasks.filters.NavigationDrawerSubheader;
import org.tasks.locale.Locale;
import org.tasks.preferences.BasicPreferences; import org.tasks.preferences.BasicPreferences;
import org.tasks.preferences.HelpAndFeedbackActivity; import org.tasks.preferences.HelpAndFeedbackActivity;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
@ -51,6 +52,7 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
private final FilterCounter filterCounter; private final FilterCounter filterCounter;
private final Activity activity; private final Activity activity;
private boolean navigationDrawer; private boolean navigationDrawer;
private final Locale locale;
private final FilterListUpdateReceiver filterListUpdateReceiver = new FilterListUpdateReceiver(); private final FilterListUpdateReceiver filterListUpdateReceiver = new FilterListUpdateReceiver();
/** layout inflater */ /** layout inflater */
@ -58,12 +60,13 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
private final ThemeCache themeCache; private final ThemeCache themeCache;
public FilterAdapter(FilterProvider filterProvider, FilterCounter filterCounter, Activity activity, public FilterAdapter(FilterProvider filterProvider, FilterCounter filterCounter, Activity activity,
boolean navigationDrawer, Theme theme, ThemeCache themeCache) { boolean navigationDrawer, Theme theme, ThemeCache themeCache, Locale locale) {
super(activity, 0); super(activity, 0);
this.filterProvider = filterProvider; this.filterProvider = filterProvider;
this.filterCounter = filterCounter; this.filterCounter = filterCounter;
this.activity = activity; this.activity = activity;
this.navigationDrawer = navigationDrawer; this.navigationDrawer = navigationDrawer;
this.locale = locale;
this.inflater = theme.getLayoutInflater(activity); this.inflater = theme.getLayoutInflater(activity);
this.themeCache = themeCache; this.themeCache = themeCache;
} }
@ -294,7 +297,7 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
int countInt = 0; int countInt = 0;
if(filterCounter.containsKey(filter)) { if(filterCounter.containsKey(filter)) {
countInt = filterCounter.get(filter); countInt = filterCounter.get(filter);
viewHolder.size.setText(Integer.toString(countInt)); viewHolder.size.setText(locale.formatNumber(countInt));
} }
viewHolder.size.setVisibility(countInt > 0 ? View.VISIBLE : View.INVISIBLE); viewHolder.size.setVisibility(countInt > 0 ? View.VISIBLE : View.INVISIBLE);

@ -40,6 +40,7 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.filters.FilterCriteriaProvider; import org.tasks.filters.FilterCriteriaProvider;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ThemedInjectingAppCompatActivity; import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.locale.Locale;
import org.tasks.ui.MenuColorizer; import org.tasks.ui.MenuColorizer;
import java.util.ArrayList; import java.util.ArrayList;
@ -134,6 +135,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
@Inject StoreObjectDao storeObjectDao; @Inject StoreObjectDao storeObjectDao;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject FilterCriteriaProvider filterCriteriaProvider; @Inject FilterCriteriaProvider filterCriteriaProvider;
@Inject Locale locale;
@BindView(R.id.tag_name) EditText filterName; @BindView(R.id.tag_name) EditText filterName;
@BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.toolbar) Toolbar toolbar;
@ -157,7 +159,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
List<CriterionInstance> startingCriteria = new ArrayList<>(); List<CriterionInstance> startingCriteria = new ArrayList<>();
startingCriteria.add(getStartingUniverse()); startingCriteria.add(getStartingUniverse());
adapter = new CustomFilterAdapter(this, dialogBuilder, startingCriteria); adapter = new CustomFilterAdapter(this, dialogBuilder, startingCriteria, locale);
listView.setAdapter(adapter); listView.setAdapter(adapter);
updateList(); updateList();

@ -24,6 +24,7 @@ import com.todoroo.astrid.core.CustomFilterActivity.CriterionInstance;
import org.tasks.R; import org.tasks.R;
import org.tasks.dialogs.AlertDialogBuilder; import org.tasks.dialogs.AlertDialogBuilder;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.locale.Locale;
import java.util.List; import java.util.List;
@ -38,11 +39,14 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
private final CustomFilterActivity activity; private final CustomFilterActivity activity;
private DialogBuilder dialogBuilder; private DialogBuilder dialogBuilder;
private final LayoutInflater inflater; private final LayoutInflater inflater;
private final Locale locale;
public CustomFilterAdapter(CustomFilterActivity activity, DialogBuilder dialogBuilder, List<CriterionInstance> objects) { public CustomFilterAdapter(CustomFilterActivity activity, DialogBuilder dialogBuilder,
List<CriterionInstance> objects, Locale locale) {
super(activity, R.id.name, objects); super(activity, R.id.name, objects);
this.activity = activity; this.activity = activity;
this.dialogBuilder = dialogBuilder; this.dialogBuilder = dialogBuilder;
this.locale = locale;
inflater = activity.getLayoutInflater(); inflater = activity.getLayoutInflater();
} }
@ -189,7 +193,7 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
} }
viewHolder.name.setText(title); viewHolder.name.setText(title);
viewHolder.filterCount.setText(Integer.toString(item.end)); viewHolder.filterCount.setText(locale.formatNumber(item.end));
} }

@ -12,6 +12,7 @@ import org.tasks.filters.FilterCounter;
import org.tasks.filters.FilterProvider; import org.tasks.filters.FilterProvider;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
@ -30,6 +31,7 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity {
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Theme theme; @Inject Theme theme;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject Locale locale;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -38,7 +40,7 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity {
final boolean returnFilter = getIntent().getBooleanExtra(EXTRA_RETURN_FILTER, false); final boolean returnFilter = getIntent().getBooleanExtra(EXTRA_RETURN_FILTER, false);
final FilterAdapter filterAdapter = new FilterAdapter(filterProvider, filterCounter, this, final FilterAdapter filterAdapter = new FilterAdapter(filterProvider, filterCounter, this,
false, theme, themeCache); false, theme, themeCache, locale);
filterAdapter.populateList(); filterAdapter.populateList();
dialogBuilder.newDialog() dialogBuilder.newDialog()

@ -6,12 +6,14 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.TextView;
import com.rey.material.widget.Slider; import com.rey.material.widget.Slider;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent; import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import javax.inject.Inject; import javax.inject.Inject;
@ -23,12 +25,16 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
private static final String EXTRA_LAYOUT = "extra_layout"; private static final String EXTRA_LAYOUT = "extra_layout";
private static final String EXTRA_INITIAL_VALUE = "extra_initial_value"; private static final String EXTRA_INITIAL_VALUE = "extra_initial_value";
private static final String EXTRA_MIN = "extra_min";
private static final String EXTRA_MAX = "extra_max";
private static final String EXTRA_REQUEST_CODE = "extra_request_code"; private static final String EXTRA_REQUEST_CODE = "extra_request_code";
public static SeekBarDialog newSeekBarDialog(int layout, int initial, int requestCode) { public static SeekBarDialog newSeekBarDialog(int layout, int min, int max, int initial, int requestCode) {
SeekBarDialog dialog = new SeekBarDialog(); SeekBarDialog dialog = new SeekBarDialog();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putInt(EXTRA_LAYOUT, layout); args.putInt(EXTRA_LAYOUT, layout);
args.putInt(EXTRA_MIN, min);
args.putInt(EXTRA_MAX, max);
dialog.setArguments(args); dialog.setArguments(args);
dialog.initial = initial; dialog.initial = initial;
dialog.requestCode = requestCode; dialog.requestCode = requestCode;
@ -40,9 +46,12 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
} }
@BindView(R.id.slider) Slider slider; @BindView(R.id.slider) Slider slider;
@BindView(R.id.min) TextView min;
@BindView(R.id.max) TextView max;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Theme theme; @Inject Theme theme;
@Inject Locale locale;
private int initial; private int initial;
private int requestCode; private int requestCode;
@ -63,6 +72,10 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
ButterKnife.bind(this, view); ButterKnife.bind(this, view);
slider.setValue(initial, true); slider.setValue(initial, true);
slider.setValueDescriptionProvider(value -> locale.formatNumber(value));
slider.setValueRange(arguments.getInt(EXTRA_MIN), arguments.getInt(EXTRA_MAX), false);
min.setText(locale.formatNumber(slider.getMinValue()));
max.setText(locale.formatNumber(slider.getMaxValue()));
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setView(view) .setView(view)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> callback.valueSelected(slider.getValue(), requestCode)) .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> callback.valueSelected(slider.getValue(), requestCode))

@ -15,6 +15,8 @@ import com.google.common.base.Strings;
import org.tasks.R; import org.tasks.R;
import java.text.NumberFormat;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
public class Locale { public class Locale {
@ -138,6 +140,14 @@ public class Locale {
return locale.getDisplayName(locale); return locale.getDisplayName(locale);
} }
public String formatNumber(int number) {
return NumberFormat.getNumberInstance(appLocale).format(number);
}
public String formatPercentage(int percentage) {
return NumberFormat.getPercentInstance(appLocale).format(percentage / 100.0);
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

@ -27,6 +27,7 @@ import org.tasks.filters.FilterProvider;
import org.tasks.filters.NavigationDrawerAction; import org.tasks.filters.NavigationDrawerAction;
import org.tasks.injection.FragmentComponent; import org.tasks.injection.FragmentComponent;
import org.tasks.injection.InjectingFragment; import org.tasks.injection.InjectingFragment;
import org.tasks.locale.Locale;
import org.tasks.preferences.AppearancePreferences; import org.tasks.preferences.AppearancePreferences;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
@ -64,6 +65,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
@Inject FilterProvider filterProvider; @Inject FilterProvider filterProvider;
@Inject Theme theme; @Inject Theme theme;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject Locale locale;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -133,7 +135,7 @@ public class NavigationDrawerFragment extends InjectingFragment {
private void setUpList() { private void setUpList() {
adapter = new FilterAdapter(filterProvider, filterCounter, getActivity(), adapter = new FilterAdapter(filterProvider, filterCounter, getActivity(),
true, theme, themeCache); true, theme, themeCache, locale);
mDrawerListView.setAdapter(adapter); mDrawerListView.setAdapter(adapter);
registerForContextMenu(mDrawerListView); registerForContextMenu(mDrawerListView);
} }

@ -18,14 +18,13 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.SeekBarDialog; import org.tasks.dialogs.SeekBarDialog;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor; import org.tasks.themes.ThemeColor;
import org.tasks.themes.WidgetTheme; import org.tasks.themes.WidgetTheme;
import java.text.NumberFormat;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog; import static org.tasks.dialogs.SeekBarDialog.newSeekBarDialog;
@ -47,6 +46,7 @@ public class WidgetConfigActivity extends InjectingPreferenceActivity implements
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject DefaultFilterProvider defaultFilterProvider; @Inject DefaultFilterProvider defaultFilterProvider;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject Locale locale;
private WidgetPreferences widgetPreferences; private WidgetPreferences widgetPreferences;
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@ -99,13 +99,13 @@ public class WidgetConfigActivity extends InjectingPreferenceActivity implements
}); });
getPref(R.string.p_widget_opacity).setOnPreferenceClickListener(preference -> { getPref(R.string.p_widget_opacity).setOnPreferenceClickListener(preference -> {
newSeekBarDialog(R.layout.dialog_opacity_seekbar, widgetPreferences.getOpacity(), REQUEST_OPACITY) newSeekBarDialog(R.layout.dialog_opacity_seekbar, 0, 100, widgetPreferences.getOpacity(), REQUEST_OPACITY)
.show(getFragmentManager(), FRAG_TAG_OPACITY_SEEKBAR); .show(getFragmentManager(), FRAG_TAG_OPACITY_SEEKBAR);
return false; return false;
}); });
getPref(R.string.p_widget_font_size).setOnPreferenceClickListener(preference -> { getPref(R.string.p_widget_font_size).setOnPreferenceClickListener(preference -> {
newSeekBarDialog(R.layout.dialog_font_size_seekbar, widgetPreferences.getFontSize(), REQUEST_FONT_SIZE) newSeekBarDialog(R.layout.dialog_font_size_seekbar, 10, 22, widgetPreferences.getFontSize(), REQUEST_FONT_SIZE)
.show(getFragmentManager(), FRAG_TAG_FONT_SIZE_SEEKBAR); .show(getFragmentManager(), FRAG_TAG_FONT_SIZE_SEEKBAR);
return false; return false;
}); });
@ -127,12 +127,12 @@ public class WidgetConfigActivity extends InjectingPreferenceActivity implements
private void updateOpacity() { private void updateOpacity() {
int opacity = widgetPreferences.getOpacity(); int opacity = widgetPreferences.getOpacity();
getPref(R.string.p_widget_opacity).setSummary(NumberFormat.getPercentInstance().format(opacity / 100.0)); getPref(R.string.p_widget_opacity).setSummary(locale.formatPercentage(opacity));
} }
private void updateFontSize() { private void updateFontSize() {
int fontSize = widgetPreferences.getFontSize(); int fontSize = widgetPreferences.getFontSize();
getPref(R.string.p_widget_font_size).setSummary(NumberFormat.getIntegerInstance().format(fontSize)); getPref(R.string.p_widget_font_size).setSummary(locale.formatNumber(fontSize));
} }
private void updateFilter() { private void updateFilter() {

@ -15,12 +15,11 @@
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
app:sl_discreteMode="true" app:sl_discreteMode="true"
app:sl_maxValue="22"
app:sl_minValue="10"
app:sl_stepValue="2" app:sl_stepValue="2"
app:sl_travelAnimDuration="100" /> app:sl_travelAnimDuration="100" />
<TextView <TextView
android:id="@+id/min"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
@ -30,10 +29,10 @@
android:paddingLeft="@dimen/keyline_first" android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
android:paddingTop="5dp" android:paddingTop="5dp" />
android:text="10" />
<TextView <TextView
android:id="@+id/max"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
@ -43,7 +42,6 @@
android:paddingLeft="@dimen/keyline_first" android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
android:paddingTop="5dp" android:paddingTop="5dp" />
android:text="22" />
</RelativeLayout> </RelativeLayout>

@ -15,12 +15,11 @@
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
app:sl_discreteMode="true" app:sl_discreteMode="true"
app:sl_maxValue="100"
app:sl_minValue="0"
app:sl_stepValue="5" app:sl_stepValue="5"
app:sl_travelAnimDuration="100" /> app:sl_travelAnimDuration="100" />
<TextView <TextView
android:id="@+id/min"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
@ -30,10 +29,10 @@
android:paddingLeft="@dimen/keyline_first" android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
android:paddingTop="5dp" android:paddingTop="5dp" />
android:text="0" />
<TextView <TextView
android:id="@+id/max"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
@ -43,7 +42,6 @@
android:paddingLeft="@dimen/keyline_first" android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first" android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
android:paddingTop="5dp" android:paddingTop="5dp" />
android:text="100" />
</RelativeLayout> </RelativeLayout>

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="8dp"> android:paddingTop="8dp">
<View style="@style/horizontal_divider" <View
android:id="@+id/divider"
style="@style/horizontal_divider"
android:layout_gravity="top" /> android:layout_gravity="top" />
<TextView <TextView
@ -14,6 +16,9 @@
android:paddingEnd="0dp" android:paddingEnd="0dp"
android:paddingLeft="@dimen/keyline_first" android:paddingLeft="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first" android:paddingStart="@dimen/keyline_first"
android:layout_below="@id/divider"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
android:id="@+id/subheader_text" android:id="@+id/subheader_text"
android:textColor="?attr/asTextColor" android:textColor="?attr/asTextColor"
@ -21,8 +26,8 @@
android:textAlignment="viewStart" android:textAlignment="viewStart"
android:fontFamily="@string/font_fontFamily_medium" android:fontFamily="@string/font_fontFamily_medium"
android:alpha="0.54" android:alpha="0.54"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:layout_height="fill_parent"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />
</LinearLayout> </RelativeLayout>
Loading…
Cancel
Save