diff --git a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt index 8676629..5121eb2 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/AppMenuAdapter.kt @@ -63,7 +63,7 @@ class AppMenuAdapter( } inner class AppViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val listItem: FrameLayout = itemView.findViewById(R.id.listItem) + val listItem: FrameLayout = itemView.findViewById(R.id.listItem) val textView: TextView = listItem.findViewById(R.id.appName) val actionMenuLayout: LinearLayout = listItem.findViewById(R.id.actionMenu) val editView: LinearLayout = listItem.findViewById(R.id.renameView) @@ -136,14 +136,15 @@ class AppMenuAdapter( uiUtils.setItemSpacing(holder.textView) + uiUtils.setTextFont(holder.textView) + holder.textView.setTextColor(sharedPreferenceManager.getTextColor()) + // Update the application information (allows updating apps to work) val appInfo = appUtils.getAppInfo( app.first.applicationInfo.packageName, app.third ) - holder.textView.setTextColor(sharedPreferenceManager.getTextColor()) - // Set app name on the menu. If the app has been uninstalled, replace it with "Removing" until the app menu updates. val appLabel: CharSequence = appInfo?.let { activity.packageManager.getApplicationLabel(it) } ?: "Removing..." diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index 04d6468..f6ade5d 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -296,6 +296,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setMenuItemColors(searchView) uiUtils.setMenuItemColors(binding.menuTitle, "A9") + uiUtils.setTextFont(binding.homeView) + uiUtils.setFont(searchView) + uiUtils.setFont(binding.menuTitle) + uiUtils.setClockVisibility(clock) uiUtils.setDateVisibility(dateText) uiUtils.setSearchVisibility(searchView, binding.searchReplacement) @@ -432,6 +436,18 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh uiUtils.setMenuItemColors(binding.menuTitle, "A9") } + "textFont" -> { + uiUtils.setTextFont(binding.homeView) + uiUtils.setFont(searchView) + uiUtils.setFont(binding.menuTitle) + } + + "textStyle" -> { + uiUtils.setTextFont(binding.homeView) + uiUtils.setFont(searchView) + uiUtils.setFont(binding.menuTitle) + } + "clockEnabled" -> { uiUtils.setClockVisibility(clock) } diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt index afaefde..b303878 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt @@ -3,6 +3,8 @@ package eu.ottop.yamlauncher.settings import android.app.AlertDialog import android.content.Context import android.graphics.Color +import android.os.Handler +import android.os.Looper import android.util.TypedValue import android.widget.TextView import androidx.fragment.app.FragmentActivity @@ -30,7 +32,6 @@ class SharedPreferenceManager (private val context: Context) { return Color.parseColor(textColor) } - private fun getThemeColor(attr: Int): Int { val typedValue = TypedValue() val theme = context.theme @@ -38,6 +39,14 @@ class SharedPreferenceManager (private val context: Context) { return typedValue.data } + fun getTextFont(): String? { + return preferences.getString("textFont", "system") + } + + fun getTextStyle(): String? { + return preferences.getString("textStyle", "normal") + } + fun isBarVisible(): Boolean { return preferences.getBoolean("barVisibility", false) } @@ -247,21 +256,26 @@ class SharedPreferenceManager (private val context: Context) { editor.clear() editor.apply() + // We need to navigate through the fragments to apply all settings properly activity.supportFragmentManager .beginTransaction() .replace(R.id.settingsLayout, UISettingsFragment()) .commit() - activity.supportFragmentManager - .beginTransaction() - .replace(R.id.settingsLayout, HomeSettingsFragment()) - .commit() - activity.supportFragmentManager - .beginTransaction() - .replace(R.id.settingsLayout, AppMenuSettingsFragment()) - .commit() - activity.supportFragmentManager - .beginTransaction() - .replace(R.id.settingsLayout, SettingsFragment()) - .commit() + // The swapping after ui settings needs to be delayed or font changes don't work in app menu + val handler = Handler(Looper.getMainLooper()) + handler.postDelayed({ + activity.supportFragmentManager + .beginTransaction() + .replace(R.id.settingsLayout, HomeSettingsFragment()) + .commit() + activity.supportFragmentManager + .beginTransaction() + .replace(R.id.settingsLayout, AppMenuSettingsFragment()) + .commit() + activity.supportFragmentManager + .beginTransaction() + .replace(R.id.settingsLayout, SettingsFragment()) + .commit() + }, 50) } } \ No newline at end of file diff --git a/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt b/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt index 3463965..17a4de6 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/utils/UIUtils.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.BlendMode import android.graphics.BlendModeColorFilter import android.graphics.Color +import android.graphics.Typeface import android.util.TypedValue import android.view.Gravity import android.view.View @@ -50,7 +51,6 @@ class UIUtils(private val context: Context) { BlendModeColorFilter(sharedPreferenceManager.getTextColor(), BlendMode.SRC_ATOP) view.compoundDrawables[2]?.colorFilter = BlendModeColorFilter(sharedPreferenceManager.getTextColor(), BlendMode.SRC_ATOP) - } else -> { view.setBackgroundColor(color) @@ -62,28 +62,56 @@ class UIUtils(private val context: Context) { return try { view.javaClass.getMethod(methodName, Int::class.java) true - } catch (e: NoSuchMethodException) { + } catch (_: NoSuchMethodException) { false } } fun setMenuItemColors(view: TextView, alphaHex: String = "FF") { - val viewTreeObserver = view.viewTreeObserver + val color = sharedPreferenceManager.getTextColor() + view.setTextColor(setAlpha(color, alphaHex)) + view.setHintTextColor(setAlpha(color, "A9")) - val globalLayoutListener = object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - view.viewTreeObserver.removeOnGlobalLayoutListener(this) - val color = sharedPreferenceManager.getTextColor() - view.setTextColor(setAlpha(color, alphaHex)) - view.setHintTextColor(setAlpha(color, "A9")) + view.compoundDrawables[0]?.mutate()?.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP) + } - view.compoundDrawables[0]?.mutate()?.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_ATOP) + fun setTextFont(view: View) { + when { + view is ViewGroup -> { + view.children.forEach { child -> + setTextFont(child) + } + } + hasMethod(view, "setTextAppearance") -> { + setFont(view as TextView) } } + } - if (viewTreeObserver.isAlive) { - viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener) + fun setFont(view: TextView) { + var font = sharedPreferenceManager.getTextFont() + val style = sharedPreferenceManager.getTextStyle() + + if (font == "system") { + val typedArray = context.obtainStyledAttributes(android.R.style.TextAppearance_DeviceDefault, intArrayOf(android.R.attr.fontFamily)) + font = typedArray.getString(0) + typedArray.recycle() + } + + when (style) { + "normal" -> { + view.setTypeface(Typeface.create(font, Typeface.NORMAL)) + } + "bold" -> { + view.setTypeface(Typeface.create(font, Typeface.BOLD)) + } + "italic" -> { + view.setTypeface(Typeface.create(font, Typeface.ITALIC)) + } + "bold-italic" -> { + view.setTypeface(Typeface.create(font, Typeface.BOLD_ITALIC)) + } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f279770..041faab 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -99,7 +99,7 @@ android:layout_marginHorizontal="32dp" android:layout_marginTop="45dp" android:layout_marginBottom="27dp" - android:fontFamily="@null" + android:fontFamily="More Fonts..." android:format12Hour="hh:mm" android:format24Hour="HH:mm" android:textAlignment="textStart" @@ -115,7 +115,6 @@ android:id="@+id/textDate" android:layout_width="0dp" android:layout_height="wrap_content" - android:fontFamily="@null" android:format12Hour="dd MMM yyyy" android:format24Hour="dd MMM yyyy" android:lineSpacingExtra="8sp" diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index e45e7ab..3aa641a 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -31,6 +31,56 @@ material + + System + Casual + Cursive + Monospace + Sans Serif + Sans Serif Black + Sans Serif Condensed + Sans Serif Condensed Light + Sans Serif Condensed Medium + Sans Serif Light + Sans Serif Medium + Sans Serif Smallcaps + Sans Serif Thin + Serif + Serif Monospace + + + + system + casual + cursive + monospace + sans-serif + sans-serif-black + sans-serif-condensed + sans-serif-condensed-light + sans-serif-condensed-medium + sans-serif-light + sans-serif-medium + sans-serif-smallcaps + sans-serif-thin + serif + serif-monospace + + + + Normal + Bold + Italic + Bold-Italic + + + + normal + bold + italic + bold-italic + + 0.25x 0.5x diff --git a/app/src/main/res/xml/ui_preferences.xml b/app/src/main/res/xml/ui_preferences.xml index f289fe4..559faed 100644 --- a/app/src/main/res/xml/ui_preferences.xml +++ b/app/src/main/res/xml/ui_preferences.xml @@ -4,7 +4,7 @@ + + +