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
1 change: 0 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.NotiManager"
android:enableOnBackInvokedCallback="true"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.notimanager.data.dto

import com.example.notimanager.domain.model.FilteredListItem

data class FilteredListItemDto(
val id: Long,
val appName: String,
val title: String,
){
fun toDomain(): FilteredListItem {
return FilteredListItem(
id = this.id,
appName = this.appName,
title = this.title
)
}
}


Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package com.example.notimanager.data.dto

import android.graphics.BitmapFactory
import com.example.notimanager.domain.model.FilteredNotification

data class FilteredNotificationDto(
val id: Long,
val appName: String,
val title: String,
val iconBytes: ByteArray,
){
fun toDomain(): FilteredNotification {
return FilteredNotification(
id = this.id,
appName = this.appName,
title = this.title,
appIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size),
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ data class NotificationAppDto(
val iconBytes: ByteArray,
val priorityActive: Boolean,
val priority: Int,
val filteredId: Long = 0L
val filteredId: Long = 0L,
val isRead: Boolean
){
fun toDomain(): NotificationApp {
return NotificationApp(
Expand All @@ -22,7 +23,8 @@ data class NotificationAppDto(
appIcon = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.size),
priorityActive = this.priorityActive,
priority = this.priority,
filteredId = this.filteredId
filteredId = this.filteredId,
isRead = this.isRead
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.notimanager.data.repository

import com.example.notimanager.data.model.FilteredNotificationModel
import com.example.notimanager.data.source.local.dao.FilteredNotificationDao
import com.example.notimanager.domain.model.FilteredListItem
import com.example.notimanager.domain.model.FilteredNotification
import com.example.notimanager.domain.repository.FilteredNotificationRepositoryInterface

Expand All @@ -21,7 +22,7 @@ class FilteredNotificationRepository(
appName: String,
title: String,
subText: String
): List<FilteredNotification> {
): List<FilteredListItem> {
return dao.getSpecificFilteredList(appName, title, subText)
.asSequence()
.map { it.toDomain() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.example.notimanager.data.dto.FilteredListItemDto
import com.example.notimanager.data.dto.FilteredNotificationDto
import com.example.notimanager.data.model.FilteredNotificationModel

Expand All @@ -16,10 +17,12 @@ interface FilteredNotificationDao {
SELECT id, appName, title FROM filtered_notification
WHERE appName = :appName AND (title = "" OR title = :title OR title = :subText)
""")
suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List<FilteredNotificationDto>
suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List<FilteredListItemDto>

@Query("""
SELECT id, appName, title FROM filtered_notification
SELECT id, appName, title, ai.iconBytes
FROM filtered_notification AS fn
INNER JOIN app_icon AS ai ON fn.appName = ai.notiAppName
ORDER BY appName ASC
""")
suspend fun getFilteredList(): List<FilteredNotificationDto>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ interface NotificationDao {

@Query(
"""
SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority, fn.id AS filteredId
SELECT n1.appName, n1.title, n1.content, n1.timestamp, ai.iconBytes, ai.priorityActive, ai.priority, fn.id AS filteredId, n1.isRead
FROM notification AS n1
INNER JOIN app_icon AS ai ON n1.appName = ai.notiAppName
LEFT OUTER JOIN filtered_notification AS fn ON n1.appName = fn.appName AND fn.title = ""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.notimanager.domain.model

data class FilteredListItem(
val id: Long,
val appName: String,
val title: String,
)


Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.example.notimanager.domain.model

import android.graphics.Bitmap

data class FilteredNotification(
val id: Long,
val appName: String,
val title: String,
val appIcon: Bitmap?,
)


Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ data class NotificationApp(
val appIcon: Bitmap?,
val priorityActive: Boolean,
val priority: Int,
val filteredId: Long
val filteredId: Long,
val isRead: Boolean
)
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.example.notimanager.domain.repository

import com.example.notimanager.domain.model.FilteredListItem
import com.example.notimanager.domain.model.FilteredNotification

interface FilteredNotificationRepositoryInterface {
suspend fun insertFiltered(appName: String, title: String): Long
suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List<FilteredNotification>
suspend fun getSpecificFilteredList(appName: String, title: String, subText: String): List<FilteredListItem>
suspend fun getFilteredList(): List<FilteredNotification>
suspend fun deleteById(id: Long): Int
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import com.example.notimanager.domain.service.ForegroundNotiService
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
import com.example.notimanager.presentation.ui.navigation.AppNavHost
import com.example.notimanager.presentation.ui.navigation.HandleBackPress
import com.example.notimanager.presentation.ui.theme.AppTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Expand All @@ -31,9 +33,15 @@ class MainActivity : ComponentActivity() {
// 화면 설정
val appName = intent.extras?.getString("appName") ?: ""
setContent {
navController = rememberNavController()
AppNavHost(navController = navController as NavHostController)
if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName")
AppTheme {
navController = rememberNavController()
AppNavHost(navController = navController as NavHostController)

HandleBackPress(navController as NavHostController, startRoute = "mainScreen")

if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName")
}

}

// 알림 허용 권한 요청
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
Expand All @@ -15,7 +17,9 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.example.notimanager.R
Expand All @@ -42,6 +46,7 @@ fun DateFormatterView(
var selectedOption by remember { mutableStateOf(viewModel.getDateFormat()) }

Column {
// 상대 시간 설정
Row(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -53,11 +58,23 @@ fun DateFormatterView(
onClick = { selectedOption = viewModel.relativeTime }
)
Column{
Text(relativeTime)
Text(relativeExample)
Text(exampleExplanation)
Text(
text = relativeTime,
style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold)
)
Text(
text = exampleExplanation,
style = MaterialTheme.typography.bodySmall
)
Text(
text = relativeExample,
style = MaterialTheme.typography.labelSmall,
color = Color.Gray
)
}
}

// 절대 시간 설정
Row(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -69,16 +86,29 @@ fun DateFormatterView(
onClick = { selectedOption = viewModel.absoluteTime }
)
Column{
Text(absoluteTime)
Text(absoluteExample)
Text(exampleExplanation)
Text(
text = absoluteTime,
style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold)
)
Text(
text = exampleExplanation,
style = MaterialTheme.typography.bodySmall
)
Text(
text = absoluteExample,
style = MaterialTheme.typography.labelSmall,
color = Color.Gray
)
}
}
Button(
onClick = { viewModel.setDateFormat(selectedOption) },
modifier = Modifier
.padding(16.dp)
.fillMaxWidth()
.fillMaxWidth(),
colors = ButtonDefaults.buttonColors(
Color(0xFF673AB7) // 원하는 배경 색상으로 변경
)
) {
Text(apply)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import androidx.navigation.NavController
import com.example.notimanager.R
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationPermissionViewModel
import com.example.notimanager.presentation.stateholder.viewmodel.NotificationServicePermissionViewModel
import com.example.notimanager.presentation.ui.component.box.ClickableTextView
import com.example.notimanager.presentation.ui.component.box.SettingBoxView

@Composable
fun SettingView(
Expand All @@ -25,32 +25,39 @@ fun SettingView(
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val filteredList = context.getString(R.string.setting_filtered_list)
val filteredListExplanation = context.getString(R.string.setting_filtered_list_explanation)

val accessPermission = context.getString(R.string.setting_access_permission)
val accessPermissionExplanation = context.getString(R.string.setting_access_permission_explanation)

val sendPermission = context.getString(R.string.setting_send_permission)
val sendPermissionExplanation = context.getString(R.string.setting_send_permission_explanation)

val dateFormatter = context.getString(R.string.setting_date_format)
val dateFormatterExplanation = context.getString(R.string.setting_date_format_explanation)

Column(
modifier = Modifier
.padding(innerPadding)
) {
// 받지 않는 알림 목록
ClickableTextView(filteredList, onClick = {navController.navigate("FilteredListScreen")}) {
SettingBoxView(filteredList, filteredListExplanation) {
navController.navigate("FilteredListScreen")
}

// 시간 형식 변경
SettingBoxView(dateFormatter, dateFormatterExplanation) {
navController.navigate("DateFormatterScreen")
}

// 알림 접근 권한
ClickableTextView(accessPermission, onClick = {servicePermissionViewModel.requestServicePermission()}) {

SettingBoxView(accessPermission, accessPermissionExplanation) {
servicePermissionViewModel.requestServicePermission()
}

// 알림 발송 권한
ClickableTextView(sendPermission, onClick = {notificationPermissionViewModel.requestPermission(context as Activity)}) {

}

// 시간 형식 변경
ClickableTextView(dateFormatter, onClick = {navController.navigate("DateFormatterScreen")}) {

SettingBoxView(sendPermission, sendPermissionExplanation) {
notificationPermissionViewModel.requestPermission(context as Activity)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.notimanager.presentation.ui.component.box

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
Expand All @@ -12,6 +13,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp

@Composable
Expand All @@ -37,3 +39,29 @@ fun ClickableTextView(
}
}
}

@Composable
fun SettingBoxView(
title: String,
explanation: String,
onClick: () -> Unit,
){
Box(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable(onClick = onClick)
){
Column {
Text(
text = title,
style = MaterialTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Bold),
modifier = Modifier.padding(vertical = 8.dp)
)
Text(
text = explanation,
style = MaterialTheme.typography.bodySmall
)
}
}
}
Loading
Loading