diff --git a/app/src/main/java/com/github/dfa/diaspora_android/App.java b/app/src/main/java/com/github/dfa/diaspora_android/App.java index e57c1a55..03271637 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/App.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/App.java @@ -34,7 +34,7 @@ import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import io.github.gsantner.opoc.util.AdBlock; +import net.gsantner.opoc.util.AdBlock; public class App extends Application { private volatile static App app; diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/AboutActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/AboutActivity.java index 9900d259..3509e087 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/AboutActivity.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/AboutActivity.java @@ -52,7 +52,7 @@ import com.github.dfa.diaspora_android.ui.theme.ThemedActivity; import com.github.dfa.diaspora_android.ui.theme.ThemedFragment; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; import java.util.Observable; import java.util.Observer; @@ -212,13 +212,13 @@ public class AboutActivity extends ThemedActivity public void buttonClicked(View view) { switch (view.getId()) { case R.id.fragment_about__contribute_button: - Helpers.get().openWebpageInExternalBrowser(getString(R.string.fragment_about__contribute_link)); + ContextUtils.get().openWebpageInExternalBrowser(getString(R.string.fragment_about__contribute_link)); break; case R.id.fragment_about__translate_button: - Helpers.get().openWebpageInExternalBrowser(getString(R.string.fragment_about__translate_link)); + ContextUtils.get().openWebpageInExternalBrowser(getString(R.string.fragment_about__translate_link)); break; case R.id.fragment_about__feedback_button: - Helpers.get().openWebpageInExternalBrowser(getString(R.string.fragment_About__feedback_link)); + ContextUtils.get().openWebpageInExternalBrowser(getString(R.string.fragment_About__feedback_link)); break; case R.id.fragment_about__spread_the_word_button: Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); @@ -263,14 +263,14 @@ public class AboutActivity extends ThemedActivity View rootView = inflater.inflate(R.layout.about__fragment_license, container, false); ButterKnife.bind(this, rootView); final Context context = rootView.getContext(); - accentColor = Helpers.get().colorToHexString(ThemeHelper.getAccentColor()); + accentColor = ContextUtils.get().colorToHexString(ThemeHelper.getAccentColor()); maintainers.setTextFormatted(getString(R.string.fragment_license__maintainers_text, - Helpers.get().loadMarkdownForTextViewFromRaw(R.raw.maintainers, ""))); + ContextUtils.get().loadMarkdownForTextViewFromRaw(R.raw.maintainers, ""))); contributors.setTextFormatted(getString(R.string.fragment_license__contributors_thank_you, - Helpers.get().loadMarkdownForTextViewFromRaw(R.raw.contributors, ""))); + ContextUtils.get().loadMarkdownForTextViewFromRaw(R.raw.contributors, ""))); thirdPartyLibs.setTextFormatted( - Helpers.get().loadMarkdownForTextViewFromRaw(R.raw.license_third_party, "")); + ContextUtils.get().loadMarkdownForTextViewFromRaw(R.raw.license_third_party, "")); return rootView; } @@ -278,10 +278,10 @@ public class AboutActivity extends ThemedActivity public void buttonClicked(View v) { switch (v.getId()) { case R.id.fragment_license__leafpic_button: - Helpers.get().openWebpageInExternalBrowser(getString(R.string.fragment_licesen__misc_leafpic_link)); + ContextUtils.get().openWebpageInExternalBrowser(getString(R.string.fragment_licesen__misc_leafpic_link)); break; case R.id.fragment_license__license_button: - Helpers.get().openWebpageInExternalBrowser(getString(R.string.fragment_license__license_gpl_link)); + ContextUtils.get().openWebpageInExternalBrowser(getString(R.string.fragment_license__license_gpl_link)); break; } } diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/AspectListFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/AspectListFragment.java index 4d4f502f..903d1089 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/AspectListFragment.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/AspectListFragment.java @@ -41,7 +41,7 @@ import com.github.dfa.diaspora_android.ui.theme.ThemedFragment; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; import java.util.ArrayList; import java.util.Arrays; @@ -174,7 +174,7 @@ public class AspectListFragment extends ThemedFragment implements OnSomethingCli final DiasporaAspect aspect = aspectList[position]; holder.title.setText(aspect.name); if (position % 2 == 1) { - holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Helpers.get().color(R.color.alternate_row_color)); + holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : ContextUtils.get().color(R.color.alternate_row_color)); holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK); } else { holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Color.WHITE); diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/DiasporaStreamFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/DiasporaStreamFragment.java index f01bb835..a6fb9212 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/DiasporaStreamFragment.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/DiasporaStreamFragment.java @@ -45,7 +45,7 @@ import com.github.dfa.diaspora_android.data.DiasporaUserProfile; import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; import com.github.dfa.diaspora_android.web.BrowserFragment; import com.github.dfa.diaspora_android.web.DiasporaStreamWebChromeClient; import com.github.dfa.diaspora_android.web.FileUploadWebChromeClient; @@ -271,7 +271,7 @@ public class DiasporaStreamFragment extends BrowserFragment { // Create the File where the photo should go File photoFile; try { - photoFile = Helpers.get().createImageFile(); + photoFile = ContextUtils.get().createImageFile(); takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); } catch (IOException ex) { AppLog.e(this, "ERROR creating temp file: " + ex.toString()); 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 733d2620..c0759387 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 @@ -78,7 +78,7 @@ import com.github.dfa.diaspora_android.ui.theme.ThemedAlertDialogBuilder; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import com.github.dfa.diaspora_android.util.HelpersA; +import com.github.dfa.diaspora_android.util.ActivityUtils; import com.github.dfa.diaspora_android.web.BrowserFragment; import com.github.dfa.diaspora_android.web.ContextMenuWebView; import com.github.dfa.diaspora_android.web.ProxyHandler; @@ -90,7 +90,7 @@ import java.io.IOException; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -import io.github.gsantner.opoc.util.SimpleMarkdownParser; +import net.gsantner.opoc.util.SimpleMarkdownParser; public class MainActivity extends ThemedActivity implements NavigationView.OnNavigationItemSelectedListener, @@ -230,12 +230,12 @@ public class MainActivity extends ThemedActivity + "

" + getString(R.string.fragment_license__thirdparty_libs) + "

" + mdParser.parse(getResources().openRawResource(R.raw.license_third_party), ""); html = mdParser.setHtml(html).removeMultiNewlines().getHtml(); - HelpersA.get(this).showDialogWithHtmlTextView(R.string.about_activity__title_about_license, html); + ActivityUtils.get(this).showDialogWithHtmlTextView(R.string.about_activity__title_about_license, html); appSettings.isAppCurrentVersionFirstStart(); } else if (appSettings.isAppCurrentVersionFirstStart()) { SimpleMarkdownParser smp = new SimpleMarkdownParser().parse( getResources().openRawResource(R.raw.changelog), ""); - HelpersA.get(this).showDialogWithHtmlTextView(R.string.changelog, smp.getHtml()); + ActivityUtils.get(this).showDialogWithHtmlTextView(R.string.changelog, smp.getHtml()); } } catch (IOException e) { e.printStackTrace(); diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java index c09cacde..010a798a 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/PodSelectionFragment.java @@ -55,8 +55,8 @@ import com.github.dfa.diaspora_android.ui.theme.ThemedFragment; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import com.github.dfa.diaspora_android.util.Helpers; -import com.github.dfa.diaspora_android.util.HelpersA; +import com.github.dfa.diaspora_android.util.ContextUtils; +import com.github.dfa.diaspora_android.util.ActivityUtils; import org.json.JSONException; import org.json.JSONObject; @@ -129,11 +129,11 @@ public class PodSelectionFragment extends ThemedFragment implements SearchView.O } }); LocalBroadcastManager.getInstance(getContext()).registerReceiver(podListReceiver, new IntentFilter(FetchPodsService.MESSAGE_PODS_RECEIVED)); - HelpersA.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod); + ActivityUtils.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod); } public void mergePodlistWithRessources(DiasporaPodList podlist) { - String sPodlist = Helpers.get().readTextfileFromRawRes(R.raw.podlist, "", ""); + String sPodlist = ContextUtils.get().readTextfileFromRawRes(R.raw.podlist, "", ""); try { JSONObject jPodlist = new JSONObject(sPodlist); podlist.mergeWithNewerEntries(new DiasporaPodList().fromJson(jPodlist)); @@ -182,7 +182,7 @@ public class PodSelectionFragment extends ThemedFragment implements SearchView.O buttonUseCustomPod.setTextColor(Color.WHITE); } else { buttonUseCustomPod.setSupportBackgroundTintList(ColorStateList.valueOf(appSettings.getAccentColor())); - buttonUseCustomPod.setTextColor(Helpers.get().shouldColorOnTopBeLight(appSettings.getAccentColor()) ? Color.WHITE : Color.BLACK); + buttonUseCustomPod.setTextColor(ContextUtils.get().shouldColorOnTopBeLight(appSettings.getAccentColor()) ? Color.WHITE : Color.BLACK); } } @@ -250,7 +250,7 @@ public class PodSelectionFragment extends ThemedFragment implements SearchView.O public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_reload: { - if (!HelpersA.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod)) { + if (!ActivityUtils.get(getActivity()).showInfoIfUserNotConnectedToInternet(listViewPod)) { Intent i = new Intent(getContext(), FetchPodsService.class); getContext().startService(i); return true; diff --git a/app/src/main/java/com/github/dfa/diaspora_android/activity/TagListFragment.java b/app/src/main/java/com/github/dfa/diaspora_android/activity/TagListFragment.java index 3d3ff052..346a0c44 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/activity/TagListFragment.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/activity/TagListFragment.java @@ -40,7 +40,7 @@ import com.github.dfa.diaspora_android.ui.theme.ThemedFragment; import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.DiasporaUrlHelper; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; import java.util.ArrayList; import java.util.Arrays; @@ -173,7 +173,7 @@ public class TagListFragment extends ThemedFragment implements OnSomethingClickL final String tag = followedTagsList[position]; holder.title.setText(tag); if (position % 2 == 1) { - holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Helpers.get().color(R.color.alternate_row_color)); + holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : ContextUtils.get().color(R.color.alternate_row_color)); holder.title.setTextColor(isAmoledColorMode ? Color.GRAY : Color.BLACK); } else { holder.root.setBackgroundColor(isAmoledColorMode ? Color.BLACK : Color.WHITE); diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java index d943deaf..5d3ddbee 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/BadgeDrawable.java @@ -32,7 +32,7 @@ import android.support.annotation.NonNull; import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.util.AppSettings; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; @SuppressWarnings("WeakerAccess") public class BadgeDrawable extends Drawable { @@ -56,7 +56,7 @@ public class BadgeDrawable extends Drawable { _badgeBackground.setStyle(Paint.Style.FILL); _badgeText = new Paint(); - _badgeText.setColor(Helpers.get().shouldColorOnTopBeLight(settings.getAccentColor()) ? Color.WHITE : Color.BLACK); + _badgeText.setColor(ContextUtils.get().shouldColorOnTopBeLight(settings.getAccentColor()) ? Color.WHITE : Color.BLACK); _badgeText.setTypeface(Typeface.DEFAULT); _badgeText.setTextSize(textSize); _badgeText.setAntiAlias(true); @@ -71,7 +71,7 @@ public class BadgeDrawable extends Drawable { Rect bounds = getBounds(); float width = bounds.right - bounds.left; float height = bounds.bottom - bounds.top; - float oneDp = Helpers.get().dp2px(1); + float oneDp = ContextUtils.get().dp2px(1); // Position the badge in the top-right quadrant of the icon. float radius = ((Math.max(width, height) / 2)) / 2; diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java index 407a1920..8c3402b6 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedActivity.java @@ -29,7 +29,7 @@ import android.support.v7.app.AppCompatActivity; import com.github.dfa.diaspora_android.App; import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.util.AppSettings; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; import java.util.Locale; @@ -99,7 +99,7 @@ public abstract class ThemedActivity extends AppCompatActivity { public void updateLanguage() { AppSettings appSettings = getAppSettings(); - Locale locale = Helpers.get().getLocaleByAndroidCode(appSettings.getLanguage()); + Locale locale = ContextUtils.get().getLocaleByAndroidCode(appSettings.getLanguage()); Configuration config = appSettings.getContext().getResources().getConfiguration(); config.locale = locale != null ? locale : Locale.getDefault(); appSettings.getContext().getResources().updateConfiguration(config, null); diff --git a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java index c0bba331..6b61210e 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/ui/theme/ThemedColorPickerPreference.java @@ -10,7 +10,7 @@ import android.widget.ImageView; import com.github.dfa.diaspora_android.R; import com.github.dfa.diaspora_android.util.AppSettings; -import com.github.dfa.diaspora_android.util.Helpers; +import com.github.dfa.diaspora_android.util.ContextUtils; /** * Preference that shows selected Color in a circle @@ -50,7 +50,7 @@ public class ThemedColorPickerPreference extends Preference implements Themeable AppSettings appSettings = AppSettings.get(); String key = getKey(); - int color = Helpers.get().color(R.color.primary); + int color = ContextUtils.get().color(R.color.primary); if ((appSettings.isKeyEqual(key, R.string.pref_key__primary_color_shade))) { color = appSettings.getPrimaryColor(); } else if ((appSettings.isKeyEqual(key, R.string.pref_key__accent_color_shade))) { diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/HelpersA.java b/app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java similarity index 86% rename from app/src/main/java/com/github/dfa/diaspora_android/util/HelpersA.java rename to app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java index 2afee084..0c16b21f 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/util/HelpersA.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/util/ActivityUtils.java @@ -16,21 +16,21 @@ import java.util.Date; import java.util.Locale; @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue"}) -public class HelpersA extends io.github.gsantner.opoc.util.HelpersA { - protected HelpersA(Activity activity) { +public class ActivityUtils extends net.gsantner.opoc.util.ActivityUtils { + protected ActivityUtils(Activity activity) { super(activity); } - public static HelpersA get(Activity activity) { - return new HelpersA(activity); + public static ActivityUtils get(Activity activity) { + return new ActivityUtils(activity); } public File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("dd-MM-yy_HH-mm", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; - AppLog.d(HelpersA.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); + AppLog.d(ActivityUtils.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); return new File( 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 4b3a4e43..c25a9420 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 @@ -31,7 +31,7 @@ import org.json.JSONObject; import java.util.List; -import io.github.gsantner.opoc.util.AppSettingsBase; +import net.gsantner.opoc.util.AppSettingsBase; /** * Settings diff --git a/app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java b/app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java similarity index 84% rename from app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java rename to app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java index 9f175f5f..d2132cc4 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/util/Helpers.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/util/ContextUtils.java @@ -14,21 +14,21 @@ import java.util.Date; import java.util.Locale; @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue"}) -public class Helpers extends io.github.gsantner.opoc.util.Helpers { - protected Helpers(Context context) { +public class ContextUtils extends net.gsantner.opoc.util.ContextUtils { + protected ContextUtils(Context context) { super(context); } - public static Helpers get() { - return new Helpers(App.get()); + public static ContextUtils get() { + return new ContextUtils(App.get()); } public File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("dd-MM-yy_HH-mm", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; - AppLog.d(Helpers.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); + AppLog.d(ContextUtils.class, Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()); File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); return new File( diff --git a/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java b/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java index 6358b836..c6af6f85 100644 --- a/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java +++ b/app/src/main/java/com/github/dfa/diaspora_android/web/CustomWebViewClient.java @@ -32,7 +32,7 @@ import com.github.dfa.diaspora_android.activity.MainActivity; import com.github.dfa.diaspora_android.data.DiasporaPodList; import com.github.dfa.diaspora_android.util.AppSettings; -import io.github.gsantner.opoc.util.AdBlock; +import net.gsantner.opoc.util.AdBlock; public class CustomWebViewClient extends WebViewClient { private final App app; diff --git a/app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java b/app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java new file mode 100644 index 00000000..1cd7689d --- /dev/null +++ b/app/src/main/java/net/gsantner/opoc/ui/LanguagePreference.java @@ -0,0 +1,149 @@ +/* + * ------------------------------------------------------------------------------ + * 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/ + * ---------------------------------------------------------------------------- + */ + +/* + * 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 + * BuildConfig field can be defined by using the method below + +buildConfigField("String[]", "APPLICATION_LANGUAGES", '{' + getUsedAndroidLanguages().collect {"\"${it}\""}.join(",") + '}') + +@SuppressWarnings(["UnnecessaryQualifiedReference", "SpellCheckingInspection"]) +static String[] getUsedAndroidLanguages() { + Set langs = new HashSet<>() + new File('.').eachFileRecurse(groovy.io.FileType.DIRECTORIES) { + final foldername = it.name + if (foldername.startsWith('values-') && !it.canonicalPath.contains("build" + File.separator + "intermediates")) { + new File(it.toString()).eachFileRecurse(groovy.io.FileType.FILES) { + if (it.name.toLowerCase().endsWith(".xml") && it.getCanonicalFile().getText('UTF-8').contains(" + + */ +package net.gsantner.opoc.ui; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.preference.ListPreference; +import android.util.AttributeSet; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import net.gsantner.opoc.util.ContextUtils; + +/** + * A {@link android.preference.ListPreference} that displays a list of languages to select from + */ +@SuppressWarnings({"unused", "SpellCheckingInspection"}) +public class LanguagePreference extends ListPreference { + public LanguagePreference(Context context) { + super(context); + init(context, null); + } + + public LanguagePreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public LanguagePreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public LanguagePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context, attrs); + } + + @Override + protected boolean callChangeListener(Object newValue) { + if (newValue instanceof String) { + // Does not apply to existing UI, use recreate() + new ContextUtils(getContext()).setAppLanguage((String) newValue); + } + return super.callChangeListener(newValue); + } + + private void init(Context context, AttributeSet attrs) { + // Fetch readable details + ContextUtils ContextUtils = new ContextUtils(context); + List languages = new ArrayList<>(); + Object bcof = ContextUtils.getBuildConfigValue("APPLICATION_LANGUAGES"); + if (bcof instanceof String[]) { + for (String langId : (String[]) bcof) { + Locale locale = ContextUtils.getLocaleByAndroidCode(langId); + languages.add(summarizeLocale(locale) + ";" + langId); + } + } + + // Sort languages naturally + Collections.sort(languages); + + // Show in UI + String[] entries = new String[languages.size() + 2]; + String[] entryval = new String[languages.size() + 2]; + for (int i = 0; i < languages.size(); i++) { + entries[i + 2] = languages.get(i).split(";")[0]; + entryval[i + 2] = languages.get(i).split(";")[1]; + } + entries[0] = "System"; + entryval[0] = ""; + entries[1] = "English"; + entryval[1] = "en"; + + setEntries(entries); + setEntryValues(entryval); + } + + // Concat english and localized language name + // Append country if country specific (e.g. Portuguese Brazil) + private String summarizeLocale(Locale locale) { + String country = locale.getDisplayCountry(locale); + String language = locale.getDisplayLanguage(locale); + return locale.getDisplayLanguage(Locale.ENGLISH) + + " (" + language.substring(0, 1).toUpperCase() + language.substring(1) + + ((!country.isEmpty() && !country.toLowerCase().equals(language.toLowerCase())) ? (", " + country) : "") + + ")"; + } + + // Add current language to summary + @Override + public CharSequence getSummary() { + Locale locale = new ContextUtils(getContext()).getLocaleByAndroidCode(getValue()); + return super.getSummary() + "\n\n" + summarizeLocale(locale); + } +} diff --git a/app/src/main/java/io/github/gsantner/opoc/util/HelpersA.java b/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java similarity index 84% rename from app/src/main/java/io/github/gsantner/opoc/util/HelpersA.java rename to app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java index 95ac1ca6..9d5850d7 100644 --- a/app/src/main/java/io/github/gsantner/opoc/util/HelpersA.java +++ b/app/src/main/java/net/gsantner/opoc/util/ActivityUtils.java @@ -9,7 +9,7 @@ * http://creativecommons.org/publicdomain/zero/1.0/ * ---------------------------------------------------------------------------- */ -package io.github.gsantner.opoc.util; +package net.gsantner.opoc.util; import android.app.Activity; import android.content.DialogInterface; @@ -22,17 +22,18 @@ import android.text.Html; import android.text.SpannableString; import android.text.method.LinkMovementMethod; import android.util.TypedValue; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection"}) -public class HelpersA extends Helpers { +public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils { //######################## //## Members, Constructors //######################## protected Activity _activity; - public HelpersA(final Activity activity) { + public ActivityUtils(final Activity activity) { super(activity); _activity = activity; } @@ -106,4 +107,18 @@ public class HelpersA extends Helpers { .setView(textView); dialog.show(); } + + // Toggle with no param, else set visibility according to first bool + public void toggleStatusbarVisibility(boolean... optionalForceVisible) { + WindowManager.LayoutParams attrs = _activity.getWindow().getAttributes(); + int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; + if (optionalForceVisible.length == 0) { + attrs.flags ^= flag; + } else if (optionalForceVisible.length == 1 && optionalForceVisible[0]) { + attrs.flags &= ~flag; + } else { + attrs.flags |= flag; + } + _activity.getWindow().setAttributes(attrs); + } } diff --git a/app/src/main/java/io/github/gsantner/opoc/util/AdBlock.java b/app/src/main/java/net/gsantner/opoc/util/AdBlock.java similarity index 87% rename from app/src/main/java/io/github/gsantner/opoc/util/AdBlock.java rename to app/src/main/java/net/gsantner/opoc/util/AdBlock.java index 7302f912..3859b4a9 100644 --- a/app/src/main/java/io/github/gsantner/opoc/util/AdBlock.java +++ b/app/src/main/java/net/gsantner/opoc/util/AdBlock.java @@ -24,7 +24,7 @@ public WebResourceResponse shouldInterceptRequest(WebView view, String url) { : super.shouldInterceptRequest(view, url); } */ -package io.github.gsantner.opoc.util; +package net.gsantner.opoc.util; import android.content.Context; import android.util.Log; @@ -47,7 +47,7 @@ import java.util.Set; /** * Simple Host-Based AdBlocker */ -@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection"}) +@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused"}) public class AdBlock { private static final AdBlock instance = new AdBlock(); @@ -60,9 +60,9 @@ public class AdBlock { //## Members //## //######################## - private final Set adblockHostsFromRaw = new HashSet<>(); - private final Set adblockHosts = new HashSet<>(); - private boolean isLoaded; + private final Set _adblockHostsFromRaw = new HashSet<>(); + private final Set _adblockHosts = new HashSet<>(); + private boolean _isLoaded; //######################## //## @@ -80,7 +80,7 @@ public class AdBlock { if (host.startsWith("www.") && host.length() >= 4) { host = host.substring(4); } - return adblockHosts.contains(host) || adblockHosts.contains("www." + host); + return _adblockHosts.contains(host) || _adblockHosts.contains("www." + host); } catch (URISyntaxException e) { e.printStackTrace(); } @@ -90,11 +90,15 @@ public class AdBlock { } public AdBlock reset() { - adblockHosts.clear(); - adblockHosts.addAll(adblockHostsFromRaw); + _adblockHosts.clear(); + _adblockHosts.addAll(_adblockHostsFromRaw); return this; } + public boolean isLoaded() { + return _isLoaded; + } + public static WebResourceResponse createEmptyResponse() { return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())); } @@ -107,7 +111,7 @@ public class AdBlock { host = host.substring(4); } if (!host.startsWith("#") && !host.startsWith("\"")) { - adblockHosts.add(host); + _adblockHosts.add(host); } } } @@ -120,7 +124,7 @@ public class AdBlock { public void run() { try { loadHostsFromRawAssets(context); - isLoaded = true; + _isLoaded = true; } catch (IOException e) { e.printStackTrace(); } @@ -132,7 +136,7 @@ public class AdBlock { BufferedReader br = null; String host; - adblockHosts.clear(); + _adblockHosts.clear(); for (int rawId : getAdblockIdsInRaw()) { try { br = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(rawId))); @@ -150,8 +154,8 @@ public class AdBlock { } } } - adblockHostsFromRaw.clear(); - adblockHostsFromRaw.addAll(adblockHosts); + _adblockHostsFromRaw.clear(); + _adblockHostsFromRaw.addAll(_adblockHosts); } private List getAdblockIdsInRaw() { diff --git a/app/src/main/java/io/github/gsantner/opoc/util/AppSettingsBase.java b/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java similarity index 99% rename from app/src/main/java/io/github/gsantner/opoc/util/AppSettingsBase.java rename to app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java index 8a3477e7..46c3b6ba 100644 --- a/app/src/main/java/io/github/gsantner/opoc/util/AppSettingsBase.java +++ b/app/src/main/java/net/gsantner/opoc/util/AppSettingsBase.java @@ -11,8 +11,6 @@ */ /* - * Get updates: - * https://github.com/gsantner/onePieceOfCode/blob/master/java/AppSettingsBase.java * This is a wrapper for settings based on SharedPreferences * with keys in resources. Extend from this class and add * getters/setters for the app's settings. @@ -44,7 +42,7 @@ } */ -package io.github.gsantner.opoc.util; +package net.gsantner.opoc.util; import android.annotation.SuppressLint; import android.content.Context; @@ -73,9 +71,9 @@ public class AppSettingsBase { //######################## //## Members, Constructors //######################## - protected final Context _context; protected final SharedPreferences _prefApp; protected final String _prefAppName; + protected final Context _context; public AppSettingsBase(final Context context) { this(context, SHARED_PREF_APP); diff --git a/app/src/main/java/io/github/gsantner/opoc/util/Helpers.java b/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java similarity index 70% rename from app/src/main/java/io/github/gsantner/opoc/util/Helpers.java rename to app/src/main/java/net/gsantner/opoc/util/ContextUtils.java index 043797e6..b03b5868 100644 --- a/app/src/main/java/io/github/gsantner/opoc/util/Helpers.java +++ b/app/src/main/java/net/gsantner/opoc/util/ContextUtils.java @@ -9,7 +9,7 @@ * http://creativecommons.org/publicdomain/zero/1.0/ * ---------------------------------------------------------------------------- */ -package io.github.gsantner.opoc.util; +package net.gsantner.opoc.util; import android.annotation.SuppressLint; import android.app.AlarmManager; @@ -22,16 +22,26 @@ import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.VectorDrawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; +import android.os.Build; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; +import android.support.annotation.Nullable; import android.support.annotation.RawRes; 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; @@ -40,22 +50,31 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.util.DisplayMetrics; +import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.webkit.WebView; +import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Locale; +import static android.graphics.Bitmap.CompressFormat; + @SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation"}) -public class Helpers { +public class ContextUtils { //######################## //## Members, Constructors //######################## protected Context _context; - public Helpers(Context context) { + public ContextUtils(Context context) { _context = context; } @@ -231,6 +250,14 @@ public class Helpers { return activeNetInfo != null && activeNetInfo.isConnectedOrConnecting(); } + public boolean isConnectedToInternet(@Nullable @StringRes Integer warnMessageStringRes) { + final boolean result = isConnectedToInternet(); + if (!result && warnMessageStringRes != null) + Toast.makeText(_context, _context.getString(warnMessageStringRes), Toast.LENGTH_SHORT).show(); + + return result; + } + public void restartApp(Class classToStartupWith) { Intent restartIntent = new Intent(_context, classToStartupWith); PendingIntent restartIntentP = PendingIntent.getActivity(_context, 555, @@ -317,4 +344,94 @@ public class Helpers { public float dp2px(final float dp) { return dp * _context.getResources().getDisplayMetrics().density; } + + public void setViewVisible(View view, boolean visible) { + view.setVisibility(visible ? View.VISIBLE : View.GONE); + } + + public static void setDrawableWithColorToImageView(ImageView imageView, @DrawableRes int drawableResId, @ColorRes int colorResId) { + imageView.setImageResource(drawableResId); + imageView.setColorFilter(ContextCompat.getColor(imageView.getContext(), colorResId)); + } + + public Bitmap drawableToBitmap(Drawable drawable) { + Bitmap bitmap = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && (drawable instanceof VectorDrawable || drawable instanceof VectorDrawableCompat)) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + drawable = (DrawableCompat.wrap(drawable)).mutate(); + } + + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } else if (drawable instanceof BitmapDrawable) { + bitmap = ((BitmapDrawable) drawable).getBitmap(); + } + return bitmap; + } + + public Bitmap loadImageFromFilesystem(String imagePath, int maxDimen) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(imagePath, options); + options.inSampleSize = calculateInSampleSize(options, maxDimen); + options.inJustDecodeBounds = false; + return BitmapFactory.decodeFile(imagePath, options); + } + + /** + * Calculates the scaling factor so the bitmap is maximal as big as the maxDimen + * + * @param options Bitmap-options that contain the current dimensions of the bitmap + * @param maxDimen Max size of the Bitmap (width or height) + * @return the scaling factor that needs to be applied to the bitmap + */ + public int calculateInSampleSize(BitmapFactory.Options options, int maxDimen) { + // Raw height and width of image + int height = options.outHeight; + int width = options.outWidth; + int inSampleSize = 1; + + if (Math.max(height, width) > maxDimen) { + inSampleSize = Math.round(1f * Math.max(height, width) / maxDimen); + } + return inSampleSize; + } + + public Bitmap scaleBitmap(Bitmap bitmap, int maxDimen) { + int picSize = Math.min(bitmap.getHeight(), bitmap.getWidth()); + float scale = 1.f * maxDimen / picSize; + Matrix matrix = new Matrix(); + matrix.postScale(scale, scale); + return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } + + public File writeImageToFileJpeg(String path, String filename, Bitmap image) { + return writeImageToFile(path, filename, image, Bitmap.CompressFormat.JPEG, 95); + } + + public File writeImageToFile(String path, String filename, Bitmap image, CompressFormat format, int quality) { + File imageFile = new File(path); + if (imageFile.exists() || imageFile.mkdirs()) { + imageFile = new File(path, filename); + + FileOutputStream stream = null; + try { + stream = new FileOutputStream(imageFile); // overwrites this image every time + image.compress(format, quality, stream); + return imageFile; + } catch (FileNotFoundException ignored) { + } finally { + try { + if (stream != null) { + stream.close(); + } + } catch (IOException ignored) { + } + } + } + return null; + } } diff --git a/app/src/main/java/io/github/gsantner/opoc/util/SimpleMarkdownParser.java b/app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java similarity index 96% rename from app/src/main/java/io/github/gsantner/opoc/util/SimpleMarkdownParser.java rename to app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java index 0895f98d..72a220bb 100644 --- a/app/src/main/java/io/github/gsantner/opoc/util/SimpleMarkdownParser.java +++ b/app/src/main/java/net/gsantner/opoc/util/SimpleMarkdownParser.java @@ -14,7 +14,7 @@ * Get updates: * https://github.com/gsantner/onePieceOfCode/blob/master/java/SimpleMarkdownParser.java * Apply to TextView: - * See https://github.com/gsantner/onePieceOfCode/blob/master/android/Helpers.get().java + * See https://github.com/gsantner/onePieceOfCode/blob/master/android/ContextUtils.java * Parses most common markdown tags. Only inline tags are supported, multiline/block syntax * is not supported (citation, multiline code, ..). This is intended to stay as easy as possible. * @@ -27,7 +27,7 @@ * FILTER_WEB is intended to be used at engines understanding most common HTML tags. */ -package io.github.gsantner.opoc.util; +package net.gsantner.opoc.util; import java.io.BufferedReader; import java.io.FileInputStream; @@ -130,13 +130,13 @@ public class SimpleMarkdownParser { //######################## //## Singleton //######################## - private static SimpleMarkdownParser instance; + private static SimpleMarkdownParser __instance; public static SimpleMarkdownParser get() { - if (instance == null) { - instance = new SimpleMarkdownParser(); + if (__instance == null) { + __instance = new SimpleMarkdownParser(); } - return instance; + return __instance; } //######################## @@ -152,8 +152,8 @@ public class SimpleMarkdownParser { //######################## //## Methods //######################## - public SimpleMarkdownParser setDefaultSmpFilter(SmpFilter _defaultSmpFilter) { - this._defaultSmpFilter = _defaultSmpFilter; + public SimpleMarkdownParser setDefaultSmpFilter(SmpFilter defaultSmpFilter) { + _defaultSmpFilter = defaultSmpFilter; return this; }