diff --git a/app/src/main/java/com/urik/keyboard/UrikInputMethodService.kt b/app/src/main/java/com/urik/keyboard/UrikInputMethodService.kt index eef42b8..91c6589 100644 --- a/app/src/main/java/com/urik/keyboard/UrikInputMethodService.kt +++ b/app/src/main/java/com/urik/keyboard/UrikInputMethodService.kt @@ -680,6 +680,9 @@ class UrikInputMethodService : }, onDeleteAll = { handleClipboardDeleteAll() + }, + onClose = { + dismissClipboardPanel() } ) } diff --git a/app/src/main/java/com/urik/keyboard/ui/keyboard/components/ClipboardPanel.kt b/app/src/main/java/com/urik/keyboard/ui/keyboard/components/ClipboardPanel.kt index 43cb53d..c182cc0 100644 --- a/app/src/main/java/com/urik/keyboard/ui/keyboard/components/ClipboardPanel.kt +++ b/app/src/main/java/com/urik/keyboard/ui/keyboard/components/ClipboardPanel.kt @@ -2,6 +2,7 @@ package com.urik.keyboard.ui.keyboard.components import android.content.Context import android.graphics.drawable.GradientDrawable +import android.util.TypedValue import android.view.Gravity import android.view.View import android.widget.Button @@ -29,6 +30,8 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : private var onItemDeleted: ((ClipboardItem) -> Unit)? = null private var onDeleteAllUnpinned: (() -> Unit)? = null + private var onClose: (() -> Unit)? = null + private val transientOverlayA11yDelegate = object : AccessibilityDelegateCompat() { override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) { @@ -73,6 +76,8 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : private val pinnedTab: Button private val recentTab: Button + private val closeButton: TextView + private val pinnedListContainer: ScrollView = ScrollView(context).apply { isVisible = false @@ -169,9 +174,27 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : 1f ) } + val emojiTextSize = calculateResponsiveSuggestionTextSize() + val minTouchTarget = context.resources.getDimensionPixelSize(R.dimen.minimum_touch_target) + closeButton = + TextView(context).apply { + text = "✕" + setTextSize(TypedValue.COMPLEX_UNIT_SP, emojiTextSize) + gravity = Gravity.CENTER + contentDescription = context.getString(R.string.clipboard_panel_close) + setOnClickListener { + onClose?.invoke() + } + layoutParams = + LinearLayout.LayoutParams( + minTouchTarget, + minTouchTarget + ) + } tabContainer.addView(pinnedTab) tabContainer.addView(recentTab) + tabContainer.addView(closeButton) pinnedListContainer.addView(pinnedList) recentListContainer.addView(recentList) @@ -227,6 +250,16 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : } } + // took from SwipeKeyboardView + private fun calculateResponsiveSuggestionTextSize(): Float { + val keyHeight = context.resources.getDimensionPixelSize(R.dimen.key_height) + val baseTextSize = keyHeight * 0.40f / context.resources.displayMetrics.density + val minSize = 15f + val maxSize = 19f + + return baseTextSize.coerceIn(minSize, maxSize) + } + private fun createButtonBackground(): GradientDrawable { val density = context.resources.displayMetrics.density val cornerRadius = 8 * density @@ -277,12 +310,14 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : onItemClick: (String) -> Unit, onPinToggle: (ClipboardItem) -> Unit, onDelete: (ClipboardItem) -> Unit, - onDeleteAll: () -> Unit + onDeleteAll: () -> Unit, + onClose: () -> Unit ) { this.onItemSelected = onItemClick this.onItemPinToggled = onPinToggle this.onItemDeleted = onDelete this.onDeleteAllUnpinned = onDeleteAll + this.onClose = onClose consentScreen.isVisible = false clipboardContentScreen.isVisible = true @@ -509,6 +544,14 @@ class ClipboardPanel(context: Context, private val themeManager: ThemeManager) : onItemDeleted?.invoke(item) } } + + closeButton.apply { + setTextColor(themeManager.currentTheme.value.colors.keyTextAction) + contentDescription = context.getString(R.string.clipboard_panel_close) + setOnClickListener { + onClose?.invoke() + } + } } private fun showDeleteAllConfirmation() { diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6c46a0e..75c2df0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -296,7 +296,7 @@ Supprimer tous les éléments non épinglés du presse-papiers ? Urik peut lire et stocker indéfiniment le contenu du presse-papiers. Si vous ne le souhaitez pas, rendez-vous dans les paramètres et désactivez l\'historique du presse-papiers. Fermer le presse-papier - + Élément du presse-papiers : %1$s Épingler l\'élément du presse-papiers