diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/ResourceCard.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/ResourceCard.kt
index 2db7eb367..5c30e6a41 100644
--- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/ResourceCard.kt
+++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/ResourceCard.kt
@@ -17,9 +17,19 @@
package com.google.samples.apps.nowinandroid.ui
import android.content.res.Configuration
-import androidx.compose.material.Surface
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Bookmark
+import androidx.compose.material.icons.filled.BookmarkBorder
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconToggleButton
+import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.semantics.onClick
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
+import com.google.samples.apps.nowinandroid.R
import com.google.samples.apps.nowinandroid.data.news.NewsResource
import com.google.samples.apps.nowinandroid.ui.theme.NiaTheme
@@ -28,6 +38,31 @@ import com.google.samples.apps.nowinandroid.ui.theme.NiaTheme
* For You, Episodes, Saved
*/
+@Composable
+fun BookmarkButton(
+ isBookmarked: Boolean,
+ onClick: () -> Unit,
+ modifier: Modifier = Modifier
+) {
+ val clickActionLabel = stringResource(
+ if (isBookmarked) R.string.unbookmark else R.string.bookmark
+ )
+ IconToggleButton(
+ checked = isBookmarked,
+ onCheckedChange = { onClick() },
+ modifier = modifier.semantics {
+ // Use custom label for accessibility services to communicate button's action to user.
+ // Pass null for action to only override the label and not the actual action.
+ this.onClick(label = clickActionLabel, action = null)
+ }
+ ) {
+ Icon(
+ imageVector = if (isBookmarked) Icons.Filled.Bookmark else Icons.Filled.BookmarkBorder,
+ contentDescription = null // handled by click label of parent
+ )
+ }
+}
+
@Composable
fun ResourceAuthors(
newsResource: NewsResource
@@ -82,6 +117,26 @@ fun ResourceCardExpanded() {
TODO()
}
+@Preview("Bookmark Button")
+@Composable
+fun BookmarkButtonPreview() {
+ NiaTheme {
+ Surface {
+ BookmarkButton(isBookmarked = false, onClick = { })
+ }
+ }
+}
+
+@Preview("Bookmark Button Bookmarked")
+@Composable
+fun BookmarkButtonBookmarkedPreview() {
+ NiaTheme {
+ Surface {
+ BookmarkButton(isBookmarked = true, onClick = { })
+ }
+ }
+}
+
@Preview("Expanded resource card")
@Preview("Expanded resource card (dark)", uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 18d8565b2..d4de7d616 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -21,4 +21,8 @@
Topics
Done
Loading for you…
+
+
+ Bookmark
+ Unbookmark