diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java index a75014cb..1b71a177 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/MainActivity.java @@ -87,7 +87,7 @@ import com.github.dfa.diaspora_android.web.ProxyHandler; import com.github.dfa.diaspora_android.web.WebHelper; import com.github.dfa.diaspora_android.web.custom_tab.CustomTabActivityHelper; -import net.gsantner.opoc.util.SimpleMarkdownParser; +import net.gsantner.opoc.format.markdown.SimpleMarkdownParser; import java.io.IOException; diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java b/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java index 0e151304..28914097 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/util/AppSettings.java @@ -145,7 +145,11 @@ public class AppSettings extends AppSettingsBase { } public void setPodAspects(DiasporaAspect[] aspects) { - setStringArray(R.string.pref_key__podprofile_aspects, aspects, _prefPod); + String[] strs = new String[aspects.length]; + for (int i = 0; i < strs.length; i++) { + strs[i] = aspects[i].toShareAbleText(); + } + setStringArray(R.string.pref_key__podprofile_aspects, strs, _prefPod); } public DiasporaAspect[] getAspects() { diff --git a/app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java similarity index 99% rename from app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java rename to app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java index 88aaad3e..3907cb47 100644 --- a/app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java +++ b/app/src/main/java/net/gsantner/opoc/format/markdown/SimpleMarkdownParser.java @@ -27,7 +27,7 @@ * FILTER_WEB is intended to be used at engines understanding most common HTML tags. */ -package net.gsantner.opoc.util; +package net.gsantner.opoc.format.markdown; import java.io.BufferedReader; import java.io.FileInputStream; diff --git a/app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java b/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java similarity index 81% rename from app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java rename to app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java index 4bda3ba1..a47a1a8d 100644 --- a/app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java +++ b/app/src/main/java/net/gsantner/opoc/preference/nonsupport/LanguagePreference.java @@ -11,16 +11,16 @@ */ /* - * A ListPreference that displays a list of available languages * Requires: - * The BuildConfig field "APPLICATION_LANGUAGES" which is a array of all available languages - * opoc/ContextUtils + The BuildConfig field "APPLICATION_LANGUAGES" which is a array of all available languages + opoc/ContextUtils * BuildConfig field can be defined by using the method below -buildConfigField("String[]", "APPLICATION_LANGUAGES", '{' + getUsedAndroidLanguages().collect {"\"${it}\""}.join(",") + '}') +buildConfigField "String[]", "APPLICATION_LANGUAGES", "${getUsedAndroidLanguages()}" @SuppressWarnings(["UnnecessaryQualifiedReference", "SpellCheckingInspection", "GroovyUnusedDeclaration"]) -static String[] getUsedAndroidLanguages() { +// Returns used android languages as a buildConfig array: {'de', 'it', ..}" +static String getUsedAndroidLanguages() { Set langs = new HashSet<>() new File('.').eachFileRecurse(groovy.io.FileType.DIRECTORIES) { final foldername = it.name @@ -32,25 +32,25 @@ static String[] getUsedAndroidLanguages() { } } } - return langs.toArray(new String[langs.size()]) + return '{' + langs.collect { "\"${it}\"" }.join(",") + '}' } * Summary: Change language of this app. Restart app for changes to take effect * Define element in Preferences-XML: - */ -package net.gsantner.opoc.ui; +package net.gsantner.opoc.preference.nonsupport; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; -import android.preference.ListPreference; import android.support.annotation.Nullable; +import android.preference.ListPreference; import android.text.TextUtils; import android.util.AttributeSet; @@ -69,7 +69,7 @@ public class LanguagePreference extends ListPreference { private static final String SYSTEM_LANGUAGE_CODE = ""; // The language of res/values/ -> (usually English) - public String _systemLanguageName = "★System★"; + public String _systemLanguageName = "System"; public String _defaultLanguageCode = "en"; public LanguagePreference(Context context) { @@ -95,7 +95,7 @@ public class LanguagePreference extends ListPreference { } @Override - protected boolean callChangeListener(Object newValue) { + public boolean callChangeListener(Object newValue) { if (newValue instanceof String) { // Does not apply to existing UI, use recreate() new ContextUtils(getContext()).setAppLanguage((String) newValue); @@ -118,7 +118,7 @@ public class LanguagePreference extends ListPreference { if (bcof instanceof String[]) { for (String langId : (String[]) bcof) { Locale locale = contextUtils.getLocaleByAndroidCode(langId); - languages.add(summarizeLocale(locale) + ";" + langId); + languages.add(summarizeLocale(locale, langId) + ";" + langId); } } @@ -133,9 +133,9 @@ public class LanguagePreference extends ListPreference { entryval[i + 2] = languages.get(i).split(";")[1]; } entryval[0] = SYSTEM_LANGUAGE_CODE; - entries[0] = _systemLanguageName + "\n[" + summarizeLocale(context.getResources().getConfiguration().locale) + "]"; + entries[0] = _systemLanguageName + " » " + summarizeLocale(context.getResources().getConfiguration().locale, ""); entryval[1] = _defaultLanguageCode; - entries[1] = summarizeLocale(contextUtils.getLocaleByAndroidCode(_defaultLanguageCode)); + entries[1] = summarizeLocale(contextUtils.getLocaleByAndroidCode(_defaultLanguageCode), _defaultLanguageCode); setEntries(entries); setEntryValues(entryval); @@ -143,13 +143,21 @@ public class LanguagePreference extends ListPreference { // Concat english and localized language name // Append country if country specific (e.g. Portuguese Brazil) - private String summarizeLocale(Locale locale) { + private String summarizeLocale(final Locale locale, final String localeAndroidCode) { String country = locale.getDisplayCountry(locale); String language = locale.getDisplayLanguage(locale); - return locale.getDisplayLanguage(Locale.ENGLISH) + String ret = locale.getDisplayLanguage(Locale.ENGLISH) + " (" + language.substring(0, 1).toUpperCase(Locale.getDefault()) + language.substring(1) + ((!country.isEmpty() && !country.toLowerCase(Locale.getDefault()).equals(language.toLowerCase(Locale.getDefault()))) ? (", " + country) : "") + ")"; + + if (localeAndroidCode.equals("zh-rCN")) { + ret = ret.substring(0, ret.indexOf(" ") + 1) + "Simplified" + ret.substring(ret.indexOf(" ")); + } else if (localeAndroidCode.equals("zh-rTW")) { + ret = ret.substring(0, ret.indexOf(" ") + 1) + "Traditional" + ret.substring(ret.indexOf(" ")); + } + + return ret; } // Add current language to summary @@ -158,7 +166,7 @@ public class LanguagePreference extends ListPreference { Locale locale = new ContextUtils(getContext()).getLocaleByAndroidCode(getValue()); String prefix = TextUtils.isEmpty(super.getSummary()) ? "" : super.getSummary() + "\n\n"; - return prefix + summarizeLocale(locale); + return prefix + summarizeLocale(locale, getValue()); } public String getSystemLanguageName() { @@ -178,4 +186,4 @@ public class LanguagePreference extends ListPreference { _defaultLanguageCode = defaultLanguageCode; loadLangs(getContext()); } -} +} \ No newline at end of file diff --git a/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java b/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java index 033e53e4..677700be 100644 --- a/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java +++ b/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java @@ -28,6 +28,7 @@ import android.util.TypedValue; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; +import android.webkit.WebView; @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection"}) @@ -93,16 +94,16 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils { } public void hideSoftKeyboard() { - InputMethodManager inputMethodManager = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE); - if (_activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) { - inputMethodManager.hideSoftInputFromWindow(_activity.getCurrentFocus().getWindowToken(), 0); + InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) { + imm.hideSoftInputFromWindow(_activity.getCurrentFocus().getWindowToken(), 0); } } public void showSoftKeyboard() { - InputMethodManager inputMethodManager = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE); - if (_activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) { - inputMethodManager.showSoftInput(_activity.getCurrentFocus(), InputMethodManager.SHOW_FORCED); + InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) { + imm.showSoftInput(_activity.getCurrentFocus(), InputMethodManager.SHOW_FORCED); } } @@ -126,6 +127,16 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils { dialog.show(); } + public void showDialogWithRawFileInWebView(String fileInRaw, @StringRes int resTitleId) { + WebView wv = new WebView(_context); + wv.loadUrl("file:///android_res/raw/" + fileInRaw); + AlertDialog.Builder dialog = new AlertDialog.Builder(_context) + .setPositiveButton(android.R.string.ok, null) + .setTitle(resTitleId) + .setView(wv); + dialog.show(); + } + // Toggle with no param, else set visibility according to first bool public void toggleStatusbarVisibility(boolean... optionalForceVisible) { WindowManager.LayoutParams attrs = _activity.getWindow().getAttributes(); @@ -140,7 +151,7 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils { _activity.getWindow().setAttributes(attrs); } - public void showRateOnGplayDialog() { + public void showGooglePlayEntryForThisApp() { String pkgId = "details?id=" + _activity.getPackageName(); Intent goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse("market://" + pkgId)); goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | diff --git a/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java b/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java index 22015408..a78dfdb8 100644 --- a/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java +++ b/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java @@ -16,29 +16,19 @@ * getters/setters for the app's settings. * Example: public boolean isAppFirstStart(boolean doSet) { - boolean value = getBool(prefApp, R.string.pref_key__app_first_start, true); + int value = getInt(R.string.pref_key__app_first_start, -1); if (doSet) { - setBool(prefApp, R.string.pref_key__app_first_start, false); + setBool(true); } return value; } public boolean isAppCurrentVersionFirstStart(boolean doSet) { - int value = getInt(prefApp, R.string.pref_key__app_first_start_current_version, -1); + int value = getInt(R.string.pref_key__app_first_start_current_version, -1); if (doSet) { - setInt(prefApp, R.string.pref_key__app_first_start_current_version, BuildConfig.VERSION_CODE); + setInt(R.string.pref_key__app_first_start_current_version, BuildConfig.VERSION_CODE); } - return value != BuildConfig.VERSION_CODE && !BuildConfig.IS_TEST_BUILD; - } - - * Maybe add a singleton for this: - * Whereas App.get() is returning ApplicationContext - private AppSettings(Context _context) { - super(_context); - } - - public static AppSettings get() { - return new AppSettings(App.get()); + return value != BuildConfig.VERSION_CODE; } */ @@ -63,7 +53,7 @@ import java.util.List; * Default SharedPreference (_prefApp) will be taken if no SP is specified, else the first one */ @SuppressWarnings({"WeakerAccess", "unused", "SpellCheckingInspection", "SameParameterValue"}) -public class AppSettingsBase { +public class AppSettingsBase implements PropertyBackend { protected static final String ARRAY_SEPARATOR = "%%%"; protected static final String ARRAY_SEPARATOR_SUBSTITUTE = "§§§"; public static final String SHARED_PREF_APP = "app"; @@ -190,36 +180,33 @@ public class AppSettingsBase { return gp(pref).getString(rstr(keyResourceId), rstr(keyResourceIdDefaultValue)); } - public void setStringArray(@StringRes int keyResourceId, Object[] values, final SharedPreferences... pref) { - setStringArray(rstr(keyResourceId), values, gp(pref)); - } - - public void setStringArray(String key, Object[] values, final SharedPreferences... pref) { - setStringArray(key, values, gp(pref)); - } - - private void setStringArray(String key, Object[] values, final SharedPreferences pref) { + private void setStringListOne(String key, List values, final SharedPreferences pref) { StringBuilder sb = new StringBuilder(); - for (Object value : values) { + for (String value : values) { sb.append(ARRAY_SEPARATOR); - sb.append(value.toString().replace(ARRAY_SEPARATOR, ARRAY_SEPARATOR_SUBSTITUTE)); + sb.append(value.replace(ARRAY_SEPARATOR, ARRAY_SEPARATOR_SUBSTITUTE)); } setString(key, sb.toString().replaceFirst(ARRAY_SEPARATOR, ""), pref); } - @NonNull - public String[] getStringArray(@StringRes int keyResourceId, final SharedPreferences... pref) { - return getStringArray(rstr(keyResourceId), gp(pref)); - } - - private String[] getStringArray(String key, final SharedPreferences... pref) { - String value = gp(pref) + private ArrayList getStringListOne(String key, final SharedPreferences pref) { + ArrayList ret = new ArrayList<>(); + String value = pref .getString(key, ARRAY_SEPARATOR) .replace(ARRAY_SEPARATOR_SUBSTITUTE, ARRAY_SEPARATOR); if (value.equals(ARRAY_SEPARATOR)) { - return new String[0]; + return ret; } - return value.split(ARRAY_SEPARATOR); + ret.addAll(Arrays.asList(value.split(ARRAY_SEPARATOR))); + return ret; + } + + public void setStringArray(@StringRes int keyResourceId, String[] values, final SharedPreferences... pref) { + setStringArray(rstr(keyResourceId), values, pref); + } + + public void setStringArray(String key, String[] values, final SharedPreferences... pref) { + setStringListOne(key, Arrays.asList(values), gp(pref)); } public void setStringList(@StringRes int keyResourceId, List values, final SharedPreferences... pref) { @@ -230,12 +217,23 @@ public class AppSettingsBase { setStringArray(key, values.toArray(new String[values.size()]), pref); } + @NonNull + public String[] getStringArray(@StringRes int keyResourceId, final SharedPreferences... pref) { + return getStringArray(rstr(keyResourceId), pref); + } + + @NonNull + public String[] getStringArray(String key, final SharedPreferences... pref) { + List list = getStringListOne(key, gp(pref)); + return list.toArray(new String[list.size()]); + } + public ArrayList getStringList(@StringRes int keyResourceId, final SharedPreferences... pref) { - return new ArrayList<>(Arrays.asList(getStringArray(rstr(keyResourceId), gp(pref)))); + return getStringListOne(rstr(keyResourceId), gp(pref)); } public ArrayList getStringList(String key, final SharedPreferences... pref) { - return new ArrayList<>(Arrays.asList(getStringArray(key, gp(pref)))); + return getStringListOne(key, gp(pref)); } //################################# @@ -266,56 +264,59 @@ public class AppSettingsBase { return Integer.valueOf(strNum); } - - public void setIntArray(@StringRes int keyResourceId, Object[] values, final SharedPreferences... pref) { - setIntArray(rstr(keyResourceId), values, gp(pref)); - } - - public void setIntArray(String key, Object[] values, final SharedPreferences... pref) { - setIntArray(key, values, gp(pref)); - } - - private void setIntArray(String key, Object[] values, final SharedPreferences pref) { + private void setIntListOne(String key, List values, final SharedPreferences pref) { StringBuilder sb = new StringBuilder(); - for (Object value : values) { + for (Integer value : values) { sb.append(ARRAY_SEPARATOR); sb.append(value.toString()); } setString(key, sb.toString().replaceFirst(ARRAY_SEPARATOR, ""), pref); } - @NonNull - public Integer[] getIntArray(@StringRes int keyResourceId, final SharedPreferences... pref) { - return getIntArray(rstr(keyResourceId), gp(pref)); - } - - private Integer[] getIntArray(String key, final SharedPreferences... pref) { - String value = gp(pref).getString(key, ARRAY_SEPARATOR); + private ArrayList getIntListOne(String key, final SharedPreferences pref) { + ArrayList ret = new ArrayList<>(); + String value = pref.getString(key, ARRAY_SEPARATOR); if (value.equals(ARRAY_SEPARATOR)) { - return new Integer[0]; + return ret; } - String[] split = value.split(ARRAY_SEPARATOR); - Integer[] ret = new Integer[split.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = Integer.parseInt(split[i]); + for (String s : value.split(ARRAY_SEPARATOR)) { + ret.add(Integer.parseInt(s)); } return ret; } + public void setIntArray(@StringRes int keyResourceId, Integer[] values, final SharedPreferences... pref) { + setIntArray(rstr(keyResourceId), values, gp(pref)); + } + + public void setIntArray(String key, Integer[] values, final SharedPreferences... pref) { + setIntListOne(key, Arrays.asList(values), gp(pref)); + } + + public Integer[] getIntArray(@StringRes int keyResourceId, final SharedPreferences... pref) { + return getIntArray(rstr(keyResourceId), gp(pref)); + } + + public Integer[] getIntArray(String key, final SharedPreferences... pref) { + List data = getIntListOne(key, gp(pref)); + return data.toArray(new Integer[data.size()]); + } + + public void setIntList(@StringRes int keyResourceId, List values, final SharedPreferences... pref) { - setIntArray(rstr(keyResourceId), values.toArray(new Integer[values.size()]), pref); + setIntListOne(rstr(keyResourceId), values, gp(pref)); } public void setIntList(String key, List values, final SharedPreferences... pref) { - setIntArray(key, values.toArray(new Integer[values.size()]), pref); + setIntListOne(key, values, gp(pref)); } public ArrayList getIntList(@StringRes int keyResourceId, final SharedPreferences... pref) { - return new ArrayList<>(Arrays.asList(getIntArray(rstr(keyResourceId), gp(pref)))); + return getIntListOne(rstr(keyResourceId), gp(pref)); } public ArrayList getIntList(String key, final SharedPreferences... pref) { - return new ArrayList<>(Arrays.asList(getIntArray(key, gp(pref)))); + return getIntListOne(key, gp(pref)); } @@ -405,4 +406,95 @@ public class AppSettingsBase { public int getColor(@StringRes int keyResourceId, @ColorRes int defaultColor, final SharedPreferences... pref) { return gp(pref).getInt(rstr(keyResourceId), rcolor(defaultColor)); } + + // + // PropertyBackend implementations + // + @Override + public String getString(String key, String defaultValue) { + return getString(key, defaultValue, _prefApp); + } + + @Override + public int getInt(String key, int defaultValue) { + return getInt(key, defaultValue, _prefApp); + } + + @Override + public long getLong(String key, long defaultValue) { + return getLong(key, defaultValue, _prefApp); + } + + @Override + public boolean getBool(String key, boolean defaultValue) { + return getBool(key, defaultValue, _prefApp); + } + + @Override + public float getFloat(String key, float defaultValue) { + return getFloat(key, defaultValue, _prefApp); + } + + @Override + public double getDouble(String key, double defaultValue) { + return getDouble(key, defaultValue, _prefApp); + } + + @Override + public ArrayList getIntList(String key) { + return getIntList(key, _prefApp); + } + + @Override + public ArrayList getStringList(String key) { + return getStringList(key, _prefApp); + } + + @Override + public AppSettingsBase setString(String key, String value) { + setString(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setInt(String key, int value) { + setInt(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setLong(String key, long value) { + setLong(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setBool(String key, boolean value) { + setBool(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setFloat(String key, float value) { + setFloat(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setDouble(String key, double value) { + setDouble(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setIntList(String key, List value) { + setIntListOne(key, value, _prefApp); + return this; + } + + @Override + public AppSettingsBase setStringList(String key, List value) { + setStringListOne(key, value, _prefApp); + return this; + } } diff --git a/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java b/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java index d5102d85..efbd8423 100644 --- a/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java +++ b/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java @@ -29,7 +29,6 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; -import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -47,7 +46,6 @@ import android.support.annotation.StringRes; import android.support.graphics.drawable.VectorDrawableCompat; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.app.AlertDialog; import android.support.v7.widget.AppCompatButton; import android.text.Html; import android.text.SpannableString; @@ -58,11 +56,12 @@ import android.util.DisplayMetrics; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.webkit.WebView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import net.gsantner.opoc.format.markdown.SimpleMarkdownParser; + import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; @@ -152,7 +151,11 @@ public class ContextUtils { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - _context.startActivity(intent); + try { + _context.startActivity(intent); + } catch (ActivityNotFoundException e) { + e.printStackTrace(); + } } /** @@ -232,16 +235,6 @@ public class ContextUtils { return sb.toString(); } - public void showDialogWithRawFileInWebView(String fileInRaw, @StringRes int resTitleId) { - WebView wv = new WebView(_context); - wv.loadUrl("file:///android_res/raw/" + fileInRaw); - AlertDialog.Builder dialog = new AlertDialog.Builder(_context) - .setPositiveButton(android.R.string.ok, null) - .setTitle(resTitleId) - .setView(wv); - dialog.show(); - } - @SuppressLint("RestrictedApi") @SuppressWarnings("RestrictedApi") public void setTintColorOfButton(AppCompatButton button, @ColorRes int resColor) { @@ -519,11 +512,7 @@ public class ContextUtils { public ContextUtils tintMenuItems(Menu menu, boolean recurse, @ColorInt int iconColor) { for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); - Drawable drawable = item.getIcon(); - if (drawable != null) { - drawable.mutate(); - drawable.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN); - } + tintDrawable(item.getIcon(), iconColor); if (item.hasSubMenu() && recurse) { tintMenuItems(item.getSubMenu(), recurse, iconColor); } @@ -531,6 +520,18 @@ public class ContextUtils { return this; } + public Drawable tintDrawable(@DrawableRes int drawableRes, @ColorInt int color) { + return tintDrawable(_context.getResources().getDrawable(drawableRes), color); + } + + public Drawable tintDrawable(@Nullable Drawable drawable, @ColorInt int color) { + if (drawable != null) { + drawable = DrawableCompat.wrap(drawable); + DrawableCompat.setTint(drawable.mutate(), color); + } + return drawable; + } + @SuppressLint("PrivateApi") public ContextUtils setSubMenuIconsVisiblity(Menu menu, boolean visible) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { diff --git a/app/src/main/java/net/gsantner/opoc/util/PropertyBackend.java b/app/src/main/java/net/gsantner/opoc/util/PropertyBackend.java new file mode 100644 index 00000000..b6758fbf --- /dev/null +++ b/app/src/main/java/net/gsantner/opoc/util/PropertyBackend.java @@ -0,0 +1,50 @@ +/* + * ------------------------------------------------------------------------------ + * Gregor Santner wrote this. You can do whatever you want + * with it. If we meet some day, and you think it is worth it, you can buy me a + * coke in return. Provided as is without any kind of warranty. Do not blame or + * sue me if something goes wrong. No attribution required. - Gregor Santner + * + * License: Creative Commons Zero (CC0 1.0) + * http://creativecommons.org/publicdomain/zero/1.0/ + * ---------------------------------------------------------------------------- + */ +package net.gsantner.opoc.util; + +import java.util.List; + +@SuppressWarnings({"UnusedReturnValue", "SpellCheckingInspection"}) +public interface PropertyBackend { + String getString(TKEY key, String defaultValue); + + int getInt(TKEY key, int defaultValue); + + long getLong(TKEY key, long defaultValue); + + boolean getBool(TKEY key, boolean defaultValue); + + float getFloat(TKEY key, float defaultValue); + + double getDouble(TKEY key, double defaultValue); + + List getIntList(TKEY key); + + List getStringList(TKEY key); + + TTHIS setString(TKEY key, String value); + + TTHIS setInt(TKEY key, int value); + + TTHIS setLong(TKEY key, long value); + + TTHIS setBool(TKEY key, boolean value); + + TTHIS setFloat(TKEY key, float value); + + TTHIS setDouble(TKEY key, double value); + + TTHIS setIntList(TKEY key, List value); + + TTHIS setStringList(TKEY key, List value); + +} diff --git a/app/src/main/res/xml/preferences__master.xml b/app/src/main/res/xml/preferences__master.xml index 9b3586f7..db8ba451 100644 --- a/app/src/main/res/xml/preferences__master.xml +++ b/app/src/main/res/xml/preferences__master.xml @@ -17,7 +17,7 @@ android:summary="@string/pref_desc__sub_nav_slider" android:title="@string/pref_title__sub_nav_slider"/> -