diff --git a/.kotlin/sessions/kotlin-compiler-11446405923036435696.salive b/.kotlin/sessions/kotlin-compiler-11446405923036435696.salive new file mode 100644 index 00000000..e69de29b diff --git a/app/src/main/assets/font/default.ttf b/app/src/main/assets/font/default.ttf new file mode 100644 index 00000000..ac0f908b Binary files /dev/null and b/app/src/main/assets/font/default.ttf differ diff --git a/app/src/main/assets/font/open_sans_medium.ttf b/app/src/main/assets/font/open_sans_medium.ttf new file mode 100644 index 00000000..ac587b48 Binary files /dev/null and b/app/src/main/assets/font/open_sans_medium.ttf differ diff --git a/app/src/main/assets/font/open_sans_medium2.ttf b/app/src/main/assets/font/open_sans_medium2.ttf new file mode 100644 index 00000000..ae716936 Binary files /dev/null and b/app/src/main/assets/font/open_sans_medium2.ttf differ diff --git a/app/src/main/java/com/darkempire78/opencalculator/FontManager.kt b/app/src/main/java/com/darkempire78/opencalculator/FontManager.kt new file mode 100644 index 00000000..897ce002 --- /dev/null +++ b/app/src/main/java/com/darkempire78/opencalculator/FontManager.kt @@ -0,0 +1,51 @@ +package com.darkempire78.opencalculator + +import android.app.Activity +import android.app.Application +import android.content.Context +import android.graphics.Typeface +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.widget.TextView + +class FontManager(context: Context) { + val context: Context = context.applicationContext + fun applyFont(application: Application) { + val fontName = MyPreferences(context).appFont + if (fontName != null && fontName != "Default") { + val typeface = Typeface.createFromAsset(context.assets, "font/$fontName.ttf") + // Apply the typeface to all activities + application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + activity.findViewById(android.R.id.content).viewTreeObserver + .addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val rootView = activity.findViewById(android.R.id.content) + applyFontToViewGroup(rootView, typeface) + rootView.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } + override fun onActivityStarted(activity: Activity) {} + override fun onActivityResumed(activity: Activity) {} + override fun onActivityPaused(activity: Activity) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityDestroyed(activity: Activity) {} + }) + } + } + + private fun applyFontToViewGroup(viewGroup: ViewGroup, typeface: Typeface) { + for (i in 0 until viewGroup.childCount) { + val child = viewGroup.getChildAt(i) + if (child is ViewGroup) { + applyFontToViewGroup(child, typeface) + } else if (child is TextView) { + child.typeface = typeface + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/darkempire78/opencalculator/MyPreferences.kt b/app/src/main/java/com/darkempire78/opencalculator/MyPreferences.kt index 76673ad1..8c2245d3 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/MyPreferences.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/MyPreferences.kt @@ -1,6 +1,9 @@ package com.darkempire78.opencalculator import android.content.Context +import android.graphics.Typeface +import android.view.ViewGroup +import android.widget.TextView import androidx.appcompat.app.AppCompatDelegate.* import androidx.preference.PreferenceManager import com.google.gson.Gson @@ -25,6 +28,7 @@ class MyPreferences(context: Context) { private const val KEY_SPLIT_PARENTHESIS_BUTTON = "darkempire78.opencalculator.SPLIT_PARENTHESIS_BUTTON" private const val KEY_DELETE_HISTORY_ON_SWIPE = "darkempire78.opencalculator.DELETE_HISTORY_ELEMENT_ON_SWIPE" private const val KEY_AUTO_SAVE_CALCULATION_WITHOUT_EQUAL_BUTTON = "darkempire78.opencalculator.AUTO_SAVE_CALCULATION_WITHOUT_EQUAL_BUTTON" + private const val KEY_APP_FONT = "darkempire78.opencalculator.APP_FONT" } private val preferences = PreferenceManager.getDefaultSharedPreferences(context) @@ -61,6 +65,8 @@ class MyPreferences(context: Context) { var autoSaveCalculationWithoutEqualButton = preferences.getBoolean(KEY_AUTO_SAVE_CALCULATION_WITHOUT_EQUAL_BUTTON, true) set(value) = preferences.edit().putBoolean(KEY_AUTO_SAVE_CALCULATION_WITHOUT_EQUAL_BUTTON, value).apply() + var appFont = preferences.getString(KEY_APP_FONT, "default") + set(value) = preferences.edit().putString(KEY_APP_FONT, value).apply() fun getHistory(): MutableList { diff --git a/app/src/main/java/com/darkempire78/opencalculator/OpenCalcApp.kt b/app/src/main/java/com/darkempire78/opencalculator/OpenCalcApp.kt index bca01de7..0b0afde1 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/OpenCalcApp.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/OpenCalcApp.kt @@ -1,12 +1,20 @@ package com.darkempire78.opencalculator +import android.app.Activity import android.app.Application +import android.graphics.Typeface +import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.widget.TextView import androidx.appcompat.app.AppCompatDelegate.* class OpenCalcApp : Application() { override fun onCreate() { super.onCreate() + FontManager(this).applyFont(this) // if the theme is overriding the system, the first creation doesn't work properly val forceDayNight = MyPreferences(this).forceDayNight diff --git a/app/src/main/java/com/darkempire78/opencalculator/SettingsActivity.kt b/app/src/main/java/com/darkempire78/opencalculator/SettingsActivity.kt index 4055930e..ad5a515a 100644 --- a/app/src/main/java/com/darkempire78/opencalculator/SettingsActivity.kt +++ b/app/src/main/java/com/darkempire78/opencalculator/SettingsActivity.kt @@ -2,13 +2,16 @@ package com.darkempire78.opencalculator import android.content.Intent import android.content.res.Resources.Theme +import android.graphics.Typeface import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings import android.view.View +import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView +import android.widget.TextView import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -29,9 +32,9 @@ class SettingsActivity : AppCompatActivity() { setContentView(R.layout.settings_activity) if (savedInstanceState == null) { supportFragmentManager - .beginTransaction() - .replace(R.id.settings, SettingsFragment()) - .commit() + .beginTransaction() + .replace(R.id.settings, SettingsFragment()) + .commit() } supportActionBar?.setDisplayHomeAsUpEnabled(true) @@ -46,7 +49,6 @@ class SettingsActivity : AppCompatActivity() { findViewById(R.id.settings_back_button).setOnClickListener { finish() } - } class SettingsFragment : PreferenceFragmentCompat() { @@ -55,7 +57,7 @@ class SettingsActivity : AppCompatActivity() { val appLanguagePreference = findPreference("darkempire78.opencalculator.APP_LANGUAGE") - // remove the app language button if you are using an Android version lower than v33 (Android 13) + // Remove the app language button if you are using an Android version lower than v33 (Android 13) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { appLanguagePreference?.isVisible = false } else { @@ -79,6 +81,30 @@ class SettingsActivity : AppCompatActivity() { Themes.openDialogThemeSelector(this.requireContext()) true } + + // Font preference + val appFontPreference = findPreference("darkempire78.opencalculator.APP_FONT") + appFontPreference?.setOnPreferenceChangeListener { _, newValue -> + applyFont(newValue as String) + true + } + } + + private fun applyFont(fontName: String) { + val typeface = Typeface.createFromAsset(requireContext().assets, "font/$fontName.ttf") + val rootView = requireActivity().findViewById(android.R.id.content) + applyFontToViewGroup(rootView, typeface) + } + + private fun applyFontToViewGroup(viewGroup: ViewGroup, typeface: Typeface) { + for (i in 0 until viewGroup.childCount) { + val child = viewGroup.getChildAt(i) + if (child is ViewGroup) { + applyFontToViewGroup(child, typeface) + } else if (child is TextView) { + child.typeface = typeface + } + } } @RequiresApi(Build.VERSION_CODES.TIRAMISU) diff --git a/app/src/main/res/drawable/font.xml b/app/src/main/res/drawable/font.xml new file mode 100644 index 00000000..c24a91b2 --- /dev/null +++ b/app/src/main/res/drawable/font.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index e8c2b47b..71859211 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -86,4 +86,16 @@ 1000 + + + + Default + OpenSans + + + + default + open_sans_medium + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99df88ce..f9c13905 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -138,4 +138,5 @@ Real number required Automatically save calculations Automatically save calculations in history without needing to click the equal button + Font diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index a59c5204..9707b8dd 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -25,6 +25,16 @@ app:summary="APP THEME" app:icon="@drawable/theme" /> + +