1717
1818package com.itsaky.androidide.fragments
1919
20+ import android.content.Intent
2021import android.os.Bundle
22+ import android.util.Log
2123import android.view.LayoutInflater
2224import android.view.View
2325import android.view.ViewGroup
26+ import androidx.lifecycle.lifecycleScope
27+ import androidx.preference.Preference
2428import androidx.preference.PreferenceCategory
2529import androidx.preference.PreferenceGroup
30+ import androidx.preference.PreferenceViewHolder
2631import com.google.android.material.transition.MaterialSharedAxis
32+ import com.itsaky.androidide.activities.editor.HelpActivity
33+ import com.itsaky.androidide.idetooltips.IDETooltipItem
34+ import com.itsaky.androidide.idetooltips.TooltipCategory
35+ import com.itsaky.androidide.idetooltips.TooltipManager
36+ import com.itsaky.androidide.idetooltips.TooltipTag.PREFS_BUILD_RUN
37+ import com.itsaky.androidide.idetooltips.TooltipTag.PREFS_EDITOR
38+ import com.itsaky.androidide.idetooltips.TooltipTag.PREFS_GENERAL
39+ import com.itsaky.androidide.idetooltips.TooltipTag.PREFS_TERMUX
2740import com.itsaky.androidide.preferences.IPreference
2841import com.itsaky.androidide.preferences.IPreferenceGroup
2942import com.itsaky.androidide.preferences.IPreferenceScreen
43+ import kotlinx.coroutines.launch
44+ import org.adfa.constants.CONTENT_KEY
45+ import org.adfa.constants.CONTENT_TITLE_KEY
3046
3147class IDEPreferencesFragment : BasePreferenceFragment () {
3248
@@ -63,7 +79,15 @@ class IDEPreferencesFragment : BasePreferenceFragment() {
6379 if (child is IPreferenceScreen ) {
6480 preference.fragment = IDEPreferencesFragment ::class .java.name
6581 preference.extras.putParcelableArrayList(EXTRA_CHILDREN , ArrayList (child.children))
66- pref.addPreference(preference)
82+
83+ // Wrap target preferences with long-click support
84+ val finalPreference = if (isTargetPreference(child.key)) {
85+ createLongClickablePreference(preference, child.key)
86+ } else {
87+ preference
88+ }
89+
90+ pref.addPreference(finalPreference)
6791 continue
6892 }
6993
@@ -77,7 +101,93 @@ class IDEPreferencesFragment : BasePreferenceFragment() {
77101 }
78102 }
79103
104+ private fun isTargetPreference (key : String ): Boolean {
105+ return key in listOf (
106+ " idepref_general" ,
107+ " idepref_editor" ,
108+ " idepref_build_n_run" ,
109+ " ide.preferences.terminal"
110+ )
111+ }
112+
113+ private fun createLongClickablePreference (originalPreference : Preference , key : String ): Preference {
114+ return object : Preference (requireContext()) {
115+ init {
116+ // Copy essential properties from original preference
117+ this .key = originalPreference.key
118+ title = originalPreference.title
119+ summary = originalPreference.summary
120+ fragment = originalPreference.fragment
121+ extras.putAll(originalPreference.extras)
122+
123+ // Match the original preference's icon space settings
124+ icon = originalPreference.icon
125+ isIconSpaceReserved = originalPreference.isIconSpaceReserved
126+ }
127+
128+ override fun onBindViewHolder (holder : PreferenceViewHolder ) {
129+ super .onBindViewHolder(holder)
130+ // Set up long click listener on the view
131+ holder.itemView.setOnLongClickListener { view ->
132+ val tooltipTag = getTooltipTag(key)
133+ if (tooltipTag != null ) {
134+ showTooltip(view, tooltipTag)
135+ } else {
136+ Log .d(" IDEPreferencesFragment" , " Long click detected on preference: $key " )
137+ }
138+ true
139+ }
140+ }
141+ }
142+ }
143+
144+ private fun getTooltipTag (key : String ): String? {
145+ return when (key) {
146+ " idepref_general" -> PREFS_GENERAL
147+ " idepref_editor" -> PREFS_EDITOR
148+ " idepref_build_n_run" -> PREFS_BUILD_RUN
149+ " ide.preferences.terminal" -> PREFS_TERMUX
150+ else -> null
151+ }
152+ }
153+
154+ private fun showTooltip (anchorView : View , tooltipTag : String ) {
155+ lifecycleScope.launch {
156+ try {
157+ val tooltipData = TooltipManager .getTooltip(
158+ context = requireContext(),
159+ category = TooltipCategory .CATEGORY_IDE ,
160+ tag = tooltipTag
161+ )
162+
163+ tooltipData?.let { data ->
164+ TooltipManager .showIDETooltip(
165+ context = requireContext(),
166+ anchorView = anchorView,
167+ level = 0 ,
168+ tooltipItem = IDETooltipItem (
169+ tooltipCategory = TooltipCategory .CATEGORY_IDE ,
170+ tooltipTag = data.tooltipTag,
171+ detail = data.detail,
172+ summary = data.summary,
173+ buttons = data.buttons,
174+ )
175+ ) { context, url, title ->
176+ val intent = Intent (context, HelpActivity ::class .java).apply {
177+ putExtra(CONTENT_KEY , url)
178+ putExtra(CONTENT_TITLE_KEY , title)
179+ }
180+ context.startActivity(intent)
181+ }
182+ }
183+ } catch (e: Exception ) {
184+ Log .e(" IDEPreferencesFragment" , " Error showing tooltip for tag: $tooltipTag " , e)
185+ }
186+ }
187+ }
188+
80189 companion object {
81190 const val EXTRA_CHILDREN = " ide.preferences.fragment.children"
82191 }
83192}
193+
0 commit comments