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 @@ -31,9 +31,9 @@ import com.example.notimanager.data.source.local.database.MigrationObject.MIGRAT
AppIconModel::class,
FilteredNotificationModel::class
],
autoMigrations = [
AutoMigration (from = 9, to = 10)
]
// autoMigrations = [
// AutoMigration (from = 9, to = 10)
// ]
)
abstract class NotiManagerDatabase : RoomDatabase() {
abstract fun notificationDao(): NotificationDao
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class ForegroundNotiService: Service() {
}
val pendingIntent = PendingIntent
.getActivity(this,
0,
appName.hashCode(),
notificationIntent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class NotiListenerService: NotificationListenerService() {
val postTime = sbn.postTime

CoroutineScope(Dispatchers.IO).launch {
if (appName == "NotiManager") return@launch
if (title == "" && content == "") return@launch

val filteredList = filterRepository.getSpecificFilteredList(appName, title, subText)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ class NotificationPermissionUseCase(
}

fun requestPermission() {
if (!repository.isNotificationServiceEnabled()) {
repository.requestNotificationListenerPermission()
}
repository.requestNotificationListenerPermission()
}

fun isNotificationPermissionGranted(): Boolean{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
package com.example.notimanager.presentation.stateholder.viewmodel

import android.app.Activity
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import android.util.Log
import androidx.lifecycle.ViewModel
import com.example.notimanager.domain.usecase.NotificationPermissionUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject

@HiltViewModel
class NotificationPermissionViewModel @Inject constructor(
@ApplicationContext private val appContext: Context,
private val notificationPermissionUseCase: NotificationPermissionUseCase
) : ViewModel() {
private val prefs = "do_permission"
private val sharedPreferences = appContext.getSharedPreferences(prefs, Context.MODE_PRIVATE)

private val _isNotificationPermissionGranted = MutableLiveData<Boolean>()
val isNotificationPermissionGranted: LiveData<Boolean> get() = _isNotificationPermissionGranted

init {
checkNotificationPermission()
fun requestPermission(activity: Activity) {
if (!checkNotificationPermission()) {
notificationPermissionUseCase.requestPermission(activity)
sharedPreferences.edit().putBoolean(prefs, true).apply()
}
else openAppSettings(activity)
}

fun checkNotificationPermission() {
_isNotificationPermissionGranted.value = notificationPermissionUseCase.isNotificationPermissionGranted()
fun checkNotificationPermission(): Boolean {
return sharedPreferences.getBoolean(prefs, false)
}

fun requestPermission(activity: Activity) {
notificationPermissionUseCase.requestPermission(activity)
private fun openAppSettings(activity: Activity) {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", activity.packageName, null)
intent.data = uri
activity.startActivity(intent)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package com.example.notimanager.presentation.ui.activity

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
Expand All @@ -26,24 +24,25 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// 언어 변경에 따라 문자열 리소스를 가져오기
// 언어 설정에 따라 문자열 리소스를 가져오기
val basicTitle = getString(R.string.status_basic_title)
val basicContent = getString(R.string.status_basic_content)

// 화면 설정
val appName = intent.extras?.getString("appName") ?: ""
setContent {
navController = rememberNavController()
AppNavHost(navController = navController as NavHostController)
if (appName != "" && appName != "NotiManager") navController.navigate("titleScreen/$appName")
}

notificationViewModel.isNotificationPermissionGranted.observe(this) { isGranted ->
if (!isGranted) {
notificationViewModel.requestPermission(this)
}
// 알림 허용 권한 요청
if (!notificationViewModel.checkNotificationPermission()){
notificationViewModel.requestPermission(this)
}

// 포그라운드 서비스 실행
val serviceIntent = Intent(this, ForegroundNotiService::class.java).apply {
putExtra("clearGroup", true)
putExtra("appName", basicTitle)
putExtra("content", basicContent)
putExtra("isGroupSummary", true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,9 @@ fun FilteredItemView(
filteredItem: FilteredNotification,
viewModel: FilteredNotificationViewModel,
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val removeFiltered = context.getString(R.string.modal_remove_filtered)
// 위의 문자열 리소스는 모달에서 사용할 텍스트

var showModal by remember { mutableStateOf(false) }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ fun NotificationAppItemView(
priorityViewModel: NotificationAppPriorityViewModel,
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val addFiltered = context.getString(R.string.modal_add_filtered)
val addPriority = context.getString(R.string.modal_add_priority)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ fun NotificationItemView(
onClick: () -> Unit,
onDelete: (Long) -> Unit
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val moveToApp = context.getString(R.string.modal_move_to_app)
val delete = context.getString(R.string.modal_delete)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ fun NotificationTitleItemView(
priorityViewModel: NotificationTitlePriorityViewModel,
filteredNotificationViewModel: FilteredNotificationViewModel = hiltViewModel()
) {
// 언어 변경에 따라 문자열 리소스를 가져오기
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val addFiltered = context.getString(R.string.modal_add_filtered)
val addPriority = context.getString(R.string.modal_add_priority)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.example.notimanager.presentation.stateholder.viewmodel.NotificationSe

@Composable
fun PermissionCheck(viewModel: NotificationServicePermissionViewModel = hiltViewModel()){
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val title = context.getString(R.string.permission_title)
val message = context.getString(R.string.permission_message)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,46 @@
package com.example.notimanager.presentation.ui.component

import android.app.Activity
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.hilt.navigation.compose.hiltViewModel
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

@Composable
fun SettingView(
innerPadding: PaddingValues,
navController: NavController
){
navController: NavController,
servicePermissionViewModel: NotificationServicePermissionViewModel = hiltViewModel(),
notificationPermissionViewModel: NotificationPermissionViewModel = hiltViewModel(),

){
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val name = context.getString(R.string.setting_filtered_list)
val filteredList = context.getString(R.string.setting_filtered_list)
val accessPermission = context.getString(R.string.setting_access_permission)
val sendPermission = context.getString(R.string.setting_send_permission)

Column(
modifier = Modifier
.padding(innerPadding)
) {
ClickableTextView(name) {
ClickableTextView(filteredList) {
navController.navigate("FilteredListScreen")
}

ClickableTextView(accessPermission) {
servicePermissionViewModel.requestServicePermission()
}

ClickableTextView(sendPermission) {
notificationPermissionViewModel.requestPermission(context as Activity)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ import com.example.notimanager.R
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainTopAppBar(settingOnClick: () -> Unit){
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val appName = context.getString(R.string.app_name)

TopAppBar(
title = {
Text(text = appName)
Expand Down Expand Up @@ -73,8 +75,10 @@ fun NotificationTopAppBar(title: String, onBackClick: () -> Unit){
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingTopAppBar(onBackClick: () -> Unit){
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val name = context.getString(R.string.setting_name)

TopAppBar(
title = {
Text(text = name)
Expand All @@ -90,8 +94,10 @@ fun SettingTopAppBar(onBackClick: () -> Unit){
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FilteredTopAppBar(onBackClick: () -> Unit){
// 언어 설정에 따라 문자열 리소스를 가져오기
val context = LocalContext.current
val name = context.getString(R.string.setting_filtered_list)

TopAppBar(
title = {
Text(text = name)
Expand Down
16 changes: 9 additions & 7 deletions app/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,27 @@
<string name="modal_delete">삭제</string>
<string name="modal_move_to_app">앱으로 이동하기</string>

<string name="modal_add_filtered">더 이상 알림 받지 않기</string>
<string name="modal_add_priority">상단에 고정하기</string>
<string name="modal_add_filtered">앱에서 이 알림 관리하지 않기</string>
<string name="modal_add_priority">중요 알림으로 설정하기</string>

<string name="modal_set_read">읽음으로 표시하기</string>
<string name="modal_set_unread">읽지 않음으로 표시하기</string>

<string name="modal_remove_filtered">다시 알림 받기</string>">
<string name="modal_remove_priority">고정 취소하기</string>
<string name="modal_remove_filtered">앱에서 이 알림 관리하기</string>">
<string name="modal_remove_priority">중요 알림 설정 취소하기</string>

<!-- 설정 페이지 UI -->
<string name="setting_name">설정</string>
<string name="setting_filtered_list">받지 않는 알림 목록</string>
<string name="setting_filtered_list">관리하지 않는 알림 목록</string>
<string name="setting_locale">언어 설정하기</string>
<string name="setting_access_permission">알림 접근 권한 변경하기</string>
<string name="setting_send_permission">알림 발송 권한 변경하기</string>

<!-- 허용창 UI -->
<string name="permission_ok">확인</string>
<string name="permission_no">거부</string>
<string name="permission_title">알림 권한이 필요해요</string>
<string name="permission_message">알림을 받기 위해 알림 권한이 필요해요</string>
<string name="permission_title">알림 접근 권한이 필요해요</string>
<string name="permission_message">앱에서 알림을 관리하기 위해 권한을 허용해주세요.</string>

<!-- 상태창 UI -->
<string name="status_basic_title">NotiManager</string>
Expand Down
25 changes: 14 additions & 11 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
<resources>
<string name="app_name">NotiManager</string>

<!-- 더보기 모달 창 UI -->
<!-- 더보기 모달 창 UI -->
<string name="modal_delete">Delete</string>
<string name="modal_move_to_app">Move to App</string>

<string name="modal_add_filtered">Stop Receiving Notifications</string>
<string name="modal_add_priority">Pin to Top</string>
<string name="modal_add_filtered">Do not manage this notification in the app</string>
<string name="modal_add_priority">Set as Important Notification</string>

<string name="modal_set_read">Mark as Read</string>
<string name="modal_set_unread">Mark as Unread</string>

<string name="modal_remove_filtered">Start Receiving Notifications Again</string>
<string name="modal_remove_priority">Unpin</string>
<string name="modal_remove_filtered">Manage this notification in the app</string>
<string name="modal_remove_priority">Cancel Important Notification Setting</string>

<!-- 설정 페이지 UI -->
<!-- 설정 페이지 UI -->
<string name="setting_name">Settings</string>
<string name="setting_filtered_list">List of Notifications Not Received</string>
<string name="setting_locale">Change Language</string>
<string name="setting_filtered_list">List of Unmanaged Notifications</string>
<string name="setting_locale">Change Language Settings</string>
<string name="setting_access_permission">Change Notification Access Permission</string>
<string name="setting_send_permission">Change Notification Send Permission</string>

<!-- 허용창 UI -->

<!-- 허용창 UI -->
<string name="permission_ok">OK</string>
<string name="permission_no">Deny</string>
<string name="permission_title">Notification Permission Required</string>
<string name="permission_message">Notification permission is required to receive notifications.</string>
<string name="permission_title">Notification Access Permission Required</string>
<string name="permission_message">Please allow permission to manage notifications in the app.</string>

<!-- 상태창 UI -->
<string name="status_basic_title">NotiManager</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,5 @@ class NotificationPermissionUseCaseTest : BehaviorSpec({
}
}

When("알림 서비스가 이미 활성화되어 있다면") {
every { repository.isNotificationServiceEnabled() } returns true

Then("권한 요청을 하지 않아야 한다") {
useCase.requestPermission()
verify(exactly = 0) { repository.requestNotificationListenerPermission() }
}
}
}
})
Loading