Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import com.example.notimanager.data.model.NotificationModel
import com.example.notimanager.data.repository.NotificationRepository
import com.example.notimanager.data.service.NotiListenerService
import com.example.notimanager.data.utils.NameGetter
import com.example.notimanager.data.utils.PendingIntentHelper
import com.example.notimanager.data.utils.IntentHelper
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
Expand All @@ -41,13 +41,13 @@ class NotiListenerServiceTest {
notiListenerService = NotiListenerService()
notiListenerService.notificationRepository = notificationRepository
mockkObject(NameGetter)
mockkObject(PendingIntentHelper)
mockkObject(IntentHelper)
}

@After
fun tearDown() {
unmockkObject(NameGetter)
unmockkObject(PendingIntentHelper)
unmockkObject(IntentHelper)
}

@Test
Expand Down Expand Up @@ -85,7 +85,7 @@ class NotiListenerServiceTest {

// Mock the PendingIntentHelper
val intentArray = "MockedByteArray".toByteArray()
every { PendingIntentHelper.savePendingIntent(mockPendingIntent) } returns intentArray
every { IntentHelper.saveIntent(mockPendingIntent) } returns intentArray

val expectedNotificationModel = NotificationModel(
appName = "Test App",
Expand Down Expand Up @@ -123,6 +123,6 @@ class NotiListenerServiceTest {
coVerify { notificationRepository.insertAppIcon(appIconModel) }

// Verify that PendingIntentHelper was called
verify { PendingIntentHelper.savePendingIntent(mockPendingIntent) }
verify { IntentHelper.saveIntent(mockPendingIntent) }
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,27 @@ import android.graphics.drawable.Drawable
import android.icu.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.concurrent.TimeUnit

object DateFormatter {
fun formatTimestamp(timestamp: Long): String {
val date = Date(timestamp)
fun formatTimestamp(timestamp: Long, format: String = "relative"): String {
return if (format == "relative") {
val currentTime = System.currentTimeMillis()
val timeDifference = currentTime - timestamp

val formatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
return formatter.format(date)
return when {
timeDifference < TimeUnit.SECONDS.toMillis(1) -> "방금"
timeDifference < TimeUnit.MINUTES.toMillis(1) -> "${timeDifference / 1000}초 전"
timeDifference < TimeUnit.HOURS.toMillis(1) -> "${timeDifference / TimeUnit.MINUTES.toMillis(1)}분 전"
timeDifference < TimeUnit.DAYS.toMillis(1) -> "${timeDifference / TimeUnit.HOURS.toMillis(1)}시간 전"
timeDifference < TimeUnit.DAYS.toMillis(7) -> "${timeDifference / TimeUnit.DAYS.toMillis(1)}일 전"
timeDifference < TimeUnit.DAYS.toMillis(30) -> "${timeDifference / TimeUnit.DAYS.toMillis(7)}주 전"
timeDifference < TimeUnit.DAYS.toMillis(365) -> "${timeDifference / TimeUnit.DAYS.toMillis(30)}달 전"
else -> "${timeDifference / TimeUnit.DAYS.toMillis(365)}년 전"
}
} else {
SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.getDefault()).format(Date(timestamp))
}
}

fun Drawable.toBitmap(): Bitmap {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.notimanager.data.dto

import android.graphics.BitmapFactory
import com.example.notimanager.data.utils.PendingIntentHelper.retrievePendingIntent
import com.example.notimanager.data.utils.IntentHelper.retrieveIntent
import com.example.notimanager.domain.model.Notification

data class NotificationDto(
Expand All @@ -17,7 +17,7 @@ data class NotificationDto(
title = this.title,
content = this.content,
timestamp = this.timestamp,
intent = retrievePendingIntent(intentArray),
intent = retrieveIntent(intentArray),
intentActive = this.intentActive,
notificationIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.example.notimanager.data.model.NotificationModel
import com.example.notimanager.data.repository.NotificationRepositoryInterface
import com.example.notimanager.data.utils.AppIconGetter.convertByteArray
import com.example.notimanager.data.utils.NameGetter
import com.example.notimanager.data.utils.PendingIntentHelper
import com.example.notimanager.data.utils.IntentHelper
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -68,7 +68,7 @@ class NotiListenerService: NotificationListenerService() {
notificationPackage: String?,
){
val intent = packageManager.getLaunchIntentForPackage(notificationPackage ?: "")
val intentArray = intent.let { pi -> PendingIntentHelper.savePendingIntent(pi!!) }
val intentArray = intent?.let { IntentHelper.saveIntent(it) }

val notificationMetaModel = NotificationMetaModel(
notificationId = id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ package com.example.notimanager.data.utils

import android.content.Intent
import android.os.Parcel
import android.util.Log

object PendingIntentHelper {
fun savePendingIntent(pendingIntent: Intent): ByteArray? {
object IntentHelper {
fun saveIntent(pendingIntent: Intent): ByteArray? {
return try {
val parcel = Parcel.obtain()

Expand All @@ -14,12 +13,11 @@ object PendingIntentHelper {
parcel.recycle()
bytes
} catch (e: Exception) {
Log.e(e.message, e.stackTraceToString())
null
}
}

fun retrievePendingIntent(byteArray: ByteArray): Intent? {
fun retrieveIntent(byteArray: ByteArray): Intent? {
return try {
val parcel = Parcel.obtain()
parcel.unmarshall(byteArray, 0, byteArray.size)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ fun AppIconView(appIcon: Bitmap?) {
Image(
bitmap = appIcon.asImageBitmap(),
contentDescription = null,
modifier = Modifier.size(100.dp)
modifier = Modifier.size(50.dp)
)
}
else{
Image(
bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888).asImageBitmap(),
bitmap = Bitmap.createBitmap(100, 10, Bitmap.Config.ARGB_8888).asImageBitmap(),
contentDescription = null,
modifier = Modifier.size(100.dp)
modifier = Modifier.size(50.dp)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,29 @@ package com.example.notimanager.presentation.ui.component

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.BasicText
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.max
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
Expand All @@ -24,10 +33,13 @@ import com.example.notimanager.presentation.stateholder.state.NotificationAppSta
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationAppViewModel

@Composable
fun NotificationAppListView(navController: NavController, viewModel: NotificationAppViewModel = hiltViewModel()) {
fun NotificationAppListView(navController: NavController, innerPadding: PaddingValues,viewModel: NotificationAppViewModel = hiltViewModel()) {
val notificationAppState by viewModel.notificationAppState.observeAsState(NotificationAppState())

Column {
Column(
Modifier.padding(innerPadding)

) {
if (notificationAppState.isLoading) {
CircularProgressIndicator(modifier = Modifier.padding(16.dp))
} else if (notificationAppState.error != null) {
Expand Down Expand Up @@ -57,11 +69,42 @@ fun NotificationAppItemView(notification: NotificationApp, onClick: () -> Unit)
verticalAlignment = Alignment.CenterVertically
) {
AppIconView(notification.appIcon)
Spacer(modifier = Modifier.width(8.dp))
Column {
BasicText(text = notification.appName, style = MaterialTheme.typography.headlineMedium)
BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge)
BasicText(text = notification.content, style = MaterialTheme.typography.bodyMedium)
BasicText(text = formatTimestamp(notification.timestamp), style = MaterialTheme.typography.bodyMedium)
Text(
text = notification.appName,
style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold))
Text(
text = notification.title,
style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold)

)
Text(
text = notification.content,
style = MaterialTheme.typography.bodySmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Text(
text = formatTimestamp(notification.timestamp),
style = MaterialTheme.typography.labelSmall,
color = Color.LightGray
)
}
}
}

@Composable
@Preview
fun PreviewNotificationAppItemView(){
MaterialTheme{
NotificationAppItemView(
notification = NotificationApp(
appName = "appName",
title = "title",
content = "content",
timestamp = 1234567890,
appIcon = null
), onClick = {})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.notimanager.presentation.ui.component

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
Expand All @@ -23,10 +24,12 @@ import com.example.notimanager.presentation.stateholder.state.NotificationState
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationViewModel

@Composable
fun NotificationListView(viewModel: NotificationViewModel) {
fun NotificationListView(innerPadding: PaddingValues, viewModel: NotificationViewModel) {
val notificationState by viewModel.notificationState.observeAsState(NotificationState())
val context = LocalContext.current
Column {
Column(
Modifier.padding(innerPadding)
) {
if (notificationState.isLoading) {
CircularProgressIndicator(modifier = Modifier.padding(16.dp))
} else if (notificationState.error != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,25 @@ package com.example.notimanager.presentation.ui.component

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.BasicText
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.notimanager.common.objects.DateFormatter.formatTimestamp
Expand All @@ -23,10 +29,12 @@ import com.example.notimanager.presentation.stateholder.state.NotificationTitleS
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationTitleViewModel

@Composable
fun NotificationTitleListView(navController: NavController, viewModel: NotificationTitleViewModel) {
fun NotificationTitleListView(navController: NavController, innerPadding: PaddingValues,viewModel: NotificationTitleViewModel) {
val notificationTitleState by viewModel.notificationTitleState.observeAsState(NotificationTitleState())

Column {
Column (
Modifier.padding(innerPadding)
){
if (notificationTitleState.isLoading) {
CircularProgressIndicator(modifier = Modifier.padding(16.dp))
} else if (notificationTitleState.error != null) {
Expand Down Expand Up @@ -55,10 +63,24 @@ fun NotificationTitleItemView(notification: NotificationTitle, onClick: () -> Un
verticalAlignment = Alignment.CenterVertically
) {
AppIconView(notification.notificationIcon)
Spacer(modifier = Modifier.width(8.dp))
Column {
BasicText(text = notification.title, style = MaterialTheme.typography.bodyLarge)
BasicText(text = notification.content, style = MaterialTheme.typography.bodyMedium)
BasicText(text = formatTimestamp(notification.timestamp), style = MaterialTheme.typography.bodyMedium)
Text(
text = notification.title,
style = MaterialTheme.typography.bodySmall.copy(fontWeight = FontWeight.Bold)

)
Text(
text = notification.content,
style = MaterialTheme.typography.bodySmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
Text(
text = formatTimestamp(notification.timestamp),
style = MaterialTheme.typography.labelSmall,
color = Color.LightGray
)
}
}
}
Loading
Loading