From f7372e5b17ca6f21b5a30ca9c1f858a154c8e6a0 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:39:10 -0400 Subject: [PATCH 01/20] Moving RecyclerView extension function. --- .../java/be/scri/extensions/RecyclerView.kt | 17 +++++++++++++++++ .../java/be/scri/fragments/AboutFragment.kt | 17 +++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/be/scri/extensions/RecyclerView.kt diff --git a/app/src/main/java/be/scri/extensions/RecyclerView.kt b/app/src/main/java/be/scri/extensions/RecyclerView.kt new file mode 100644 index 00000000..7b1f8387 --- /dev/null +++ b/app/src/main/java/be/scri/extensions/RecyclerView.kt @@ -0,0 +1,17 @@ +package be.scri.extensions + +import CustomDividerItemDecoration +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.recyclerview.widget.RecyclerView +import be.scri.R + +fun RecyclerView.addCustomItemDecoration(context: android.content.Context) { + val itemDecoration = + CustomDividerItemDecoration( + drawable = getDrawable(context, R.drawable.rv_divider)!!, + width = 1, + marginLeft = 50, + marginRight = 50, + ) + addItemDecoration(itemDecoration) +} diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index cd785dcd..7abbfd0b 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -60,35 +60,24 @@ class AboutFragment : Fragment() { recyclerView1.adapter = CustomAdapter(getFirstRecyclerViewData(), requireContext()) recyclerView1.suppressLayout(true) recyclerView1.apply { - addCustomItemDecoration() + addCustomItemDecoration(requireContext()) } val recyclerView2 = binding.recycleView recyclerView2.layoutManager = LinearLayoutManager(context) recyclerView2.adapter = CustomAdapter(getSecondRecyclerViewData(), requireContext()) recyclerView2.suppressLayout(true) recyclerView2.apply { - addCustomItemDecoration() + addCustomItemDecoration(requireContext()) } val recyclerView3 = binding.recycleView3 recyclerView3.layoutManager = LinearLayoutManager(context) recyclerView3.adapter = CustomAdapter(getThirdRecyclerViewData(), requireContext()) recyclerView3.suppressLayout(true) recyclerView3.apply { - addCustomItemDecoration() + addCustomItemDecoration(requireContext()) } } - private fun RecyclerView.addCustomItemDecoration() { - val itemDecoration = - CustomDividerItemDecoration( - drawable = getDrawable(requireContext(), R.drawable.rv_divider)!!, - width = 1, - marginLeft = 50, - marginRight = 50, - ) - addItemDecoration(itemDecoration) - } - private fun getFirstRecyclerViewData(): List = listOf( ItemsViewModel( From 6b3ff9026bd3543277b3d602ee4850f15267a413 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:40:44 -0400 Subject: [PATCH 02/20] Commonizing load fragment functions. --- .../java/be/scri/fragments/AboutFragment.kt | 41 +++++-------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index 7abbfd0b..da770067 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -118,7 +118,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.right_arrow, url = null, activity = null, - action = ::loadWikimediaScribeFragment, + action = ({ loadOtherFragment(WikimediaScribeFragment(), "WikimediaScribePage") }), ), ) @@ -174,7 +174,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.right_arrow, url = null, activity = null, - action = ::loadPrivacyPolicyFragment, + action = ({ loadOtherFragment(PrivacyPolicyFragment(), null) }), ), ItemsViewModel( image = R.drawable.license_icon, @@ -182,7 +182,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.right_arrow, url = null, activity = null, - action = ::loadThirdPartyLicensesFragment, + action = ({ loadOtherFragment(ThirdPartyFragment(), null) }), ), ) @@ -222,36 +222,15 @@ class AboutFragment : Fragment() { } } - private fun loadWikimediaScribeFragment() { + private fun loadOtherFragment(fragment: Fragment, pageName: String?) { try { - val fragment = WikimediaScribeFragment() val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.fragment_container, fragment, "WikimediaScribePage") - fragmentTransaction.addToBackStack("WikimediaScribePage") - fragmentTransaction.commit() - } catch (e: IllegalStateException) { - Log.e("AboutFragment", "Failed to load fragment", e) - } - } - - private fun loadPrivacyPolicyFragment() { - try { - val fragment = PrivacyPolicyFragment() - val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.fragment_container, fragment) - fragmentTransaction.addToBackStack(null) - fragmentTransaction.commit() - } catch (e: IllegalStateException) { - Log.e("AboutFragment", "Failed to load fragment", e) - } - } - - private fun loadThirdPartyLicensesFragment() { - try { - val fragment = ThirdPartyFragment() - val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.fragment_container, fragment) - fragmentTransaction.addToBackStack(null) + if (pageName != null) { + fragmentTransaction.replace(R.id.fragment_container, fragment, pageName) + } else { + fragmentTransaction.replace(R.id.fragment_container, fragment) + } + fragmentTransaction.addToBackStack(pageName) fragmentTransaction.commit() } catch (e: IllegalStateException) { Log.e("AboutFragment", "Failed to load fragment", e) From 7806c94c9162e29c4d95e76989d4bec75f1f1f70 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:43:32 -0400 Subject: [PATCH 03/20] Moving send email and share scribe to separate ShareHelper class. --- .../java/be/scri/fragments/AboutFragment.kt | 37 ++-------------- .../main/java/be/scri/helpers/ShareHelper.kt | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/be/scri/helpers/ShareHelper.kt diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index da770067..c55d1ef0 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -21,8 +21,10 @@ import be.scri.BuildConfig import be.scri.R import be.scri.activities.MainActivity import be.scri.databinding.FragmentAboutBinding +import be.scri.extensions.addCustomItemDecoration import be.scri.helpers.CustomAdapter import be.scri.helpers.HintUtils +import be.scri.helpers.ShareHelper import be.scri.models.ItemsViewModel import com.google.android.play.core.review.ReviewManagerFactory @@ -110,7 +112,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.external_link, url = null, activity = null, - action = ::shareScribe, + action = ({ ShareHelper.shareScribe(requireContext()) }), ), ItemsViewModel( image = R.drawable.wikimedia_logo_black, @@ -146,7 +148,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.external_link, url = null, activity = null, - action = ::sendEmail, + action = ({ ShareHelper.sendEmail(requireContext()) }), ), ItemsViewModel( image = R.drawable.bookmark_icon, @@ -191,37 +193,6 @@ class AboutFragment : Fragment() { (activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint) } - private fun shareScribe() { - try { - val sharingIntent = - Intent(Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra(Intent.EXTRA_TEXT, "https://github.com/scribe-org/Scribe-Android") - } - startActivity(Intent.createChooser(sharingIntent, "Share via")) - } catch (e: ActivityNotFoundException) { - Log.e("AboutFragment", "No application found to share content", e) - } catch (e: IllegalArgumentException) { - Log.e("AboutFragment", "Invalid argument for sharing", e) - } - } - - private fun sendEmail() { - try { - val intent = - Intent(Intent.ACTION_SEND).apply { - putExtra(Intent.EXTRA_EMAIL, arrayOf("team@scri.be")) - putExtra(Intent.EXTRA_SUBJECT, "Hey Scribe!") - type = "message/rfc822" - } - startActivity(Intent.createChooser(intent, "Choose an Email client:")) - } catch (e: ActivityNotFoundException) { - Log.e("AboutFragment", "No email client found", e) - } catch (e: IllegalArgumentException) { - Log.e("AboutFragment", "Invalid argument for sending email", e) - } - } - private fun loadOtherFragment(fragment: Fragment, pageName: String?) { try { val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() diff --git a/app/src/main/java/be/scri/helpers/ShareHelper.kt b/app/src/main/java/be/scri/helpers/ShareHelper.kt new file mode 100644 index 00000000..1ce0219a --- /dev/null +++ b/app/src/main/java/be/scri/helpers/ShareHelper.kt @@ -0,0 +1,42 @@ +package be.scri.helpers + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.util.Log +import androidx.core.content.ContextCompat.startActivity + +class ShareHelper { + companion object { + fun shareScribe(context: Context) { + try { + val sharingIntent = + Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, "https://github.com/scribe-org/Scribe-Android") + } + startActivity(context, Intent.createChooser(sharingIntent, "Share via"), null) + } catch (e: ActivityNotFoundException) { + Log.e("AboutFragment", "No application found to share content", e) + } catch (e: IllegalArgumentException) { + Log.e("AboutFragment", "Invalid argument for sharing", e) + } + } + + fun sendEmail(context: Context) { + try { + val intent = + Intent(Intent.ACTION_SEND).apply { + putExtra(Intent.EXTRA_EMAIL, arrayOf("team@scri.be")) + putExtra(Intent.EXTRA_SUBJECT, "Hey Scribe!") + type = "message/rfc822" + } + startActivity(context, Intent.createChooser(intent, "Choose an Email client:"), null) + } catch (e: ActivityNotFoundException) { + Log.e("AboutFragment", "No email client found", e) + } catch (e: IllegalArgumentException) { + Log.e("AboutFragment", "Invalid argument for sending email", e) + } + } + } +} From 809e2dd20d577f855159bbf4fbbae84dcb81aa0c Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:44:39 -0400 Subject: [PATCH 04/20] Moving rate function to separate RatingHelper class. --- .../java/be/scri/fragments/AboutFragment.kt | 52 +----------------- .../main/java/be/scri/helpers/RatingHelper.kt | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/be/scri/helpers/RatingHelper.kt diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index c55d1ef0..861b6dbf 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -1,22 +1,15 @@ package be.scri.fragments -import CustomDividerItemDecoration import android.content.ActivityNotFoundException -import android.content.Context import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.activity.addCallback -import androidx.appcompat.content.res.AppCompatResources.getDrawable import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import be.scri.BuildConfig import be.scri.R import be.scri.activities.MainActivity @@ -25,8 +18,8 @@ import be.scri.extensions.addCustomItemDecoration import be.scri.helpers.CustomAdapter import be.scri.helpers.HintUtils import be.scri.helpers.ShareHelper +import be.scri.helpers.RatingHelper import be.scri.models.ItemsViewModel -import com.google.android.play.core.review.ReviewManagerFactory class AboutFragment : Fragment() { private lateinit var binding: FragmentAboutBinding @@ -132,7 +125,7 @@ class AboutFragment : Fragment() { image2 = R.drawable.external_link, url = null, activity = null, - action = ::rateScribe, + action = ({ RatingHelper.rateScribe(requireContext(), activity as MainActivity) }), ), ItemsViewModel( image = R.drawable.bug_report_icon, @@ -208,47 +201,6 @@ class AboutFragment : Fragment() { } } - private fun getInstallSource(context: Context): String? = - try { - val packageManager = context.packageManager - packageManager.getInstallerPackageName(context.packageName) - } catch (e: PackageManager.NameNotFoundException) { - null - } - - private fun rateScribe() { - val context = requireContext() - var installSource = getInstallSource(context) - - if (installSource == "com.android.vending") { - val reviewManager = ReviewManagerFactory.create(context) - val request = reviewManager.requestReviewFlow() - - request.addOnCompleteListener { task -> - if (task.isSuccessful) { - val reviewInfo = task.result - val activity = requireActivity() - reviewManager - .launchReviewFlow(activity, reviewInfo) - .addOnCompleteListener { _ -> - } - } else { - Toast.makeText(context, "Failed to launch review flow", Toast.LENGTH_SHORT).show() - } - } - } else if (installSource == "org.fdroid.fdroid") { - val url = "https://f-droid.org/packages/${context.packageName}" - val intent = - Intent(Intent.ACTION_VIEW) - .apply { - data = Uri.parse(url) - } - context.startActivity(intent) - } else { - Toast.makeText(context, "Unknown installation source", Toast.LENGTH_SHORT).show() - } - } - override fun onResume() { super.onResume() (activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint) diff --git a/app/src/main/java/be/scri/helpers/RatingHelper.kt b/app/src/main/java/be/scri/helpers/RatingHelper.kt new file mode 100644 index 00000000..67954021 --- /dev/null +++ b/app/src/main/java/be/scri/helpers/RatingHelper.kt @@ -0,0 +1,53 @@ +package be.scri.helpers + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.widget.Toast +import be.scri.activities.MainActivity +import com.google.android.play.core.review.ReviewManagerFactory + +class RatingHelper { + + companion object { + private fun getInstallSource(context: Context): String? = + try { + val packageManager = context.packageManager + packageManager.getInstallerPackageName(context.packageName) + } catch (e: PackageManager.NameNotFoundException) { + null + } + + fun rateScribe(context: Context, activity: MainActivity) { + val installSource = getInstallSource(context) + + if (installSource == "com.android.vending") { + val reviewManager = ReviewManagerFactory.create(context) + val request = reviewManager.requestReviewFlow() + + request.addOnCompleteListener { task -> + if (task.isSuccessful) { + val reviewInfo = task.result + reviewManager + .launchReviewFlow(activity, reviewInfo) + .addOnCompleteListener { _ -> + } + } else { + Toast.makeText(context, "Failed to launch review flow", Toast.LENGTH_SHORT).show() + } + } + } else if (installSource == "org.fdroid.fdroid") { + val url = "https://f-droid.org/packages/${context.packageName}" + val intent = + Intent(Intent.ACTION_VIEW) + .apply { + data = Uri.parse(url) + } + context.startActivity(intent) + } else { + Toast.makeText(context, "Unknown installation source", Toast.LENGTH_SHORT).show() + } + } + } +} From 5acd0cf5e60600a578f2885b5a089acc33ae4b40 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:45:26 -0400 Subject: [PATCH 05/20] Updating ItemsViewModel to handle AboutFragment changes. --- app/src/main/java/be/scri/fragments/AboutFragment.kt | 2 -- app/src/main/java/be/scri/models/ItemsViewModel.kt | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index 861b6dbf..079ef282 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -1,7 +1,5 @@ package be.scri.fragments -import android.content.ActivityNotFoundException -import android.content.Intent import android.os.Bundle import android.util.Log import android.view.LayoutInflater diff --git a/app/src/main/java/be/scri/models/ItemsViewModel.kt b/app/src/main/java/be/scri/models/ItemsViewModel.kt index 3a0a873a..d17eaa6d 100644 --- a/app/src/main/java/be/scri/models/ItemsViewModel.kt +++ b/app/src/main/java/be/scri/models/ItemsViewModel.kt @@ -2,7 +2,6 @@ package be.scri.models import android.app.Activity import androidx.annotation.StringRes -import kotlin.reflect.KFunction0 data class ItemsViewModel( val image: Int, @@ -10,7 +9,7 @@ data class ItemsViewModel( val image2: Int, val url: String? = null, val activity: Class? = null, - val action: KFunction0? = null, + val action: (() -> Unit)? = null, ) : Item() { class Text( @StringRes From f644fb03ab08d8b7c667cb1735ed6d2922038a24 Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:47:05 -0400 Subject: [PATCH 06/20] Extracting preferences setting to PreferencesHelper class. --- .../fragments/LanguageSettingsFragment.kt | 119 +++++++----------- .../java/be/scri/helpers/PreferencesHelper.kt | 44 +++++++ 2 files changed, 89 insertions(+), 74 deletions(-) create mode 100644 app/src/main/java/be/scri/helpers/PreferencesHelper.kt diff --git a/app/src/main/java/be/scri/fragments/LanguageSettingsFragment.kt b/app/src/main/java/be/scri/fragments/LanguageSettingsFragment.kt index 7236cfb3..886757ce 100644 --- a/app/src/main/java/be/scri/fragments/LanguageSettingsFragment.kt +++ b/app/src/main/java/be/scri/fragments/LanguageSettingsFragment.kt @@ -2,12 +2,10 @@ package be.scri.fragments import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button -import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback import androidx.fragment.app.Fragment @@ -17,6 +15,7 @@ import be.scri.R import be.scri.activities.MainActivity import be.scri.databinding.FragmentLanguageSettingsBinding import be.scri.helpers.CustomAdapter +import be.scri.helpers.PreferencesHelper import be.scri.models.SwitchItem @Suppress("LongMethod") @@ -119,8 +118,12 @@ class LanguageSettingsFragment : Fragment() { isChecked = sharedPref.getBoolean("period_on_double_tap_$language", false), title = getString(R.string.app_settings_keyboard_functionality_double_space_period), description = getString(R.string.app_settings_keyboard_functionality_double_space_period_description), - action = { enablePeriodOnSpaceBarDoubleTap(language) }, - action2 = { disablePeriodOnSpaceBarDoubleTap(language) }, + action = { + PreferencesHelper.setPeriodOnSpaceBarDoubleTapPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setPeriodOnSpaceBarDoubleTapPreference(requireContext(), language, false) + }, ), ) list.add( @@ -128,8 +131,12 @@ class LanguageSettingsFragment : Fragment() { isChecked = sharedPref.getBoolean("autosuggest_emojis_$language", true), title = getString(R.string.app_settings_keyboard_functionality_auto_suggest_emoji), description = getString(R.string.app_settings_keyboard_functionality_auto_suggest_emoji_description), - action = { enableEmojiAutosuggestions(language) }, - action2 = { disableEmojiAutosuggestions(language) }, + action = { + PreferencesHelper.setEmojiAutoSuggestionsPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setEmojiAutoSuggestionsPreference(requireContext(), language, false) + }, ), ) return list @@ -155,8 +162,12 @@ class LanguageSettingsFragment : Fragment() { getString( R.string.app_settings_keyboard_layout_disable_accent_characters_description, ), - action = { disableAccentCharacter(language) }, - action2 = { enableAccentCharacters(language) }, + action = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, false) + }, ), ) } @@ -176,8 +187,12 @@ class LanguageSettingsFragment : Fragment() { getString( R.string.app_settings_keyboard_layout_disable_accent_characters_description, ), - action = { disableAccentCharacter(language) }, - action2 = { enableAccentCharacters(language) }, + action = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, false) + }, ), ) } @@ -197,8 +212,12 @@ class LanguageSettingsFragment : Fragment() { getString( R.string.app_settings_keyboard_layout_disable_accent_characters_description, ), - action = { disableAccentCharacter(language) }, - action2 = { enableAccentCharacters(language) }, + action = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setAccentCharacterPreference(requireContext(), language, false) + }, ), ) } @@ -208,8 +227,12 @@ class LanguageSettingsFragment : Fragment() { isChecked = sharedPref.getBoolean("period_on_double_tap_$language", false), title = getString(R.string.app_settings_keyboard_functionality_double_space_period), description = getString(R.string.app_settings_keyboard_functionality_double_space_period_description), - action = { enablePeriodOnSpaceBarDoubleTap(language) }, - action2 = { disablePeriodOnSpaceBarDoubleTap(language) }, + action = { + PreferencesHelper.setPeriodOnSpaceBarDoubleTapPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setPeriodOnSpaceBarDoubleTapPreference(requireContext(), language, false) + }, ), ) list.add( @@ -217,8 +240,12 @@ class LanguageSettingsFragment : Fragment() { isChecked = sharedPref.getBoolean("emoji_suggestions_$language", true), title = getString(R.string.app_settings_keyboard_functionality_auto_suggest_emoji), description = getString(R.string.app_settings_keyboard_functionality_auto_suggest_emoji_description), - action = { enableEmojiAutosuggestions(language) }, - action2 = { disableEmojiAutosuggestions(language) }, + action = { + PreferencesHelper.setEmojiAutoSuggestionsPreference(requireContext(), language, true) + }, + action2 = { + PreferencesHelper.setEmojiAutoSuggestionsPreference(requireContext(), language, false) + }, ), ) list.add( @@ -226,69 +253,13 @@ class LanguageSettingsFragment : Fragment() { isChecked = sharedPref.getBoolean("period_and_comma_$language", false), title = getString(R.string.app_settings_keyboard_layout_period_and_comma), description = getString(R.string.app_settings_keyboard_layout_period_and_comma_description), - action = { enableCommaAndPeriod() }, - action2 = { disableCommaAndPeriod() }, + action = { PreferencesHelper.setCommaAndPeriodPreference() }, + action2 = { PreferencesHelper.setCommaAndPeriodPreference() }, ), ) return list } - private fun enableAccentCharacters(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("disable_accent_character_$language", false) - editor.apply() - Toast.makeText(requireContext(), "$language Accent Character Enabled", Toast.LENGTH_SHORT).show() - } - - private fun disableAccentCharacter(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("disable_accent_character_$language", true) - editor.apply() - Toast.makeText(requireContext(), "$language Accent Characters Disabled", Toast.LENGTH_SHORT).show() - } - - private fun enablePeriodOnSpaceBarDoubleTap(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("period_on_double_tap_$language", true) - editor.apply() - Toast.makeText(requireContext(), "$language Period on Double Tap of Space Bar on ", Toast.LENGTH_SHORT).show() - } - - private fun disablePeriodOnSpaceBarDoubleTap(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("period_on_double_tap_$language", false) - editor.apply() - Toast.makeText(requireContext(), "$language Period on Double Tap of Space Bar on ", Toast.LENGTH_SHORT).show() - } - - private fun enableEmojiAutosuggestions(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("emoji_suggestions_$language", true) - editor.apply() - Toast.makeText(requireContext(), "$language Emoji Autosuggestions on", Toast.LENGTH_SHORT).show() - } - - private fun disableEmojiAutosuggestions(language: String) { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("emoji_suggestions_$language", false) - editor.apply() - Toast.makeText(requireContext(), "$language Emoji Autosuggestions off", Toast.LENGTH_SHORT).show() - } - - private fun enableCommaAndPeriod() { - Log.d("LanguageSettingsFragment", "This enableCommaAndPeriod-function is to be implemented later") - } - - private fun disableCommaAndPeriod() { - Log.d("LanguageSettingsFragment", "This disableCommaAndPeriod-function is to be implemented later") - } - override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt new file mode 100644 index 00000000..d085e0f8 --- /dev/null +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -0,0 +1,44 @@ +package be.scri.helpers + +import android.content.Context +import android.util.Log +import android.widget.Toast +import be.scri.extensions.config + +class PreferencesHelper { + companion object { + + fun setPeriodOnSpaceBarDoubleTapPreference(context: Context, language: String, + shouldEnablePeriodOnSpaceBarDoubleTap: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("period_on_double_tap_$language", shouldEnablePeriodOnSpaceBarDoubleTap) + editor.apply() + Toast.makeText(context, "$language Period on Double Tap of Space Bar " + + if (shouldEnablePeriodOnSpaceBarDoubleTap) "on" else "off", + Toast.LENGTH_SHORT).show() + } + + fun setAccentCharacterPreference(context: Context, language: String, shouldDisableAccentCharacter: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("disable_accent_character_$language", shouldDisableAccentCharacter) + editor.apply() + Toast.makeText(context, "$language Accent Characters " + + if (shouldDisableAccentCharacter) "off" else "on", Toast.LENGTH_SHORT).show() + } + + fun setEmojiAutoSuggestionsPreference(context: Context, language: String, shouldShowEmojiSuggestions: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("emoji_suggestions_$language", shouldShowEmojiSuggestions) + editor.apply() + Toast.makeText(context, "$language Emoji Autosuggestions " + + if (shouldShowEmojiSuggestions) "on" else "off", Toast.LENGTH_SHORT).show() + } + + fun setCommaAndPeriodPreference() { + Log.d("PreferencesHelper", "This setCommaAndPeriodPreference-function is to be implemented later") + } + } +} From 546c698748470016ac8e827663eea5e27b98c10a Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:53:27 -0400 Subject: [PATCH 07/20] Extracting preferences setting to PreferencesHelper class. --- .../be/scri/fragments/SettingsFragment.kt | 73 +++++-------------- .../java/be/scri/helpers/PreferencesHelper.kt | 23 ++++++ 2 files changed, 43 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/SettingsFragment.kt b/app/src/main/java/be/scri/fragments/SettingsFragment.kt index 012d83e9..e52aea24 100644 --- a/app/src/main/java/be/scri/fragments/SettingsFragment.kt +++ b/app/src/main/java/be/scri/fragments/SettingsFragment.kt @@ -26,6 +26,7 @@ import be.scri.activities.MainActivity import be.scri.databinding.FragmentSettingsBinding import be.scri.extensions.config import be.scri.helpers.CustomAdapter +import be.scri.helpers.PreferencesHelper import be.scri.models.SwitchItem import be.scri.models.TextItem @@ -98,22 +99,30 @@ class SettingsFragment : Fragment() { getString(R.string.app_settings_menu_app_color_mode), description = getString(R.string.app_settings_menu_app_color_mode_description), isChecked = sharedPref.getBoolean("dark_mode", isUserDarkMode), - action = ::darkMode, - action2 = ::lightMode, + action = ({ setLightDarkMode(isDarkMode = true) }), + action2 = ({ setLightDarkMode(isDarkMode = false) }), ), SwitchItem( getString(R.string.app_settings_keyboard_keypress_vibration), description = getString(R.string.app_settings_keyboard_keypress_vibration_description), isChecked = requireContext().config.vibrateOnKeypress, - action = ::enableVibrateOnKeypress, - action2 = ::disableVibrateOnKeypress, + action = ({ + PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = true) + }), + action2 = ({ + PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = false) + }), ), SwitchItem( getString(R.string.app_settings_keyboard_functionality_popup_on_keypress), description = getString(R.string.app_settings_keyboard_functionality_popup_on_keypress_description), isChecked = requireContext().config.showPopupOnKeypress, - action = ::enableShowPopupOnKeypress, - action2 = ::disableShowPopupOnKeypress, + action = ({ + PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = true) + }), + action2 = ({ + PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = false) + }), ), ) } @@ -231,56 +240,14 @@ class SettingsFragment : Fragment() { return result } - private fun lightMode() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("dark_mode", false) - editor.apply() - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - requireActivity().recreate() - } - - private fun darkMode() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("dark_mode", true) - editor.apply() - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) + private fun setLightDarkMode(isDarkMode: Boolean) { + PreferencesHelper.setLightDarkModePreference(requireContext(), isDarkMode) + AppCompatDelegate.setDefaultNightMode( + if (isDarkMode) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO + ) requireActivity().recreate() } - private fun enableVibrateOnKeypress() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("vibrate_on_keypress", true) - editor.apply() - requireActivity().config.vibrateOnKeypress = true - } - - private fun disableVibrateOnKeypress() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("vibrate_on_keypress", false) - editor.apply() - requireActivity().config.vibrateOnKeypress = false - } - - private fun enableShowPopupOnKeypress() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("show_popup_on_keypress", true) - editor.apply() - requireActivity().config.showPopupOnKeypress = true - } - - private fun disableShowPopupOnKeypress() { - val sharedPref = requireActivity().getSharedPreferences("app_preferences", Context.MODE_PRIVATE) - val editor = sharedPref.edit() - editor.putBoolean("show_popup_on_keypress", false) - editor.apply() - requireActivity().config.showPopupOnKeypress = false - } - private fun setupItemVisibility() { binding.btnInstall.visibility = View.INVISIBLE binding.selectLanguage.visibility = View.VISIBLE diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt index d085e0f8..c8a6ae4a 100644 --- a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -40,5 +40,28 @@ class PreferencesHelper { fun setCommaAndPeriodPreference() { Log.d("PreferencesHelper", "This setCommaAndPeriodPreference-function is to be implemented later") } + + fun setVibrateOnKeypress(context: Context, shouldVibrateOnKeypress: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("vibrate_on_keypress", shouldVibrateOnKeypress) + editor.apply() + context.config.vibrateOnKeypress = shouldVibrateOnKeypress + } + + fun setShowPopupOnKeypress(context: Context, shouldShowPopupOnKeypress: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("show_popup_on_keypress", shouldShowPopupOnKeypress) + editor.apply() + context.config.showPopupOnKeypress = shouldShowPopupOnKeypress + } + + fun setLightDarkModePreference(context: Context, darkMode: Boolean) { + val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) + val editor = sharedPref.edit() + editor.putBoolean("dark_mode", darkMode) + editor.apply() + } } } From 565122a97242ed9b7bf1897aeda6bdd7d85a74db Mon Sep 17 00:00:00 2001 From: chris Date: Mon, 21 Oct 2024 21:53:53 -0400 Subject: [PATCH 08/20] Utilizing the RecylcerView extension function. --- .../java/be/scri/fragments/SettingsFragment.kt | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/SettingsFragment.kt b/app/src/main/java/be/scri/fragments/SettingsFragment.kt index e52aea24..e1549031 100644 --- a/app/src/main/java/be/scri/fragments/SettingsFragment.kt +++ b/app/src/main/java/be/scri/fragments/SettingsFragment.kt @@ -1,6 +1,5 @@ package be.scri.fragments -import CustomDividerItemDecoration import android.content.Context import android.content.Intent import android.content.res.Configuration @@ -17,13 +16,12 @@ import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.activity.addCallback import androidx.appcompat.app.AppCompatDelegate -import androidx.appcompat.content.res.AppCompatResources.getDrawable import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import be.scri.R import be.scri.activities.MainActivity import be.scri.databinding.FragmentSettingsBinding +import be.scri.extensions.addCustomItemDecoration import be.scri.extensions.config import be.scri.helpers.CustomAdapter import be.scri.helpers.PreferencesHelper @@ -161,22 +159,11 @@ class SettingsFragment : Fragment() { if (!isDecorationSet) { isDecorationSet = true recyclerView.apply { - addCustomItemDecoration() + addCustomItemDecoration(requireContext()) } } } - private fun RecyclerView.addCustomItemDecoration() { - val itemDecoration = - CustomDividerItemDecoration( - drawable = getDrawable(requireContext(), R.drawable.rv_divider)!!, - width = 1, - marginLeft = 50, - marginRight = 50, - ) - addItemDecoration(itemDecoration) - } - private fun getRecyclerViewElements(): MutableList { val languages = setupKeyboardLanguage() val list = mutableListOf() From fc9e217b1c8f3e40e8d4af87a3403e5cf2e02894 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 22 Oct 2024 20:33:01 -0400 Subject: [PATCH 09/20] Fixing ktlint issues. --- .../java/be/scri/fragments/AboutFragment.kt | 7 +++-- .../be/scri/fragments/SettingsFragment.kt | 26 +++++++++---------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index 079ef282..e742bf48 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -15,8 +15,8 @@ import be.scri.databinding.FragmentAboutBinding import be.scri.extensions.addCustomItemDecoration import be.scri.helpers.CustomAdapter import be.scri.helpers.HintUtils -import be.scri.helpers.ShareHelper import be.scri.helpers.RatingHelper +import be.scri.helpers.ShareHelper import be.scri.models.ItemsViewModel class AboutFragment : Fragment() { @@ -184,7 +184,10 @@ class AboutFragment : Fragment() { (activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint) } - private fun loadOtherFragment(fragment: Fragment, pageName: String?) { + private fun loadOtherFragment( + fragment: Fragment, + pageName: String?, + ) { try { val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() if (pageName != null) { diff --git a/app/src/main/java/be/scri/fragments/SettingsFragment.kt b/app/src/main/java/be/scri/fragments/SettingsFragment.kt index e1549031..98d61478 100644 --- a/app/src/main/java/be/scri/fragments/SettingsFragment.kt +++ b/app/src/main/java/be/scri/fragments/SettingsFragment.kt @@ -104,23 +104,23 @@ class SettingsFragment : Fragment() { getString(R.string.app_settings_keyboard_keypress_vibration), description = getString(R.string.app_settings_keyboard_keypress_vibration_description), isChecked = requireContext().config.vibrateOnKeypress, - action = ({ - PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = true) - }), - action2 = ({ - PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = false) - }), + action = ( + { PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = true) } + ), + action2 = ( + { PreferencesHelper.setVibrateOnKeypress(requireContext(), shouldVibrateOnKeypress = false) } + ), ), SwitchItem( getString(R.string.app_settings_keyboard_functionality_popup_on_keypress), description = getString(R.string.app_settings_keyboard_functionality_popup_on_keypress_description), isChecked = requireContext().config.showPopupOnKeypress, - action = ({ - PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = true) - }), - action2 = ({ - PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = false) - }), + action2 = ( + { PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = false) } + ), + action = ( + { PreferencesHelper.setShowPopupOnKeypress(requireContext(), shouldShowPopupOnKeypress = true) } + ), ), ) } @@ -230,7 +230,7 @@ class SettingsFragment : Fragment() { private fun setLightDarkMode(isDarkMode: Boolean) { PreferencesHelper.setLightDarkModePreference(requireContext(), isDarkMode) AppCompatDelegate.setDefaultNightMode( - if (isDarkMode) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO + if (isDarkMode) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO, ) requireActivity().recreate() } From c18db2b8257f87e76ab36a757ac8f423586a2ca1 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 22 Oct 2024 21:23:35 -0400 Subject: [PATCH 10/20] Fixing ktlint issues. --- .../java/be/scri/helpers/PreferencesHelper.kt | 63 ++++++++++++++----- .../main/java/be/scri/helpers/RatingHelper.kt | 6 +- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt index c8a6ae4a..522a9a1f 100644 --- a/app/src/main/java/be/scri/helpers/PreferencesHelper.kt +++ b/app/src/main/java/be/scri/helpers/PreferencesHelper.kt @@ -7,41 +7,68 @@ import be.scri.extensions.config class PreferencesHelper { companion object { - - fun setPeriodOnSpaceBarDoubleTapPreference(context: Context, language: String, - shouldEnablePeriodOnSpaceBarDoubleTap: Boolean) { + fun setPeriodOnSpaceBarDoubleTapPreference( + context: Context, + language: String, + shouldEnablePeriodOnSpaceBarDoubleTap: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("period_on_double_tap_$language", shouldEnablePeriodOnSpaceBarDoubleTap) editor.apply() - Toast.makeText(context, "$language Period on Double Tap of Space Bar " + - if (shouldEnablePeriodOnSpaceBarDoubleTap) "on" else "off", - Toast.LENGTH_SHORT).show() + Toast + .makeText( + context, + "$language Period on Double Tap of Space Bar " + + if (shouldEnablePeriodOnSpaceBarDoubleTap) "on" else "off", + Toast.LENGTH_SHORT, + ).show() } - fun setAccentCharacterPreference(context: Context, language: String, shouldDisableAccentCharacter: Boolean) { + fun setAccentCharacterPreference( + context: Context, + language: String, + shouldDisableAccentCharacter: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("disable_accent_character_$language", shouldDisableAccentCharacter) editor.apply() - Toast.makeText(context, "$language Accent Characters " + - if (shouldDisableAccentCharacter) "off" else "on", Toast.LENGTH_SHORT).show() + Toast + .makeText( + context, + "$language Accent Characters " + + if (shouldDisableAccentCharacter) "off" else "on", + Toast.LENGTH_SHORT, + ).show() } - fun setEmojiAutoSuggestionsPreference(context: Context, language: String, shouldShowEmojiSuggestions: Boolean) { + fun setEmojiAutoSuggestionsPreference( + context: Context, + language: String, + shouldShowEmojiSuggestions: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("emoji_suggestions_$language", shouldShowEmojiSuggestions) editor.apply() - Toast.makeText(context, "$language Emoji Autosuggestions " + - if (shouldShowEmojiSuggestions) "on" else "off", Toast.LENGTH_SHORT).show() + Toast + .makeText( + context, + "$language Emoji Autosuggestions " + + if (shouldShowEmojiSuggestions) "on" else "off", + Toast.LENGTH_SHORT, + ).show() } fun setCommaAndPeriodPreference() { Log.d("PreferencesHelper", "This setCommaAndPeriodPreference-function is to be implemented later") } - fun setVibrateOnKeypress(context: Context, shouldVibrateOnKeypress: Boolean) { + fun setVibrateOnKeypress( + context: Context, + shouldVibrateOnKeypress: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("vibrate_on_keypress", shouldVibrateOnKeypress) @@ -49,7 +76,10 @@ class PreferencesHelper { context.config.vibrateOnKeypress = shouldVibrateOnKeypress } - fun setShowPopupOnKeypress(context: Context, shouldShowPopupOnKeypress: Boolean) { + fun setShowPopupOnKeypress( + context: Context, + shouldShowPopupOnKeypress: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("show_popup_on_keypress", shouldShowPopupOnKeypress) @@ -57,7 +87,10 @@ class PreferencesHelper { context.config.showPopupOnKeypress = shouldShowPopupOnKeypress } - fun setLightDarkModePreference(context: Context, darkMode: Boolean) { + fun setLightDarkModePreference( + context: Context, + darkMode: Boolean, + ) { val sharedPref = context.getSharedPreferences("app_preferences", Context.MODE_PRIVATE) val editor = sharedPref.edit() editor.putBoolean("dark_mode", darkMode) diff --git a/app/src/main/java/be/scri/helpers/RatingHelper.kt b/app/src/main/java/be/scri/helpers/RatingHelper.kt index 67954021..53a0de19 100644 --- a/app/src/main/java/be/scri/helpers/RatingHelper.kt +++ b/app/src/main/java/be/scri/helpers/RatingHelper.kt @@ -9,7 +9,6 @@ import be.scri.activities.MainActivity import com.google.android.play.core.review.ReviewManagerFactory class RatingHelper { - companion object { private fun getInstallSource(context: Context): String? = try { @@ -19,7 +18,10 @@ class RatingHelper { null } - fun rateScribe(context: Context, activity: MainActivity) { + fun rateScribe( + context: Context, + activity: MainActivity, + ) { val installSource = getInstallSource(context) if (installSource == "com.android.vending") { From f33251ad202a42c4fe6930f638ceebaffe34bf7d Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 22 Oct 2024 21:47:07 -0400 Subject: [PATCH 11/20] Add parent Fragment to keep common functions. --- .../java/be/scri/fragments/AboutFragment.kt | 27 +---------- .../java/be/scri/fragments/ScribeFragment.kt | 33 ++++++++++++++ .../be/scri/fragments/SettingsFragment.kt | 45 +++++++------------ 3 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 app/src/main/java/be/scri/fragments/ScribeFragment.kt diff --git a/app/src/main/java/be/scri/fragments/AboutFragment.kt b/app/src/main/java/be/scri/fragments/AboutFragment.kt index e742bf48..514c5362 100644 --- a/app/src/main/java/be/scri/fragments/AboutFragment.kt +++ b/app/src/main/java/be/scri/fragments/AboutFragment.kt @@ -1,12 +1,10 @@ package be.scri.fragments import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.addCallback -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import be.scri.BuildConfig import be.scri.R @@ -19,7 +17,7 @@ import be.scri.helpers.RatingHelper import be.scri.helpers.ShareHelper import be.scri.models.ItemsViewModel -class AboutFragment : Fragment() { +class AboutFragment : ScribeFragment("About") { private lateinit var binding: FragmentAboutBinding override fun onCreateView( @@ -184,31 +182,8 @@ class AboutFragment : Fragment() { (activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint) } - private fun loadOtherFragment( - fragment: Fragment, - pageName: String?, - ) { - try { - val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() - if (pageName != null) { - fragmentTransaction.replace(R.id.fragment_container, fragment, pageName) - } else { - fragmentTransaction.replace(R.id.fragment_container, fragment) - } - fragmentTransaction.addToBackStack(pageName) - fragmentTransaction.commit() - } catch (e: IllegalStateException) { - Log.e("AboutFragment", "Failed to load fragment", e) - } - } - override fun onResume() { super.onResume() (activity as MainActivity).showHint("hint_shown_about", R.string.app_about_app_hint) } - - override fun onPause() { - super.onPause() - (activity as MainActivity).hideHint() - } } diff --git a/app/src/main/java/be/scri/fragments/ScribeFragment.kt b/app/src/main/java/be/scri/fragments/ScribeFragment.kt new file mode 100644 index 00000000..b3be37aa --- /dev/null +++ b/app/src/main/java/be/scri/fragments/ScribeFragment.kt @@ -0,0 +1,33 @@ +package be.scri.fragments + +import android.util.Log +import androidx.fragment.app.Fragment +import be.scri.R +import be.scri.activities.MainActivity + +abstract class ScribeFragment( + val fragmentName: String, +) : Fragment() { + override fun onPause() { + super.onPause() + (activity as MainActivity).hideHint() + } + + protected fun loadOtherFragment( + fragment: Fragment, + pageName: String?, + ) { + try { + val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() + if (pageName != null) { + fragmentTransaction.replace(R.id.fragment_container, fragment, pageName) + } else { + fragmentTransaction.replace(R.id.fragment_container, fragment) + } + fragmentTransaction.addToBackStack(pageName) + fragmentTransaction.commit() + } catch (e: IllegalStateException) { + Log.e("${fragmentName}Fragment", "Failed to load fragment", e) + } + } +} diff --git a/app/src/main/java/be/scri/fragments/SettingsFragment.kt b/app/src/main/java/be/scri/fragments/SettingsFragment.kt index 98d61478..a3408465 100644 --- a/app/src/main/java/be/scri/fragments/SettingsFragment.kt +++ b/app/src/main/java/be/scri/fragments/SettingsFragment.kt @@ -16,7 +16,6 @@ import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import androidx.activity.addCallback import androidx.appcompat.app.AppCompatDelegate -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import be.scri.R import be.scri.activities.MainActivity @@ -28,7 +27,7 @@ import be.scri.helpers.PreferencesHelper import be.scri.models.SwitchItem import be.scri.models.TextItem -class SettingsFragment : Fragment() { +class SettingsFragment : ScribeFragment("Settings") { private lateinit var binding: FragmentSettingsBinding private var isDecorationSet: Boolean = false @@ -61,7 +60,8 @@ class SettingsFragment : Fragment() { val enabledInputMethods = imm.enabledInputMethodList for (inputMethod in enabledInputMethods) { if (inputMethod.packageName == "be.scri.debug") { - setupItemVisibility() + binding.btnInstall.visibility = View.INVISIBLE + binding.selectLanguage.visibility = View.VISIBLE } } @@ -147,7 +147,8 @@ class SettingsFragment : Fragment() { val enabledInputMethods = imm.enabledInputMethodList for (inputMethod in enabledInputMethods) { if (inputMethod.packageName == "be.scri.debug") { - setupItemVisibility() + binding.btnInstall.visibility = View.INVISIBLE + binding.selectLanguage.visibility = View.VISIBLE } } val recyclerView = binding.recyclerView2 @@ -184,7 +185,17 @@ class SettingsFragment : Fragment() { TextItem( text = localizeLanguage, image = R.drawable.right_arrow, - action = { loadLanguageSettingsFragment(language) }, + action = { + loadOtherFragment( + LanguageSettingsFragment().apply { + arguments = + Bundle().apply { + putString("LANGUAGE_EXTRA", language) + } + }, + "LanguageFragment", + ) + }, language = language, ), ) @@ -192,20 +203,6 @@ class SettingsFragment : Fragment() { return list } - private fun loadLanguageSettingsFragment(language: String) { - val fragment = - LanguageSettingsFragment().apply { - arguments = - Bundle().apply { - putString("LANGUAGE_EXTRA", language) - } - } - val fragmentTransaction = requireActivity().supportFragmentManager.beginTransaction() - fragmentTransaction.replace(R.id.fragment_container, fragment, "LanguageFragment") - fragmentTransaction.addToBackStack("LanguageFragment") - fragmentTransaction.commit() - } - private fun setupKeyboardLanguage(): MutableList { val imm = requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val enabledInputMethods = imm.enabledInputMethodList @@ -235,19 +232,9 @@ class SettingsFragment : Fragment() { requireActivity().recreate() } - private fun setupItemVisibility() { - binding.btnInstall.visibility = View.INVISIBLE - binding.selectLanguage.visibility = View.VISIBLE - } - override fun onResume() { super.onResume() (activity as MainActivity).showHint("hint_shown_settings", R.string.app_settings_app_hint) setupRecyclerView2() } - - override fun onPause() { - super.onPause() - (activity as MainActivity).hideHint() - } } From 8bcf1e755d46a38b81c8e3e1f535b0fa11f5692c Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 22 Oct 2024 22:05:45 -0400 Subject: [PATCH 12/20] Add parent Fragment to keep common functions. --- app/src/main/java/be/scri/fragments/MainFragment.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/be/scri/fragments/MainFragment.kt b/app/src/main/java/be/scri/fragments/MainFragment.kt index 520713ae..fd62bc04 100644 --- a/app/src/main/java/be/scri/fragments/MainFragment.kt +++ b/app/src/main/java/be/scri/fragments/MainFragment.kt @@ -11,12 +11,11 @@ import android.view.View import android.view.ViewGroup import androidx.activity.addCallback import androidx.appcompat.app.AppCompatDelegate -import androidx.fragment.app.Fragment import be.scri.R import be.scri.activities.MainActivity import be.scri.databinding.FragmentMainBinding -class MainFragment : Fragment() { +class MainFragment : ScribeFragment("Main") { private var _binding: FragmentMainBinding? = null val binding get() = _binding!! @@ -32,7 +31,7 @@ class MainFragment : Fragment() { binding.cardView.setOnClickListener { openKeyboardSettings() } - (requireActivity() as MainActivity).unsetActionBarLayoutMargin() + (requireActivity() as MainActivity).setActionBarLayoutMargin(false) applyUserDarkModePreference() val callback = requireActivity().onBackPressedDispatcher.addCallback(this) { @@ -87,9 +86,4 @@ class MainFragment : Fragment() { super.onResume() (activity as MainActivity).showHint("hint_shown_main", R.string.app_installation_app_hint) } - - override fun onPause() { - super.onPause() - (activity as MainActivity).hideHint() - } } From e15c1e8f3341e432d2743dcf8f2d67cb0544e7b5 Mon Sep 17 00:00:00 2001 From: chris Date: Wed, 23 Oct 2024 20:01:44 -0400 Subject: [PATCH 13/20] Moving dark mode preference checking to PreferencesHelper. --- .../java/be/scri/activities/MainActivity.kt | 21 ++----------------- .../java/be/scri/helpers/PreferencesHelper.kt | 15 +++++++++++++ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/be/scri/activities/MainActivity.kt b/app/src/main/java/be/scri/activities/MainActivity.kt index 27872a77..3175ba19 100644 --- a/app/src/main/java/be/scri/activities/MainActivity.kt +++ b/app/src/main/java/be/scri/activities/MainActivity.kt @@ -14,6 +14,7 @@ import androidx.viewpager2.widget.ViewPager2 import be.scri.R import be.scri.adapters.ViewPagerAdapter import be.scri.databinding.ActivityMainBinding +import be.scri.helpers.PreferencesHelper import be.scri.services.EnglishKeyboardIME import com.google.android.material.bottomnavigation.BottomNavigationView @@ -36,7 +37,7 @@ class MainActivity : AppCompatActivity() { setActionBarTitle(R.string.app_launcher_name) val mButton = supportActionBar?.customView?.findViewById