Skip to content

Commit dafd476

Browse files
ADFA-1296: Add long press support to General IDE preferences options (#317)
* ADFA-1296: Add long press support to General IDE preferences options * Merge remote-tracking branch 'origin/stage' into ADFA-1296 # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. * Move hardcoded tooltips to tooltips tags class --------- Co-authored-by: alome007 <astrocoder007@gmail.com>
1 parent 92c01b7 commit dafd476

2 files changed

Lines changed: 117 additions & 1 deletion

File tree

‎app/src/main/java/com/itsaky/androidide/fragments/IDEPreferencesFragment.kt‎

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,32 @@
1717

1818
package com.itsaky.androidide.fragments
1919

20+
import android.content.Intent
2021
import android.os.Bundle
22+
import android.util.Log
2123
import android.view.LayoutInflater
2224
import android.view.View
2325
import android.view.ViewGroup
26+
import androidx.lifecycle.lifecycleScope
27+
import androidx.preference.Preference
2428
import androidx.preference.PreferenceCategory
2529
import androidx.preference.PreferenceGroup
30+
import androidx.preference.PreferenceViewHolder
2631
import 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
2740
import com.itsaky.androidide.preferences.IPreference
2841
import com.itsaky.androidide.preferences.IPreferenceGroup
2942
import 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

3147
class 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+

‎idetooltips/src/main/java/com/itsaky/androidide/idetooltips/TooltipTag.kt‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ object TooltipTag {
2020
const val PROJECT_SEARCH_RESULTS = "project.searchresults"
2121
const val PROJECT_DIAGNOSTICS = "project.diagnostics"
2222

23+
// General Preferences
24+
const val PREFS_EDITOR = "prefs.editor"
25+
const val PREFS_GENERAL = "prefs.general"
26+
const val PREFS_BUILD_RUN = "prefs.buildrun"
27+
const val PREFS_TERMUX = "prefs.termux"
28+
2329
}

0 commit comments

Comments
 (0)