@@ -24,6 +24,7 @@ import android.content.res.Configuration
2424import android.os.Bundle
2525import android.text.TextUtils
2626import android.util.Log
27+ import android.util.TypedValue
2728import android.view.KeyEvent
2829import android.view.View
2930import android.view.ViewGroup.LayoutParams
@@ -32,6 +33,8 @@ import androidx.collection.MutableIntObjectMap
3233import androidx.core.content.res.ResourcesCompat
3334import androidx.core.view.GravityCompat
3435import androidx.core.view.doOnNextLayout
36+ import androidx.fragment.app.Fragment
37+ import androidx.fragment.app.FragmentManager
3538import androidx.lifecycle.lifecycleScope
3639import com.blankj.utilcode.util.ImageUtils
3740import com.google.android.material.tabs.TabLayout
@@ -63,6 +66,7 @@ import com.itsaky.androidide.eventbus.events.editor.DocumentChangeEvent
6366import com.itsaky.androidide.eventbus.events.file.FileRenameEvent
6467import com.itsaky.androidide.activities.PluginManagerActivity
6568import com.itsaky.androidide.eventbus.events.plugin.PluginCrashedEvent
69+ import com.itsaky.androidide.eventbus.events.preferences.PreferenceChangeEvent
6670import com.itsaky.androidide.idetooltips.TooltipManager
6771import com.itsaky.androidide.idetooltips.TooltipTag
6872import com.itsaky.androidide.interfaces.IEditorHandler
@@ -73,6 +77,7 @@ import com.itsaky.androidide.models.Range
7377import com.itsaky.androidide.models.SaveResult
7478import com.itsaky.androidide.plugins.manager.build.PluginBuildActionManager
7579import com.itsaky.androidide.plugins.manager.fragment.PluginFragmentFactory
80+ import com.itsaky.androidide.preferences.internal.EditorPreferences
7681import com.itsaky.androidide.plugins.manager.ui.PluginDrawableResolver
7782import com.itsaky.androidide.plugins.manager.ui.PluginEditorTabManager
7883import com.itsaky.androidide.projects.ProjectManagerImpl
@@ -90,6 +95,7 @@ import com.itsaky.androidide.utils.EditorSidebarActions
9095import com.itsaky.androidide.utils.IntentUtils.openImage
9196import com.itsaky.androidide.utils.UniqueNameBuilder
9297import com.itsaky.androidide.utils.flashSuccess
98+ import com.itsaky.androidide.utils.forEachViewRecursively
9399import kotlinx.coroutines.Dispatchers
94100import kotlinx.coroutines.NonCancellable
95101import kotlinx.coroutines.launch
@@ -98,6 +104,7 @@ import org.adfa.constants.CONTENT_KEY
98104import org.greenrobot.eventbus.Subscribe
99105import org.greenrobot.eventbus.ThreadMode
100106import java.io.File
107+ import java.util.WeakHashMap
101108import java.util.concurrent.ConcurrentHashMap
102109import java.util.concurrent.CopyOnWriteArrayList
103110import java.util.concurrent.atomic.AtomicBoolean
@@ -125,6 +132,22 @@ open class EditorHandlerActivity :
125132
126133 private val pluginTabIndices = mutableMapOf<String , Int >()
127134 private val tabIndexToPluginId = mutableMapOf<Int , String >()
135+ private var lastAppliedPluginFontScale = EditorPreferences .editorFontScale
136+ private val pluginTextBaseSizes = WeakHashMap <TextView , Float >()
137+
138+ private val pluginFontScalingListener = object : FragmentManager .FragmentLifecycleCallbacks () {
139+ override fun onFragmentViewCreated (
140+ mFragmentManager : FragmentManager ,
141+ mFragment : Fragment ,
142+ view : View ,
143+ savedInstanceState : Bundle ?
144+ ) {
145+ val scale = EditorPreferences .editorFontScale
146+ if (scale != 1f && isPluginFragment(mFragment)) {
147+ applyPluginFontScale(view, scale)
148+ }
149+ }
150+ }
128151 private val shortcutManager by lazy { ShortcutManager (applicationContext) }
129152
130153 private var pluginEditorProvider: EditorProviderImpl ? = null
@@ -194,6 +217,8 @@ open class EditorHandlerActivity :
194217 mBuildEventListener.setActivity(this )
195218 super .onCreate(savedInstanceState)
196219
220+ supportFragmentManager.registerFragmentLifecycleCallbacks(pluginFontScalingListener, true )
221+
197222 editorViewModel._displayedFile .observe(
198223 this ,
199224 ) { fileIndex ->
@@ -392,6 +417,7 @@ open class EditorHandlerActivity :
392417 }
393418
394419 restoreOpenedPluginTabs()
420+ syncPluginUiFontSize()
395421 }
396422
397423 private fun restoreOpenedPluginTabs () {
@@ -1113,6 +1139,49 @@ open class EditorHandlerActivity :
11131139 showPluginCrashDialog(event)
11141140 }
11151141
1142+ @Subscribe(threadMode = ThreadMode .MAIN )
1143+ fun onPreferenceChanged (event : PreferenceChangeEvent ) {
1144+ if (event.key == EditorPreferences .FONT_SIZE ) {
1145+ syncPluginUiFontSize()
1146+ }
1147+ }
1148+
1149+ private fun syncPluginUiFontSize () {
1150+ val scale = EditorPreferences .editorFontScale
1151+ if (scale == lastAppliedPluginFontScale) {
1152+ return
1153+ }
1154+ lastAppliedPluginFontScale = scale
1155+
1156+ val pluginFragments = mutableListOf<Fragment >()
1157+ collectPluginFragments(supportFragmentManager, pluginFragments)
1158+ pluginFragments.forEach { fragment ->
1159+ fragment.view?.let { applyPluginFontScale(it, scale) }
1160+ }
1161+ }
1162+
1163+ private fun isPluginFragment (fragment : Fragment ): Boolean =
1164+ fragment.javaClass.classLoader != = javaClass.classLoader
1165+
1166+ private fun applyPluginFontScale (root : View , scale : Float ) {
1167+ root.forEachViewRecursively { view ->
1168+ if (view is TextView ) {
1169+ val baseSize = pluginTextBaseSizes.getOrPut(view) { view.textSize }
1170+ view.setTextSize(TypedValue .COMPLEX_UNIT_PX , baseSize * scale)
1171+ }
1172+ }
1173+ }
1174+
1175+ private fun collectPluginFragments (manager : FragmentManager , into : MutableList <Fragment >) {
1176+ manager.fragments.forEach { fragment ->
1177+ if (isPluginFragment(fragment)) {
1178+ into.add(fragment)
1179+ } else {
1180+ collectPluginFragments(fragment.childFragmentManager, into)
1181+ }
1182+ }
1183+ }
1184+
11161185 private fun showPluginCrashDialog (event : PluginCrashedEvent ) {
11171186 val dialogView = layoutInflater.inflate(R .layout.dialog_plugin_crash, null )
11181187 dialogView.findViewById<TextView >(R .id.plugin_crash_message).text =
0 commit comments