🎯 Główna Idea

Moduł Clipboard upraszcza pracę ze schowkiem systemowym. Dodaje historię kopiowanych tekstów i callbacki na zmiany.

📝 Podstawowe użycie

// Kopiuj tekst
ADict.Clipboard.copy("Hello World")

// Kopiuj z Toast
ADict.Clipboard.copy("Skopiowano!", showToast = true)
ADict.Clipboard.copy("Link", showToast = true, toastMessage = "Link skopiowany")

// Wklej
val text = ADict.Clipboard.paste()

// Wklej lub domyślna wartość
val content = ADict.Clipboard.pasteOrDefault("Brak danych")

// Sprawdź zawartość
if (ADict.Clipboard.hasText()) {
    processClipboard()
}

if (ADict.Clipboard.isEmpty()) {
    showEmptyMessage()
}

📤 Kopiowanie

// Prosty tekst
ADict.Clipboard.copy("Tekst do skopiowania")

// Z własną etykietą (widoczna w niektórych managerach)
ADict.Clipboard.copy(
    text = "Sekretny kod",
    label = "Kod aktywacyjny"
)

// HTML
ADict.Clipboard.copyHtml(
    text = "Tekst fallback",
    html = "<b>Pogrubiony tekst</b>"
)

// URI
ADict.Clipboard.copyUri(Uri.parse("content://media/image/123"))

// Wyczyść schowek
ADict.Clipboard.clear()

📥 Wklejanie

// Zwykły tekst
val text: String? = ADict.Clipboard.paste()

// Z domyślną wartością
val content = ADict.Clipboard.pasteOrDefault("Pusty")

// HTML (jeśli dostępny)
val html: String? = ADict.Clipboard.pasteHtml()

// URI (jeśli dostępny)
val uri: Uri? = ADict.Clipboard.pasteUri()

// Sprawdź typ zawartości
when {
    ADict.Clipboard.hasHtml() -> {
        val html = ADict.Clipboard.pasteHtml()
        displayRichText(html)
    }
    ADict.Clipboard.hasUri() -> {
        val uri = ADict.Clipboard.pasteUri()
        handleUri(uri)
    }
    ADict.Clipboard.hasText() -> {
        val text = ADict.Clipboard.paste()
        displayText(text)
    }
    else -> {
        showEmpty()
    }
}

📚 Historia schowka

// Włącz historię (domyślnie wyłączona)
ADict.Clipboard.enableHistory(maxSize = 10)

// Pobierz historię (od najnowszego)
val history: List<Clipboard.ClipboardEntry> = ADict.Clipboard.getHistory()

history.forEach { entry ->
    println("${entry.text} - skopiowano ${entry.timestamp}")
}

// Pokaż w RecyclerView
historyAdapter.submitList(ADict.Clipboard.getHistory())

// Kopiuj z historii (0 = najnowszy)
button.setOnClickListener {
    ADict.Clipboard.copyFromHistory(index = 0, showToast = true)
}

// Wyczyść historię
ADict.Clipboard.clearHistory()

// Wyłącz historię
ADict.Clipboard.disableHistory()

👀 Obserwowanie zmian

// Callback
ADict.Clipboard.onClipboardChange { text ->
    Log.d("Clipboard", "Nowa zawartość: $text")
    updateUI(text)
}

// Flow (w ViewModel lub lifecycleScope)
lifecycleScope.launch {
    ADict.Clipboard.clipboardContent.collect { text ->
        textView.text = text ?: "Pusty schowek"
    }
}

// Usuń callback
val callback: (String?) -> Unit = { text -> handleChange(text) }
ADict.Clipboard.onClipboardChange(callback)
// ...później
ADict.Clipboard.removeClipboardChangeCallback(callback)

// Usuń wszystkie callbacki
ADict.Clipboard.clearCallbacks()

💡 Praktyczne zastosowania

// 1. Automatyczne wykrywanie linków w schowku
ADict.Clipboard.onClipboardChange { text ->
    text?.let {
        if (it.startsWith("http")) {
            showOpenLinkDialog(it)
        }
    }
}

// 2. Kopiowanie z przyciskiem
copyButton.setOnClickListener {
    ADict.Clipboard.copy(
        text = couponCode,
        showToast = true,
        toastMessage = "Kod promocyjny skopiowany!"
    )
}

// 3. Historia w Bottom Sheet
fun showClipboardHistory() {
    val history = ADict.Clipboard.getHistory()
    BottomSheetDialog(context).apply {
        // ... setup RecyclerView with history
        setOnItemClickListener { index ->
            ADict.Clipboard.copyFromHistory(index)
            dismiss()
        }
    }.show()
}