Skip to content

Commit

Permalink
feat: add image to notification screen
Browse files Browse the repository at this point in the history
  • Loading branch information
aleixo-dev committed Oct 30, 2024
1 parent 74cc1a0 commit 5d33c25
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ class AndroidDownloader(context: Context) : Downloader {

private val downloadManager = context.getSystemService(DownloadManager::class.java)

override fun downloadFile(url: String, title: String): Long {
override fun downloadFile(url: String, title: String, description: String): Long {
val request = DownloadManager.Request(url.toUri())
.setMimeType("image/jpeg")
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI)
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE)
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setTitle(title)
.setDescription(description)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "image.jpeg")

return downloadManager.enqueue(request)
Expand Down
17 changes: 12 additions & 5 deletions app/src/main/java/com/nicolas/picstream/ui/home/HomeRoute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,18 @@ fun HomeRoute(
onNavigateNotifications()
viewModel.readAllDownloadNotification()
},
onDownloadImage = {
onDownloadImage = { notificationsParams ->
viewModel.saveDownloadNotification(
title = context.getString(R.string.local_notification),
photoDescription = it
title = context.getString(
R.string.local_notification,
notificationsParams.description
),
description = notificationsParams.description,
date = notificationsParams.date,
username = notificationsParams.username,
url = notificationsParams.url
)
viewModel.getDownloadUrl(notificationsParams.id.toString())
},
popUpNotification = popUpNotification
)
Expand All @@ -124,7 +131,7 @@ fun HomeScreen(
hideKeyboard: Boolean,
onNavigateOptions: () -> Unit,
onNavigateNotifications: () -> Unit,
onDownloadImage: (String) -> Unit,
onDownloadImage: (notificationParams: NotificationParams) -> Unit,
popUpNotification: Boolean
) {

Expand Down Expand Up @@ -184,7 +191,7 @@ fun SectionDefaultPhoto(
hideKeyboard: Boolean,
onNavigateOptions: () -> Unit,
onNavigateNotifications: () -> Unit,
onDownloadImage: (String) -> Unit,
onDownloadImage: (notificationParams: NotificationParams) -> Unit,
popUpNotification: Boolean
) {

Expand Down
16 changes: 11 additions & 5 deletions app/src/main/java/com/nicolas/picstream/ui/home/HomeViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import com.nicolas.picstream.data.model.Notification
import com.nicolas.picstream.data.model.Photo
import com.nicolas.picstream.data.model.Topic
import com.nicolas.picstream.data.repository.PhotoRepository
import com.nicolas.picstream.utils.toCurrentDate
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
Expand All @@ -26,7 +25,6 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import java.util.Date

class HomeViewModel(
private val photoRepository: PhotoRepository,
Expand Down Expand Up @@ -106,18 +104,26 @@ class HomeViewModel(
_photoInputQuery.value = input
}

fun saveDownloadNotification(title: String, photoDescription: String) = viewModelScope.launch {
fun saveDownloadNotification(
title: String, description: String, date: String, username: String, url: String
) = viewModelScope.launch {
val isDownloadNotificationSave = photoRepository.saveDownloadNotification(
Notification(
title = title,
description = photoDescription,
date = Date().toCurrentDate()
description = description,
date = date,
username = username,
url = url
)
)

_isDownloadNotification.update { isDownloadNotificationSave != -1L }
}

fun getDownloadUrl(photoId: String) = viewModelScope.launch {
photoRepository.getDownloadUrl(photoId)
}

fun readAllDownloadNotification() = viewModelScope.launch {
_isDownloadNotification.update { false }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
Expand All @@ -13,17 +14,25 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBackIosNew
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.nicolas.picstream.R
import coil.compose.AsyncImagePainter
import coil.compose.SubcomposeAsyncImage
import coil.compose.SubcomposeAsyncImageContent
import coil.request.CachePolicy
import coil.request.ImageRequest
import com.nicolas.picstream.data.model.Notification
import org.koin.androidx.compose.koinViewModel

Expand Down Expand Up @@ -87,12 +96,34 @@ fun NotificationScreen(
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(notifications) { notification ->
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
modifier = Modifier.size(50.dp),
painter = painterResource(R.drawable.ic_launcher_foreground),
contentDescription = null
)
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
SubcomposeAsyncImage(
modifier = Modifier
.size(70.dp)
.clip(MaterialTheme.shapes.medium),
model = ImageRequest.Builder(LocalContext.current)
.data(notification.url)
.crossfade(true)
.diskCachePolicy(CachePolicy.ENABLED)
.memoryCachePolicy(CachePolicy.ENABLED)
.build(),
contentDescription = null,
contentScale = ContentScale.Crop,
) {
val state = painter.state
if (state is AsyncImagePainter.State.Loading || state is AsyncImagePainter.State.Error) {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxSize()
) {
CircularProgressIndicator(modifier = Modifier.size(10.dp))
}
} else SubcomposeAsyncImageContent()
}
Column(modifier = Modifier.weight(1f)) {
Row(
modifier = Modifier.fillMaxWidth(),
Expand All @@ -112,10 +143,15 @@ fun NotificationScreen(
notification.title, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface
)
Text(
"Photo by: ${notification.username}",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface,
fontWeight = FontWeight.Medium
)
}
}
}

}
}
}

0 comments on commit 5d33c25

Please sign in to comment.