From b12b5c800f34cfc5a9eb513c43461ed719a8eafd Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 20 May 2024 01:36:26 +0530 Subject: [PATCH] feat(android): add share action --- CHANGELOG.md | 4 ++++ .../kotlin/dev/msfjarvis/claw/android/ui/ext.kt | 14 ++++++++++++++ .../claw/android/ui/lists/LobstersListItem.kt | 9 ++++++++- .../claw/android/ui/screens/LobstersPostsScreen.kt | 4 ++-- .../claw/android/ui/screens/SearchScreen.kt | 3 ++- .../msfjarvis/claw/common/posts/LobstersCard.kt | 2 ++ .../dev/msfjarvis/claw/common/posts/PostActions.kt | 2 ++ 7 files changed, 34 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 986f8763..2770cd6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Swiping a post from left to right now offers a share action + ## [1.47.0] - 2024-05-14 ### Changed diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt index a0355f13..3fa6f72c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/ext.kt @@ -8,6 +8,7 @@ package dev.msfjarvis.claw.android.ui import android.content.Context import android.content.ContextWrapper +import android.content.Intent import androidx.activity.ComponentActivity import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -29,6 +30,7 @@ fun Context.getActivity(): ComponentActivity? { @Composable fun rememberPostActions( + context: Context, urlLauncher: UrlLauncher, navController: NavController, viewModel: ClawViewModel, @@ -56,6 +58,18 @@ fun rememberPostActions( viewModel.toggleSave(post) } + override fun share(post: UIPost) { + val sendIntent: Intent = + Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, post.url.ifEmpty { post.commentsUrl }) + putExtra(Intent.EXTRA_TITLE, post.title) + type = "text/plain" + } + val shareIntent = Intent.createChooser(sendIntent, null) + context.startActivity(shareIntent) + } + override suspend fun getComments(postId: String): UIPost { return viewModel.getPostComments(postId) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt index eb217aec..7f16a856 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/LobstersListItem.kt @@ -8,6 +8,7 @@ package dev.msfjarvis.claw.android.ui.lists import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Reply +import androidx.compose.material.icons.filled.Share import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -31,7 +32,13 @@ fun LobstersListItem( background = MaterialTheme.colorScheme.tertiary, onSwipe = { postActions.viewCommentsPage(item) }, ) - SwipeableActionsBox(endActions = listOf(commentsAction)) { + val shareAction = + SwipeAction( + icon = rememberVectorPainter(Icons.Filled.Share), + background = MaterialTheme.colorScheme.tertiary, + onSwipe = { postActions.share(item) }, + ) + SwipeableActionsBox(startActions = listOf(shareAction), endActions = listOf(commentsAction)) { LobstersCard(post = item, postActions = postActions, refresh = refresh, modifier = modifier) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt index 09996875..89c81274 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt @@ -91,16 +91,16 @@ fun LobstersPostsScreen( modifier: Modifier = Modifier, viewModel: ClawViewModel = injectedViewModel(), ) { + val context = LocalContext.current val hottestListState = rememberLazyListState() val newestListState = rememberLazyListState() val savedListState = rememberLazyListState() val navController = rememberNavController() val coroutineScope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } - val postActions = rememberPostActions(urlLauncher, navController, viewModel) + val postActions = rememberPostActions(context, urlLauncher, navController, viewModel) val backStackEntry by navController.currentBackStackEntryAsState() val currentDestination = backStackEntry?.destination?.route - val context = LocalContext.current val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems() val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems() diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SearchScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SearchScreen.kt index dd1f4603..3a88dac1 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SearchScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SearchScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -35,7 +36,7 @@ fun SearchScreen( viewModel: ClawViewModel = injectedViewModel(), ) { val navController = rememberNavController() - val postActions = rememberPostActions(urlLauncher, navController, viewModel) + val postActions = rememberPostActions(LocalContext.current, urlLauncher, navController, viewModel) val listState = rememberLazyListState() Scaffold(modifier = modifier) { paddingValues -> NavHost( diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt index b66f5dd5..491854b3 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt @@ -265,6 +265,8 @@ val TEST_POST_ACTIONS = override fun toggleSave(post: UIPost) {} + override fun share(post: UIPost) {} + override suspend fun getComments(postId: String): UIPost { return UIPost( shortId = "ooga", diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt index ee036486..852321de 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt @@ -20,6 +20,8 @@ interface PostActions { fun toggleSave(post: UIPost) + fun share(post: UIPost) + suspend fun getComments(postId: String): UIPost suspend fun getLinkMetadata(url: String): LinkMetadata