Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,16 @@ open class EditorHandlerActivity :
tag = action.retrieveTooltipTag(false),
)
},
onHover = { anchor ->
TooltipManager.showIdeCategoryTooltip(
context = this@EditorHandlerActivity,
anchorView = anchor,
tag = action.retrieveTooltipTag(false)
)
},
onHoverExit = {
TooltipManager.dismissActiveTooltip()
},
shouldAddMargin = !isLast,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.itsaky.androidide.activities.editor

import android.annotation.SuppressLint
import android.content.res.Configuration
import android.view.InputDevice
import android.view.MotionEvent
import android.view.View
import android.view.View.OnLayoutChangeListener
Expand Down Expand Up @@ -122,6 +123,22 @@ class LandscapeImmersiveController(
}
}

/**
* Observes mouse hover events to manage the top bar's auto-hide behavior.
* It pauses the auto-hide timer while the cursor is over the bar (or its buttons),
* and resumes it when the cursor leaves.
*/
private val topBarHoverObserver: (MotionEvent) -> Unit = { event ->
if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
when (event.actionMasked) {
MotionEvent.ACTION_HOVER_ENTER,
MotionEvent.ACTION_HOVER_MOVE -> onTopBarInteractionStarted()

MotionEvent.ACTION_HOVER_EXIT -> onTopBarInteractionEnded()
}
}
}

@SuppressLint("ClickableViewAccessibility")
fun bind() {
if (isBound) return
Expand All @@ -131,6 +148,7 @@ class LandscapeImmersiveController(
appBarContent.addOnLayoutChangeListener(appBarLayoutChangeListener)
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
appBarContent.onTouchEventObserved = topBarTouchObserver
appBarContent.onHoverEventObserved = topBarHoverObserver
}

fun onPause() {
Expand Down Expand Up @@ -166,6 +184,7 @@ class LandscapeImmersiveController(
appBarContent.removeOnLayoutChangeListener(appBarLayoutChangeListener)
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallback)
appBarContent.onTouchEventObserved = null
appBarContent.onHoverEventObserved = null
}

fun onConfigurationChanged(newConfig: Configuration) {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/layout-land/fragment_saved_projects.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
android:layout_height="wrap_content"
android:minWidth="0dp"
android:layout_marginEnd="2dp"
android:tooltipText="@string/exit"
android:text="@string/exit" />

<View
Expand All @@ -64,6 +65,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
android:tooltipText="@string/new_project"
android:text="@string/new_project" />
</LinearLayout>

Expand All @@ -72,6 +74,7 @@
style="@style/Widget.Material3.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tooltipText="@string/open_from_folder"
android:text="@string/open_from_folder" />
</LinearLayout>

Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/layout_project_filters_bar.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:tooltipText="@string/sort_projects_label"
app:icon="@drawable/ic_sort" />
</LinearLayout>
11 changes: 6 additions & 5 deletions app/src/main/res/layout/layout_project_filters_sheet.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/sort_toggle_btn"
style="@style/Widget.Material3.Button.OutlinedButton.Icon"
android:backgroundTint="@color/_blue_wave_light_colorPrimaryDark"
Comment thread
jatezzz marked this conversation as resolved.
style="@style/Widget.Material3.Button.IconButton.Filled"
android:layout_width="50dp"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:tooltipText="@string/toggle_sorting"
android:contentDescription="@string/toggle_sorting"
app:icon="@drawable/ic_arrow_up"
app:iconTint="@android:color/primary_text_dark" />
</LinearLayout>
Expand All @@ -67,13 +68,13 @@
android:layout_marginEnd="12dp"
android:visibility="gone"
android:text="@string/reset_sorting"
android:tooltipText="@string/reset_sorting"
app:iconTint="@color/white"
app:icon="@drawable/ic_close" />

<com.google.android.material.button.MaterialButton
android:id="@+id/apply_filters_btn"
style="@style/Widget.Material3.Button.TextButton.Dialog"
android:backgroundTint="@color/_blue_wave_light_colorPrimaryDark"
android:tooltipText="@string/apply_sorting"
android:textColor="@android:color/white"
android:layout_width="0dp"
android:layout_weight="1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import android.content.Context
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.util.TypedValue
import android.view.InputDevice
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.widget.ImageButton
import android.widget.LinearLayout
Expand Down Expand Up @@ -36,10 +38,14 @@ class ProjectActionsToolbar @JvmOverloads constructor(
hint: String,
onClick: () -> Unit,
onLongClick: () -> Unit,
onHover: ((View) -> Unit)? = null,
onHoverExit: (() -> Unit)? = null,
shouldAddMargin: Boolean
) {
val item = ImageButton(context).apply {
tooltipText = hint
if (onHover == null) {
tooltipText = hint
}
contentDescription = hint
setImageDrawable(icon)
addCircleRipple()
Expand All @@ -57,6 +63,24 @@ class ProjectActionsToolbar @JvmOverloads constructor(
onLongClick()
true
}
var hoverRunnable: Runnable? = null
setOnHoverListener { view, event ->
if (!event.isFromSource(InputDevice.SOURCE_MOUSE)) return@setOnHoverListener false

when (event.actionMasked) {
MotionEvent.ACTION_HOVER_ENTER -> {
hoverRunnable?.let { view.removeCallbacks(it) }
hoverRunnable = Runnable { onHover?.invoke(view) }
view.postDelayed(hoverRunnable, 600L)
}
MotionEvent.ACTION_HOVER_EXIT -> {
hoverRunnable?.let { view.removeCallbacks(it) }
onHoverExit?.invoke()
}
}

false
}
}
binding.menuContainer.addView(item)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,15 @@ class TouchObservingLinearLayout @JvmOverloads constructor(
) : LinearLayout(context, attrs) {

var onTouchEventObserved: ((MotionEvent) -> Unit)? = null
var onHoverEventObserved: ((MotionEvent) -> Unit)? = null

override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
onTouchEventObserved?.invoke(ev)
return super.dispatchTouchEvent(ev)
}

override fun dispatchHoverEvent(event: MotionEvent): Boolean {
onHoverEventObserved?.invoke(event)
return super.dispatchHoverEvent(event)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import java.io.File

object TooltipManager {
private const val TAG = "TooltipManager"
private var activePopupWindow: PopupWindow? = null
private val databaseTimestamp: Long = File(Environment.DOC_DB.absolutePath).lastModified()
private val debugDatabaseFile: File = File(android.os.Environment.getExternalStorageDirectory().toString() +
"/Download/documentation.db")
Expand Down Expand Up @@ -149,6 +150,11 @@ object TooltipManager {
}
}

fun dismissActiveTooltip() {
activePopupWindow?.dismiss()
activePopupWindow = null
}

// Displays a tooltip for category [TooltipCategory.CATEGORY_IDE] in a particular context
// (An Activity, Fragment, Dialog etc)
fun showIdeCategoryTooltip(context: Context, anchorView: View, tag: String) {
Expand Down Expand Up @@ -355,7 +361,16 @@ object TooltipManager {
popupWindow.setBackgroundDrawable(ColorDrawable(transparentColor))
popupView.setBackgroundResource(R.drawable.idetooltip_popup_background)

popupWindow.isFocusable = true
dismissActiveTooltip()

activePopupWindow = popupWindow
popupWindow.setOnDismissListener {
if (activePopupWindow === popupWindow) {
activePopupWindow = null
}
}

popupWindow.isFocusable = false
popupWindow.isOutsideTouchable = true
if (anchorView.isInOverlayWindow()) {
showOverlayTooltip(popupWindow, popupView, anchorView)
Expand Down
1 change: 1 addition & 0 deletions resources/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
<string name="save_and_close">Save files and close project</string>
<string name="search_projects_hint">Search projects by name…</string>
<string name="sort_projects_label">Sort projects</string>
<string name="toggle_sorting">Toggle sorting</string>
<string name="reset_sorting">Reset</string>
<string name="apply_sorting">Sort</string>
<string name="sort_by_hint">Sort by</string>
Expand Down
Loading