Skip to content

Commit 4bfecde

Browse files
committed
feat(details): implement repository sharing and refactor utility packages
This commit introduces a sharing feature to the repository details screen, allowing users to share app links. It also cleans up the codebase by removing the experimental `trackExistingApp` logic and reorganizing desktop utility classes. - **feat(details)**: Added `OnShareClick` action and integrated `ShareManager` to generate and share repository links. - **feat(core)**: Introduced `ShareManager` interface in the domain layer with platform-specific implementations: `AndroidShareManager` (using `Intent.ACTION_SEND`) and `DesktopShareManager` (copying to clipboard). - **refactor(details)**: Removed the unused and complex `trackExistingApp` method and `TrackExistingApp` action from `DetailsViewModel`. - **refactor(core)**: Moved desktop utility classes (`DesktopAppLauncher`, `DesktopBrowserHelper`, `DesktopClipboardHelper`) from `services` to the `utils` package for consistency across platforms. - **ui(details)**: Added a share icon button to the top app bar in `DetailsRoot`. - **chore**: Updated DI modules for Android and JVM to include the new `ShareManager` and reflect package moves.
1 parent 796e9cb commit 4bfecde

11 files changed

Lines changed: 85 additions & 135 deletions

File tree

core/data/src/androidMain/kotlin/zed/rainxch/core/data/di/PlatformModule.android.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ import zed.rainxch.core.data.services.LocalizationManager
1919
import zed.rainxch.core.data.utils.AndroidAppLauncher
2020
import zed.rainxch.core.data.utils.AndroidBrowserHelper
2121
import zed.rainxch.core.data.utils.AndroidClipboardHelper
22+
import zed.rainxch.core.data.utils.AndroidShareManager
2223
import zed.rainxch.core.domain.network.Downloader
2324
import zed.rainxch.core.domain.system.PackageMonitor
2425
import zed.rainxch.core.domain.utils.AppLauncher
2526
import zed.rainxch.core.domain.utils.BrowserHelper
2627
import zed.rainxch.core.domain.utils.ClipboardHelper
28+
import zed.rainxch.core.domain.utils.ShareManager
2729

2830
actual val corePlatformModule = module {
2931
// Core
@@ -82,4 +84,10 @@ actual val corePlatformModule = module {
8284
)
8385
}
8486

87+
single<ShareManager> {
88+
AndroidShareManager(
89+
context = androidContext()
90+
)
91+
}
92+
8593
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package zed.rainxch.core.data.utils
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import zed.rainxch.core.domain.utils.ShareManager
6+
7+
class AndroidShareManager (
8+
private val context: Context,
9+
) : ShareManager {
10+
override fun shareText(text: String) {
11+
val intent = Intent(Intent.ACTION_SEND).apply {
12+
type = "text/plain"
13+
putExtra(Intent.EXTRA_TEXT, text)
14+
}
15+
16+
val chooser = Intent.createChooser(intent, null).apply {
17+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
18+
}
19+
20+
context.startActivity(chooser)
21+
}
22+
23+
}

core/data/src/jvmMain/kotlin/zed/rainxch/core/data/di/PlatformModule.jvm.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import zed.rainxch.core.data.local.data_store.createDataStore
77
import zed.rainxch.core.data.local.db.AppDatabase
88
import zed.rainxch.core.data.local.db.initDatabase
99
import zed.rainxch.core.data.services.DesktopInstallerInfoExtractor
10-
import zed.rainxch.core.data.services.DesktopAppLauncher
11-
import zed.rainxch.core.data.services.DesktopBrowserHelper
12-
import zed.rainxch.core.data.services.DesktopClipboardHelper
10+
import zed.rainxch.core.data.utils.DesktopAppLauncher
11+
import zed.rainxch.core.data.utils.DesktopBrowserHelper
12+
import zed.rainxch.core.data.utils.DesktopClipboardHelper
1313
import zed.rainxch.core.data.services.DesktopDownloader
1414
import zed.rainxch.core.data.services.DesktopFileLocationsProvider
1515
import zed.rainxch.core.data.services.DesktopInstaller
@@ -18,11 +18,13 @@ import zed.rainxch.core.data.services.DesktopPackageMonitor
1818
import zed.rainxch.core.data.services.FileLocationsProvider
1919
import zed.rainxch.core.domain.system.Installer
2020
import zed.rainxch.core.data.services.LocalizationManager
21+
import zed.rainxch.core.data.utils.DesktopShareManager
2122
import zed.rainxch.core.domain.network.Downloader
2223
import zed.rainxch.core.domain.system.PackageMonitor
2324
import zed.rainxch.core.domain.utils.AppLauncher
2425
import zed.rainxch.core.domain.utils.BrowserHelper
2526
import zed.rainxch.core.domain.utils.ClipboardHelper
27+
import zed.rainxch.core.domain.utils.ShareManager
2628

2729
actual val corePlatformModule = module {
2830
// Core
@@ -81,4 +83,8 @@ actual val corePlatformModule = module {
8183
platform = get()
8284
)
8385
}
86+
87+
single<ShareManager> {
88+
DesktopShareManager()
89+
}
8490
}

core/data/src/jvmMain/kotlin/zed/rainxch/core/data/services/DesktopAppLauncher.kt renamed to core/data/src/jvmMain/kotlin/zed/rainxch/core/data/utils/DesktopAppLauncher.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package zed.rainxch.core.data.services
1+
package zed.rainxch.core.data.utils
22

33
import kotlinx.coroutines.Dispatchers
44
import kotlinx.coroutines.withContext

core/data/src/jvmMain/kotlin/zed/rainxch/core/data/services/DesktopBrowserHelper.kt renamed to core/data/src/jvmMain/kotlin/zed/rainxch/core/data/utils/DesktopBrowserHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package zed.rainxch.core.data.services
1+
package zed.rainxch.core.data.utils
22

33
import zed.rainxch.core.domain.utils.BrowserHelper
44
import java.awt.Desktop

core/data/src/jvmMain/kotlin/zed/rainxch/core/data/services/DesktopClipboardHelper.kt renamed to core/data/src/jvmMain/kotlin/zed/rainxch/core/data/utils/DesktopClipboardHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package zed.rainxch.core.data.services
1+
package zed.rainxch.core.data.utils
22

33
import zed.rainxch.core.domain.utils.ClipboardHelper
44
import java.awt.Toolkit
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package zed.rainxch.core.data.utils
2+
3+
import zed.rainxch.core.domain.utils.ShareManager
4+
import java.awt.Toolkit
5+
import java.awt.datatransfer.StringSelection
6+
7+
class DesktopShareManager : ShareManager {
8+
override fun shareText(text: String) {
9+
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
10+
val selection = StringSelection(text)
11+
clipboard.setContents(selection, null)
12+
}
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package zed.rainxch.core.domain.utils
2+
3+
interface ShareManager {
4+
fun shareText(text: String)
5+
}

feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsAction.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,10 @@ sealed interface DetailsAction {
2424
data object OpenInAppManager : DetailsAction
2525
data object OnToggleInstallDropdown : DetailsAction
2626

27-
data object TrackExistingApp : DetailsAction
28-
2927
data object OnNavigateBackClick : DetailsAction
3028

3129
data object OnToggleFavorite : DetailsAction
32-
data object CheckForUpdates : DetailsAction
30+
data object OnShareClick : DetailsAction
3331
data object UpdateApp : DetailsAction
3432
data object OpenApp : DetailsAction
3533

feature/details/presentation/src/commonMain/kotlin/zed/rainxch/details/presentation/DetailsRoot.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
1919
import androidx.compose.material.icons.filled.Favorite
2020
import androidx.compose.material.icons.filled.FavoriteBorder
2121
import androidx.compose.material.icons.filled.OpenInBrowser
22+
import androidx.compose.material.icons.filled.Share
2223
import androidx.compose.material.icons.filled.Star
2324
import androidx.compose.material.icons.filled.StarBorder
2425
import androidx.compose.material3.AlertDialog
@@ -334,9 +335,7 @@ private fun DetailsTopbar(
334335
),
335336
)
336337
}
337-
}
338338

339-
if (state.repository != null) {
340339
IconButton(
341340
onClick = {
342341
onAction(DetailsAction.OnToggleFavorite)
@@ -359,6 +358,21 @@ private fun DetailsTopbar(
359358
),
360359
)
361360
}
361+
362+
IconButton(
363+
onClick = {
364+
onAction(DetailsAction.OnShareClick)
365+
},
366+
shapes = IconButtonDefaults.shapes(),
367+
colors = IconButtonDefaults.iconButtonColors(
368+
contentColor = MaterialTheme.colorScheme.onSurface
369+
)
370+
) {
371+
Icon(
372+
imageVector = Icons.Default.Share,
373+
contentDescription = null,
374+
)
375+
}
362376
}
363377

364378
state.repository?.htmlUrl?.let {

0 commit comments

Comments
 (0)