Add Locale wrapper

pull/437/head
Alex Baker 10 years ago
parent b203cbd9ce
commit 44e894f97b

@ -11,7 +11,7 @@ import android.preference.ListPreference;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import timber.log.Timber; import timber.log.Timber;
@ -35,7 +35,7 @@ public class MultilineListPreference extends ListPreference {
@Override @Override
protected void showDialog(Bundle state) { protected void showDialog(Bundle state) {
super.showDialog(state); super.showDialog(state);
LocaleUtils.fixDialogButtons(getDialog()); Locale.INSTANCE.fixDialogButtonDirectionality(getDialog());
} }
@Override @Override

@ -7,7 +7,7 @@ import android.view.ContextThemeWrapper;
import android.view.View; import android.view.View;
import android.widget.ListAdapter; import android.widget.ListAdapter;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import java.util.List; import java.util.List;
@ -19,10 +19,12 @@ public class AlertDialogBuilder {
private final AlertDialog.Builder builder; private final AlertDialog.Builder builder;
private final Context context; private final Context context;
private final Theme theme; private final Theme theme;
private final Locale locale;
public AlertDialogBuilder(Context context, Theme theme) { public AlertDialogBuilder(Context context, Theme theme, Locale locale) {
this.context = context; this.context = context;
this.theme = theme; this.theme = theme;
this.locale = locale;
ContextThemeWrapper wrapper = theme.getThemedDialog(context); ContextThemeWrapper wrapper = theme.getThemedDialog(context);
theme.applyToContext(wrapper); theme.applyToContext(wrapper);
builder = new AlertDialog.Builder(wrapper); builder = new AlertDialog.Builder(wrapper);
@ -83,7 +85,7 @@ public class AlertDialogBuilder {
private String[] addDirectionality(String[] strings) { private String[] addDirectionality(String[] strings) {
if (atLeastJellybeanMR1()) { if (atLeastJellybeanMR1()) {
final char directionalityMark = LocaleUtils.getDirectionalityMark(); final char directionalityMark = locale.getDirectionalityMark();
for (int i = 0 ; i < strings.length ; i++) { for (int i = 0 ; i < strings.length ; i++) {
strings[i] = directionalityMark + strings[i]; strings[i] = directionalityMark + strings[i];
} }
@ -126,14 +128,14 @@ public class AlertDialogBuilder {
AlertDialog dialog = create(); AlertDialog dialog = create();
theme.applyToContext(dialog.getListView().getContext()); theme.applyToContext(dialog.getListView().getContext());
dialog.show(); dialog.show();
LocaleUtils.fixDialogButtons(dialog); locale.fixDialogButtonDirectionality(dialog);
return dialog; return dialog;
} }
public AlertDialog show() { public AlertDialog show() {
AlertDialog dialog = create(); AlertDialog dialog = create();
dialog.show(); dialog.show();
LocaleUtils.fixDialogButtons(dialog); locale.fixDialogButtonDirectionality(dialog);
return dialog; return dialog;
} }
} }

@ -6,6 +6,7 @@ import android.graphics.drawable.ColorDrawable;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import javax.inject.Inject; import javax.inject.Inject;
@ -13,15 +14,17 @@ import javax.inject.Inject;
public class DialogBuilder { public class DialogBuilder {
private final Activity activity; private final Activity activity;
private final Theme theme; private final Theme theme;
private final Locale locale;
@Inject @Inject
public DialogBuilder(Activity activity, Theme theme) { public DialogBuilder(Activity activity, Theme theme, Locale locale) {
this.activity = activity; this.activity = activity;
this.theme = theme; this.theme = theme;
this.locale = locale;
} }
public AlertDialogBuilder newDialog() { public AlertDialogBuilder newDialog() {
return new AlertDialogBuilder(activity, theme); return new AlertDialogBuilder(activity, theme, locale);
} }
@Deprecated @Deprecated

@ -7,7 +7,7 @@ import android.preference.PreferenceManager;
import org.tasks.ErrorReportingSingleThreadExecutor; import org.tasks.ErrorReportingSingleThreadExecutor;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.ui.CheckBoxes; import org.tasks.ui.CheckBoxes;
import org.tasks.ui.WidgetCheckBoxes; import org.tasks.ui.WidgetCheckBoxes;
@ -30,8 +30,13 @@ public class ApplicationModule {
public ApplicationModule(Context context) { public ApplicationModule(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String language = prefs.getString(context.getString(R.string.p_language), null); String language = prefs.getString(context.getString(R.string.p_language), null);
LocaleUtils.setLocale(language); Locale.INSTANCE = new Locale(java.util.Locale.getDefault(), language);
this.context = LocaleUtils.createConfigurationContext(context.getApplicationContext()); this.context = Locale.INSTANCE.createConfigurationContext(context.getApplicationContext());
}
@Provides
public Locale getLocale() {
return Locale.INSTANCE;
} }
@Provides @Provides

@ -4,7 +4,7 @@ import android.os.Bundle;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import javax.inject.Inject; import javax.inject.Inject;
@ -14,7 +14,7 @@ public abstract class InjectingAppCompatActivity extends AppCompatActivity imple
@Inject Tracker tracker; @Inject Tracker tracker;
public InjectingAppCompatActivity() { public InjectingAppCompatActivity() {
LocaleUtils.applyOverrideConfiguration(this); Locale.INSTANCE.applyOverrideConfiguration(this);
} }
@Override @Override

@ -13,7 +13,7 @@ import android.widget.LinearLayout;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import org.tasks.preferences.AppCompatPreferenceActivity; import org.tasks.preferences.AppCompatPreferenceActivity;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.ui.MenuColorizer; import org.tasks.ui.MenuColorizer;
@ -32,7 +32,7 @@ public abstract class InjectingPreferenceActivity extends AppCompatPreferenceAct
@Inject Tracker tracker; @Inject Tracker tracker;
public InjectingPreferenceActivity() { public InjectingPreferenceActivity() {
LocaleUtils.applyOverrideConfiguration(this); Locale.INSTANCE.applyOverrideConfiguration(this);
} }
@Override @Override

@ -0,0 +1,135 @@
package org.tasks.locale;
import android.app.Dialog;
import android.content.Context;
import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.view.ViewParent;
import com.google.common.base.Strings;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
public class Locale {
public static Locale INSTANCE;
private static final int[] sDialogButtons = new int[] { android.R.id.button1, android.R.id.button2, android.R.id.button3 };
private static final char LEFT_TO_RIGHT_MARK = '\u200e';
private static final char RIGHT_TO_LEFT_MARK = '\u200f';
public static java.util.Locale localeFromString(String locale) {
if (Strings.isNullOrEmpty(locale)) {
return null;
}
String[] split = locale.split("-");
if (split.length == 1) {
return new java.util.Locale(split[0]);
} else if (split.length == 2) {
return new java.util.Locale(split[0], split[1]);
}
throw new RuntimeException();
}
private final java.util.Locale deviceLocale;
private final java.util.Locale appLocale;
private final int deviceDirectionality;
private final int appDirectionality;
private final String override;
public Locale(java.util.Locale deviceLocale, String override) {
this.deviceLocale = deviceLocale;
this.appLocale = localeFromString(override);
this.override = override;
deviceDirectionality = TextUtils.getLayoutDirectionFromLocale(deviceLocale);
if (appLocale != null) {
java.util.Locale.setDefault(appLocale);
appDirectionality = TextUtils.getLayoutDirectionFromLocale(appLocale);
} else {
appDirectionality = deviceDirectionality;
}
}
public java.util.Locale getLocale() {
return appLocale == null ? deviceLocale : appLocale;
}
public char getDeviceDirectionalityMark() {
return getDirectionalityMark(deviceDirectionality);
}
public char getDirectionalityMark() {
return getDirectionalityMark(appDirectionality);
}
private char getDirectionalityMark(int directionality) {
return directionality == View.LAYOUT_DIRECTION_RTL ? RIGHT_TO_LEFT_MARK : LEFT_TO_RIGHT_MARK;
}
public String getOverride() {
return override;
}
public Context createConfigurationContext(Context context) {
return appLocale == null ? context : context.createConfigurationContext(getLocaleConfiguration());
}
private Configuration getLocaleConfiguration() {
Configuration configuration = new Configuration();
configuration.setLocale(appLocale);
return configuration;
}
public void fixDialogButtonDirectionality(Dialog dialog) {
if (appDirectionality != deviceDirectionality) {
for (int id : sDialogButtons) {
ViewParent parent = dialog.findViewById(id).getParent();
((View) parent).setLayoutDirection(appDirectionality);
}
}
}
public void applyOverrideConfiguration(ContextThemeWrapper wrapper) {
if (appLocale != null && atLeastJellybeanMR1()) {
wrapper.applyOverrideConfiguration(getLocaleConfiguration());
}
}
public Locale withOverride(String language) {
return new Locale(deviceLocale, language);
}
public String getDisplayName() {
java.util.Locale locale = getLocale();
return locale.getDisplayName(locale);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Locale locale = (Locale) o;
return override != null ? override.equals(locale.override) : locale.override == null;
}
@Override
public int hashCode() {
return override != null ? override.hashCode() : 0;
}
@Override
public String toString() {
return "Locale{" +
"deviceLocale=" + deviceLocale +
", appLocale=" + appLocale +
", override='" + override + '\'' +
'}';
}
}

@ -6,6 +6,8 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import com.google.common.base.Function;
import org.tasks.R; import org.tasks.R;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.DialogFragmentComponent;
@ -13,15 +15,11 @@ import org.tasks.injection.ForApplication;
import org.tasks.injection.InjectingDialogFragment; import org.tasks.injection.InjectingDialogFragment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.locale.LocaleUtils.localeFromString; import static com.google.common.collect.Lists.transform;
public class LocalePickerDialog extends InjectingDialogFragment { public class LocalePickerDialog extends InjectingDialogFragment {
@ -31,29 +29,33 @@ public class LocalePickerDialog extends InjectingDialogFragment {
} }
public interface LocaleSelectionHandler { public interface LocaleSelectionHandler {
void onLocaleSelected(String locale); void onLocaleSelected(Locale locale);
} }
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject @ForApplication Context context; @Inject @ForApplication Context context;
@Inject Locale locale;
private LocaleSelectionHandler callback; private LocaleSelectionHandler callback;
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
final Map<String, String> translations = new HashMap<>(); final List<Locale> locales = new ArrayList<>();
for (String translation : getResources().getStringArray(R.array.localization)) { for (String override : getResources().getStringArray(R.array.localization)) {
Locale locale = localeFromString(translation); locales.add(locale.withOverride(override));
translations.put(locale.getDisplayName(locale), translation); }
final List<String> display = transform(locales, new Function<Locale, String>() {
@Override
public String apply(Locale input) {
return input.getDisplayName();
} }
final List<String> display = new ArrayList<>(translations.keySet()); });
Collections.sort(display);
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setItems(display, new DialogInterface.OnClickListener() { .setItems(display, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss(); dialogInterface.dismiss();
callback.onLocaleSelected(translations.get(display.get(i))); callback.onLocaleSelected(locales.get(i));
} }
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)

@ -1,89 +0,0 @@
package org.tasks.locale;
import android.app.Dialog;
import android.content.Context;
import android.content.res.Configuration;
import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.view.ViewParent;
import com.google.common.base.Strings;
import java.util.Locale;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
public class LocaleUtils {
public static Locale localeFromString(String locale) {
if (Strings.isNullOrEmpty(locale)) {
return null;
}
String[] split = locale.split("-");
if (split.length == 1) {
return new Locale(split[0]);
} else if (split.length == 2) {
return new Locale(split[0], split[1]);
}
throw new RuntimeException();
}
private static final int[] sDialogButtons = new int[] { android.R.id.button1, android.R.id.button2, android.R.id.button3 };
private static final char LEFT_TO_RIGHT_MARK = '\u200e';
private static final char RIGHT_TO_LEFT_MARK = '\u200f';
private static String sLocaleString;
private static Locale sLocale;
public static Locale getLocale() {
return sLocale == null ? Locale.getDefault() : sLocale;
}
public static char getDirectionalityMark() {
return TextUtils.getLayoutDirectionFromLocale(getLocale()) == View.LAYOUT_DIRECTION_LTR
? LEFT_TO_RIGHT_MARK
: RIGHT_TO_LEFT_MARK;
}
public static String getsLocaleString() {
return sLocaleString;
}
public static void setLocale(String locale) {
sLocaleString = locale;
sLocale = localeFromString(locale);
if (sLocale != null) {
Locale.setDefault(sLocale);
}
}
public static void fixDialogButtons(Dialog dialog) {
if (sLocale != null) {
int layoutDirectionFromLocale = TextUtils.getLayoutDirectionFromLocale(sLocale);
for (int id : sDialogButtons) {
ViewParent parent = dialog.findViewById(id).getParent();
setDirection((View) parent, layoutDirectionFromLocale);
}
}
}
private static void setDirection(View view, int direction) {
view.setLayoutDirection(direction);
}
public static void applyOverrideConfiguration(ContextThemeWrapper wrapper) {
if (sLocale != null && atLeastJellybeanMR1()) {
wrapper.applyOverrideConfiguration(getLocaleConfiguration());
}
}
public static Context createConfigurationContext(Context context) {
return sLocale == null ? context : context.createConfigurationContext(getLocaleConfiguration());
}
private static Configuration getLocaleConfiguration() {
Configuration configuration = new Configuration();
configuration.setLocale(sLocale);
return configuration;
}
}

@ -28,8 +28,6 @@ import android.view.MenuInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.tasks.locale.LocaleUtils;
/** /**
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat. * to be used with AppCompat.

@ -6,7 +6,6 @@ import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.preference.Preference; import android.preference.Preference;
import android.text.TextUtils;
import com.jakewharton.processphoenix.ProcessPhoenix; import com.jakewharton.processphoenix.ProcessPhoenix;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
@ -20,20 +19,17 @@ import org.tasks.analytics.Tracking;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.ThemePickerDialog; import org.tasks.dialogs.ThemePickerDialog;
import org.tasks.injection.InjectingPreferenceActivity; import org.tasks.injection.InjectingPreferenceActivity;
import org.tasks.locale.Locale;
import org.tasks.locale.LocalePickerDialog; import org.tasks.locale.LocalePickerDialog;
import org.tasks.locale.LocaleUtils;
import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeBase; import org.tasks.themes.ThemeBase;
import org.tasks.themes.ThemeColor; import org.tasks.themes.ThemeColor;
import java.util.Locale;
import javax.inject.Inject; import javax.inject.Inject;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
import static org.tasks.dialogs.ThemePickerDialog.newThemePickerDialog; import static org.tasks.dialogs.ThemePickerDialog.newThemePickerDialog;
import static org.tasks.locale.LocalePickerDialog.newLocalePickerDialog; import static org.tasks.locale.LocalePickerDialog.newLocalePickerDialog;
import static org.tasks.locale.LocaleUtils.localeFromString;
public abstract class BaseBasicPreferences extends InjectingPreferenceActivity implements public abstract class BaseBasicPreferences extends InjectingPreferenceActivity implements
ThemePickerDialog.ThemePickerCallback, ThemePickerDialog.ThemePickerCallback,
@ -52,6 +48,7 @@ public abstract class BaseBasicPreferences extends InjectingPreferenceActivity i
@Inject ThemeColor themeColor; @Inject ThemeColor themeColor;
@Inject ThemeAccent themeAccent; @Inject ThemeAccent themeAccent;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Locale locale;
private Bundle result; private Bundle result;
@Override @Override
@ -179,16 +176,16 @@ public abstract class BaseBasicPreferences extends InjectingPreferenceActivity i
} }
@Override @Override
public void onLocaleSelected(String newValue) { public void onLocaleSelected(Locale newValue) {
if (newValue == null) { if (newValue == null) {
preferences.remove(R.string.p_language); preferences.remove(R.string.p_language);
} else { } else {
preferences.setString(R.string.p_language, newValue); String override = newValue.getOverride();
preferences.setString(R.string.p_language, override);
tracker.reportEvent(Tracking.Events.SET_PREFERENCE, R.string.p_language, override);
} }
tracker.reportEvent(Tracking.Events.SET_PREFERENCE, R.string.p_language, newValue);
updateLocale(); updateLocale();
String currentValue = LocaleUtils.getsLocaleString(); if (!locale.equals(newValue)) {
if (!TextUtils.equals(currentValue, newValue)) {
dialogBuilder.newDialog() dialogBuilder.newDialog()
.setMessage(R.string.restart_required) .setMessage(R.string.restart_required)
.setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() {
@ -207,10 +204,7 @@ public abstract class BaseBasicPreferences extends InjectingPreferenceActivity i
private void updateLocale() { private void updateLocale() {
Preference languagePreference = findPreference(getString(R.string.p_language)); Preference languagePreference = findPreference(getString(R.string.p_language));
String preference = preferences.getStringValue(R.string.p_language); String preference = preferences.getStringValue(R.string.p_language);
Locale locale = localeFromString(preference); languagePreference.setSummary(locale.withOverride(preference).getDisplayName());
languagePreference.setSummary(locale == null
? getString(R.string.default_value)
: locale.getDisplayName(locale));
} }
@Override @Override

@ -1,11 +1,10 @@
package org.tasks.time; package org.tasks.time;
import org.tasks.locale.LocaleUtils; import org.tasks.locale.Locale;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -276,7 +275,7 @@ public class DateTime {
public String toString(String format) { public String toString(String format) {
Calendar calendar = getCalendar(); Calendar calendar = getCalendar();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, LocaleUtils.getLocale()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, Locale.INSTANCE.getLocale());
simpleDateFormat.setCalendar(calendar); simpleDateFormat.setCalendar(calendar);
return simpleDateFormat.format(calendar.getTime()); return simpleDateFormat.format(calendar.getTime());
} }

@ -10,7 +10,7 @@ import com.todoroo.astrid.subtasks.SubtasksHelper;
import org.tasks.injection.InjectingRemoteViewsService; import org.tasks.injection.InjectingRemoteViewsService;
import org.tasks.injection.ServiceComponent; import org.tasks.injection.ServiceComponent;
import org.tasks.locale.LocaleUtils; 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.ThemeBase; import org.tasks.themes.ThemeBase;
@ -30,6 +30,7 @@ public class ScrollableWidgetUpdateService extends InjectingRemoteViewsService {
@Inject DefaultFilterProvider defaultFilterProvider; @Inject DefaultFilterProvider defaultFilterProvider;
@Inject WidgetCheckBoxes widgetCheckBoxes; @Inject WidgetCheckBoxes widgetCheckBoxes;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject Locale locale;
@Override @Override
public void onStart(Intent intent, int startId) { public void onStart(Intent intent, int startId) {
@ -52,7 +53,7 @@ public class ScrollableWidgetUpdateService extends InjectingRemoteViewsService {
String filterId = (String) extras.get(FILTER_ID); String filterId = (String) extras.get(FILTER_ID);
int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
ThemeBase themeBase = themeCache.getThemeBase(preferences.getInt(WidgetConfigActivity.PREF_THEME + widgetId, 0)); ThemeBase themeBase = themeCache.getThemeBase(preferences.getInt(WidgetConfigActivity.PREF_THEME + widgetId, 0));
return new ScrollableViewsFactory(subtasksHelper, preferences, LocaleUtils.createConfigurationContext(getApplicationContext()), filterId, return new ScrollableViewsFactory(subtasksHelper, preferences, locale.createConfigurationContext(getApplicationContext()), filterId,
themeBase.getTextColor(), widgetId, database, taskService, defaultFilterProvider, widgetCheckBoxes); themeBase.getTextColor(), widgetId, database, taskService, defaultFilterProvider, widgetCheckBoxes);
} }

Loading…
Cancel
Save