Skip to content

Commit dddf2b7

Browse files
committed
feature: add ClipboardProvider to about app
1 parent d1d1b55 commit dddf2b7

5 files changed

Lines changed: 31 additions & 18 deletions

File tree

plugins/plugin-about-app/src/main/kotlin/com/redmadrobot/debug/plugin/aboutapp/AboutAppPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class AboutAppPlugin(
1616
}
1717

1818
override fun getPluginContainer(commonContainer: CommonContainer): PluginDependencyContainer {
19-
return AboutAppPluginContainer(appInfoList = appInfoList)
19+
return AboutAppPluginContainer(appInfoList = appInfoList, commonContainer = commonContainer)
2020
}
2121

2222
override fun getName(): String = NAME
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.redmadrobot.debug.plugin.aboutapp
22

3+
import com.redmadrobot.debug.core.internal.CommonContainer
34
import com.redmadrobot.debug.core.internal.PluginDependencyContainer
45
import com.redmadrobot.debug.plugin.aboutapp.model.AboutAppInfo
56
import com.redmadrobot.debug.plugin.aboutapp.ui.AboutAppViewModel
7+
import com.redmadrobot.debug.plugin.aboutapp.utils.ClipboardProvider
68

79
internal class AboutAppPluginContainer(
8-
private val appInfoList: List<AboutAppInfo>
10+
private val appInfoList: List<AboutAppInfo>,
11+
private val commonContainer: CommonContainer
912
) : PluginDependencyContainer {
1013
fun createAboutAppViewModel(): AboutAppViewModel {
11-
return AboutAppViewModel(appInfoList = appInfoList)
14+
val clipboardProvider = ClipboardProvider(context = commonContainer.context)
15+
16+
return AboutAppViewModel(appInfoList = appInfoList, clipboardProvider = clipboardProvider)
1217
}
1318
}

plugins/plugin-about-app/src/main/kotlin/com/redmadrobot/debug/plugin/aboutapp/ui/AboutAppScreen.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.redmadrobot.debug.plugin.aboutapp.ui
22

3-
import android.content.ClipData
43
import androidx.compose.foundation.clickable
54
import androidx.compose.foundation.layout.Arrangement
65
import androidx.compose.foundation.layout.PaddingValues
@@ -23,9 +22,6 @@ import androidx.compose.runtime.remember
2322
import androidx.compose.ui.Alignment
2423
import androidx.compose.ui.Modifier
2524
import androidx.compose.ui.draw.clip
26-
import androidx.compose.ui.platform.ClipEntry
27-
import androidx.compose.ui.platform.Clipboard
28-
import androidx.compose.ui.platform.LocalClipboard
2925
import androidx.compose.ui.res.stringResource
3026
import androidx.compose.ui.text.style.TextOverflow
3127
import androidx.compose.ui.unit.dp
@@ -34,7 +30,6 @@ import com.redmadrobot.debug.core.extension.provideViewModel
3430
import com.redmadrobot.debug.plugin.aboutapp.AboutAppPlugin
3531
import com.redmadrobot.debug.plugin.aboutapp.AboutAppPluginContainer
3632
import com.redmadrobot.debug.plugin.aboutapp.R
37-
import com.redmadrobot.debug.plugin.aboutapp.model.AboutAppInfo
3833
import com.redmadrobot.debug.uikit.theme.DebugPanelShapes
3934
import com.redmadrobot.debug.uikit.theme.DebugPanelTheme
4035

@@ -47,13 +42,10 @@ internal fun AboutAppScreen(
4742
},
4843
) {
4944
val snackbarHostState = remember { SnackbarHostState() }
50-
5145
val state by viewModel.state.collectAsState()
52-
val clipboard = LocalClipboard.current
5346

5447
LaunchedEffect(Unit) {
5548
viewModel.events.collect { event ->
56-
copyToClipboard(clipboard = clipboard, item = event.item)
5749
val message = event.message.format(event.item.title)
5850
snackbarHostState.showSnackbar(message = message)
5951
}
@@ -120,9 +112,3 @@ private fun InfoRow(
120112
)
121113
}
122114
}
123-
124-
private suspend fun copyToClipboard(clipboard: Clipboard, item: AboutAppInfo) {
125-
val clipData = ClipData.newPlainText(item.title, item.value)
126-
127-
clipboard.setClipEntry(clipEntry = ClipEntry(clipData))
128-
}

plugins/plugin-about-app/src/main/kotlin/com/redmadrobot/debug/plugin/aboutapp/ui/AboutAppViewModel.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.lifecycle.viewModelScope
44
import com.redmadrobot.debug.core.DebugEvent
55
import com.redmadrobot.debug.core.internal.PluginViewModel
66
import com.redmadrobot.debug.plugin.aboutapp.model.AboutAppInfo
7+
import com.redmadrobot.debug.plugin.aboutapp.utils.ClipboardProvider
78
import kotlinx.coroutines.flow.MutableSharedFlow
89
import kotlinx.coroutines.flow.MutableStateFlow
910
import kotlinx.coroutines.flow.StateFlow
@@ -12,14 +13,18 @@ import kotlinx.coroutines.flow.asStateFlow
1213
import kotlinx.coroutines.flow.distinctUntilChanged
1314
import kotlinx.coroutines.launch
1415

15-
internal class AboutAppViewModel(appInfoList: List<AboutAppInfo>) : PluginViewModel() {
16+
internal class AboutAppViewModel(
17+
appInfoList: List<AboutAppInfo>,
18+
private val clipboardProvider: ClipboardProvider,
19+
) : PluginViewModel() {
1620
private val _state = MutableStateFlow(value = AboutAppViewState(appInfoList = appInfoList))
1721
val state: StateFlow<AboutAppViewState> = _state.asStateFlow()
1822

1923
private val _events = MutableSharedFlow<AppInfoSelectionEvent>()
2024
val events = _events.asSharedFlow().distinctUntilChanged()
2125

2226
fun onInfoItemClicked(message: String, item: AboutAppInfo) {
27+
clipboardProvider.copyToClipboard(label = item.title, text = item.value)
2328
viewModelScope.launch {
2429
_events.emit(AppInfoSelectionEvent(message = message, item = item))
2530
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.redmadrobot.debug.plugin.aboutapp.utils
2+
3+
import android.content.ClipData
4+
import android.content.ClipboardManager
5+
import android.content.Context
6+
7+
internal class ClipboardProvider(private val context: Context) {
8+
private val clipboardManager: ClipboardManager by lazy {
9+
context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
10+
}
11+
12+
fun copyToClipboard(label: String, text: String) {
13+
val clipData = ClipData.newPlainText(label, text)
14+
15+
clipboardManager.setPrimaryClip(clipData)
16+
}
17+
}

0 commit comments

Comments
 (0)