Skip to content

Commit cca5148

Browse files
committed
Refactor link processing to remove ViewModel. Fix: #14
1 parent 33b8ace commit cca5148

7 files changed

Lines changed: 76 additions & 156 deletions

File tree

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,4 @@ android {
3434

3535
dependencies {
3636
implementation(libs.androidx.appcompat)
37-
implementation(libs.androidx.fragment)
3837
}

app/src/main/java/com/wstxda/clippy/activity/ClipboardLinkActivity.kt

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,64 @@ import android.os.Bundle
66
import android.widget.Toast
77
import androidx.appcompat.app.AppCompatActivity
88
import androidx.core.content.getSystemService
9-
import androidx.lifecycle.Lifecycle
109
import androidx.lifecycle.lifecycleScope
11-
import androidx.lifecycle.repeatOnLifecycle
1210
import com.wstxda.clippy.R
13-
import com.wstxda.clippy.cleaner.modules.utils.ClipboardLinkState
11+
import com.wstxda.clippy.cleaner.processor.LinkProcessor
1412
import com.wstxda.clippy.activity.utils.getSharedLink
15-
import com.wstxda.clippy.viewmodel.ClipboardLinkViewModel
13+
import kotlinx.coroutines.Dispatchers
14+
import kotlinx.coroutines.withContext
1615
import kotlinx.coroutines.launch
1716

1817
abstract class ClipboardLinkActivity : AppCompatActivity() {
1918

20-
abstract val viewModel: ClipboardLinkViewModel
19+
protected abstract val cleanLinks: Boolean
2120

2221
override fun onCreate(savedInstanceState: Bundle?) {
2322
super.onCreate(savedInstanceState)
24-
observeState()
25-
intent.getSharedLink()?.let { sharedLink ->
26-
onLinkReceived(sharedLink)
27-
} ?: handleFailure()
28-
}
2923

30-
private fun observeState() {
24+
val shared = intent.getSharedLink()
25+
if (shared.isNullOrBlank()) {
26+
finishWithToast(getString(R.string.copy_failure))
27+
return
28+
}
29+
3130
lifecycleScope.launch {
32-
repeatOnLifecycle(Lifecycle.State.STARTED) {
33-
viewModel.state.collect { state ->
34-
when (state) {
35-
is ClipboardLinkState.Loading -> showToast(getString(R.string.copy_process))
36-
is ClipboardLinkState.Success -> handleSuccess(state.links.joinToString("\n"))
37-
is ClipboardLinkState.Error -> handleFailure(state.message)
38-
else -> Unit
39-
}
40-
}
31+
val (valids, invalids) = LinkProcessor.extractAndValidateLinks(shared)
32+
if (valids.isEmpty()) {
33+
if (invalids.isNotEmpty()) LinkProcessor.logInvalids(invalids)
34+
finishWithToast(getString(R.string.copy_failure_no_valid_links))
35+
return@launch
4136
}
42-
}
43-
}
4437

45-
protected open fun handleFailure(message: String = getString(R.string.copy_failure)) {
46-
showToast(message)
47-
finish()
48-
}
38+
val output = if (cleanLinks) {
39+
showToast(getString(R.string.copy_process))
40+
val cleaned = withContext(Dispatchers.IO) { LinkProcessor.cleanLinks(valids) }
41+
if (cleaned.isEmpty()) {
42+
finishWithToast(getString(R.string.copy_failure_empty_after_cleaning))
43+
return@launch
44+
}
45+
cleaned
46+
} else {
47+
valids
48+
}
4949

50-
protected open fun handleSuccess(link: CharSequence) {
51-
copyLinkToClipboard(link)
52-
showToast(getString(R.string.copy_success))
53-
finish()
50+
copyToClipboard(output.joinToString("\n"))
51+
showToast(getString(R.string.copy_success))
52+
finish()
53+
}
5454
}
5555

56-
private fun copyLinkToClipboard(link: CharSequence) {
57-
getSystemService<ClipboardManager>()?.setPrimaryClip(
58-
ClipData.newPlainText("link", link)
59-
) ?: showToast(getString(R.string.copy_failure))
56+
private fun copyToClipboard(text: String) {
57+
getSystemService<ClipboardManager>()?.setPrimaryClip(ClipData.newPlainText("link", text))
58+
?: showToast(getString(R.string.copy_failure))
6059
}
6160

62-
private fun showToast(message: String) {
63-
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
61+
protected fun showToast(msg: String) {
62+
Toast.makeText(applicationContext, msg, Toast.LENGTH_SHORT).show()
6463
}
6564

66-
protected open fun onLinkReceived(sharedLink: String) {
67-
viewModel.processSharedLinks(sharedLink)
65+
private fun finishWithToast(msg: String) {
66+
showToast(msg)
67+
finish()
6868
}
6969
}
Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package com.wstxda.clippy.activity.copy
22

3-
import androidx.activity.viewModels
43
import com.wstxda.clippy.activity.ClipboardLinkActivity
5-
import com.wstxda.clippy.viewmodel.ClipboardLinkViewModel
64

75
class CopyLinkActivity : ClipboardLinkActivity() {
8-
override val viewModel: ClipboardLinkViewModel by viewModels()
9-
10-
override fun onLinkReceived(sharedLink: String) {
11-
viewModel.processSharedLinks(sharedLink, cleanLinks = false)
12-
}
6+
override val cleanLinks: Boolean = false
137
}
Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package com.wstxda.clippy.activity.copy
22

3-
import androidx.activity.viewModels
43
import com.wstxda.clippy.activity.ClipboardLinkActivity
5-
import com.wstxda.clippy.viewmodel.ClipboardLinkViewModel
64

75
class CopyLinkCleanerActivity : ClipboardLinkActivity() {
8-
override val viewModel: ClipboardLinkViewModel by viewModels()
9-
10-
override fun onLinkReceived(sharedLink: String) {
11-
viewModel.processSharedLinks(sharedLink, cleanLinks = true)
12-
}
6+
override val cleanLinks: Boolean = true
137
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.wstxda.clippy.cleaner.processor
2+
3+
import android.util.Log
4+
import com.wstxda.clippy.cleaner.modules.utils.ValidationResult
5+
import com.wstxda.clippy.cleaner.tools.TextCleaner
6+
import com.wstxda.clippy.cleaner.tools.UrlCleaner
7+
import com.wstxda.clippy.cleaner.tools.UrlValidator
8+
import com.wstxda.clippy.utils.Constants
9+
10+
object LinkProcessor {
11+
12+
fun extractAndValidateLinks(input: String): Pair<List<String>, List<Pair<String, ValidationResult.Invalid>>> {
13+
val tokens = input.split("\\s+".toRegex())
14+
val valids = mutableListOf<String>()
15+
val invalids = mutableListOf<Pair<String, ValidationResult.Invalid>>()
16+
17+
for (token in tokens) {
18+
TextCleaner.extractUrl(token)?.let { url ->
19+
when (val result = UrlValidator.validate(url)) {
20+
is ValidationResult.Valid -> valids += url
21+
is ValidationResult.Invalid -> invalids += url to result
22+
}
23+
}
24+
}
25+
return valids to invalids
26+
}
27+
28+
suspend fun cleanLinks(urls: List<String>): List<String> =
29+
urls.map { UrlCleaner.startUrlCleanerModules(it) }.filter { it.isNotBlank() }
30+
31+
fun logInvalids(invalids: List<Pair<String, ValidationResult.Invalid>>) {
32+
invalids.forEach { (url, res) ->
33+
Log.w(Constants.CLIPBOARD_LINK_VIEW_MODEL, "URL inválida: '$url' (${res.reason})")
34+
}
35+
}
36+
}

app/src/main/java/com/wstxda/clippy/viewmodel/ClipboardLinkViewModel.kt

Lines changed: 0 additions & 101 deletions
This file was deleted.

gradle/libs.versions.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
agp = "8.10.1"
33
kotlin = "2.1.20"
44
appcompat = "1.7.1"
5-
fragment = "1.8.8"
65

76
[libraries]
87
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
9-
androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" }
108

119
[plugins]
1210
android-application = { id = "com.android.application", version.ref = "agp" }

0 commit comments

Comments
 (0)