Skip to content

Commit

Permalink
modify: change workManager to AlarmManager
Browse files Browse the repository at this point in the history
it working on api 28, but not working on api 33
  • Loading branch information
HI-JIN2 committed Sep 17, 2024
1 parent fb39f03 commit e7f98a6
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 137 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ android {
namespace = "com.eatssu.android"
compileSdk = 34

// S8: API 28
// S21: API 33
defaultConfig {
applicationId = "com.eatssu.android"
minSdk = 23
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
tools:targetApi="31">

<receiver
android:name="NotificationReceiver"
android:name=".util.NotificationReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
Expand Down
64 changes: 0 additions & 64 deletions app/src/main/java/com/eatssu/android/NotificationWorker.kt

This file was deleted.

203 changes: 131 additions & 72 deletions app/src/main/java/com/eatssu/android/ui/mypage/MyPageActivity.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
package com.eatssu.android.ui.mypage


import android.app.Activity
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import com.eatssu.android.BuildConfig
import com.eatssu.android.NotificationWorker
import com.eatssu.android.R
import com.eatssu.android.base.BaseActivity
import com.eatssu.android.data.repository.FirebaseRemoteConfigRepository
Expand All @@ -27,14 +30,14 @@ import com.eatssu.android.ui.login.LoginActivity
import com.eatssu.android.ui.mypage.myreview.MyReviewListActivity
import com.eatssu.android.ui.mypage.terms.WebViewActivity
import com.eatssu.android.ui.mypage.usernamechange.UserNameChangeActivity
import com.eatssu.android.util.NotificationReceiver
import com.eatssu.android.util.extension.showToast
import com.eatssu.android.util.extension.startActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.Calendar
import java.util.concurrent.TimeUnit

@AndroidEntryPoint
class MyPageActivity : BaseActivity<ActivityMyPageBinding>(ActivityMyPageBinding::inflate) {
Expand All @@ -51,10 +54,25 @@ class MyPageActivity : BaseActivity<ActivityMyPageBinding>(ActivityMyPageBinding
super.onCreate(savedInstanceState)
toolbarTitle.text = "λ§ˆμ΄νŽ˜μ΄μ§€" // νˆ΄λ°” 제λͺ© μ„€μ •


initViewModel()
setOnClickListener()
setData()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.POST_NOTIFICATIONS),
REQUEST_NOTIFICATION_PERMISSION
)
} else {
requestNotificationPermission(this)
}
}
}

override fun onResume() {
Expand Down Expand Up @@ -119,87 +137,85 @@ class MyPageActivity : BaseActivity<ActivityMyPageBinding>(ActivityMyPageBinding
intent.putExtra("TITLE", getString(R.string.policy))
startActivity(intent)
}
//
// val alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
//
// val intent = Intent(this, NotificationReceiver::class.java)
// val pendingIntent = PendingIntent.getBroadcast(
// this, NOTIFICATION_ID, intent,
// PendingIntent.FLAG_UPDATE_CURRENT
// )

binding.alarmSwitch.setOnCheckedChangeListener { _, check ->
if (check) {
// val toastMessage = if (check) {
// val calendar = Calendar.getInstance().apply {
// timeInMillis = System.currentTimeMillis()
// set(Calendar.HOUR_OF_DAY, 17)
// set(Calendar.MINUTE, 0)
// }
// Timber.i("ν˜„μž¬μ‹œκ°„μ€ ${LocalDateTime.now()},${calendar.time} 에 μ•Œλ¦Όμ„ 울림")
//
// alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, repeatInterval, pendingIntent)
//
//// alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
//
// alarmManager.setExactAndAllowWhileIdle(
// AlarmManager.RTC_WAKEUP,
// calendar.timeInMillis,
// pendingIntent
// )
//
// "μ•Œλ¦Όμ΄ λ°œμƒν•©λ‹ˆλ‹€."
// } else {
// alarmManager.cancel(pendingIntent)
// "μ•Œλ¦Ό μ˜ˆμ•½μ„ μ·¨μ†Œν•˜μ˜€μŠ΅λ‹ˆλ‹€."
// }
//
// Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show()
// }


scheduleNotification()

binding.alarmSwitch.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
if (checkNotificationPermission(this)) {
scheduleAlarm()
} else {
// μ•Œλ¦Ό κΆŒν•œμ΄ 없을 λ•Œ μ‚¬μš©μžμ—κ²Œ μ„€μ • ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜λΌκ³  μ•Œλ¦Ό
showNotificationPermissionDialog()
}
} else {
cancelAlarm()
}
}
}

private fun showNotificationPermissionDialog() {
AlertDialog.Builder(this)
.setTitle("μ•Œλ¦Ό κΆŒν•œ ν•„μš”")
.setMessage("μ•Œλ¦Όμ„ λ°›μœΌλ €λ©΄ μ•Œλ¦Ό κΆŒν•œμ„ ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ„€μ • ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?")
.setPositiveButton("μ„€μ •μœΌλ‘œ 이동") { _, _ ->
openAppNotificationSettings(this)
}
.setNegativeButton("μ·¨μ†Œ", null)
.show()
}

private fun checkNotificationPermission(context: Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ContextCompat.checkSelfPermission(
context,
android.Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
} else {
true // Android 13 이전 λ²„μ „μ—μ„œλŠ” μ•Œλ¦Ό κΆŒν•œμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŒ
}
}

private fun scheduleNotification() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
.setRequiresBatteryNotLow(false)
.build()

val notificationWorkRequest =
PeriodicWorkRequestBuilder<NotificationWorker>(1, TimeUnit.DAYS)
.setConstraints(constraints)
.setInitialDelay(calculateInitialDelay(), TimeUnit.MILLISECONDS)
.build()

WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
"DailyNotification",
ExistingPeriodicWorkPolicy.REPLACE,
notificationWorkRequest
private fun scheduleAlarm() {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, NotificationReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this,
0,
intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
}

private fun calculateInitialDelay(): Long {
val currentTimeMillis = System.currentTimeMillis()
val calendar = Calendar.getInstance().apply {
timeInMillis = currentTimeMillis
set(Calendar.HOUR_OF_DAY, 18)
set(Calendar.MINUTE, 20)
set(Calendar.HOUR_OF_DAY, 23)
set(Calendar.MINUTE, 11)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
}

if (calendar.timeInMillis <= currentTimeMillis) {
if (calendar.timeInMillis <= System.currentTimeMillis()) {
calendar.add(Calendar.DAY_OF_YEAR, 1)
}

return calendar.timeInMillis - currentTimeMillis
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
AlarmManager.INTERVAL_DAY,
pendingIntent
)
}

private fun cancelAlarm() {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, NotificationReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this,
0,
intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
alarmManager.cancel(pendingIntent)
}


private fun setData() {
binding.tvAppVersion.text = "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
binding.tvStoreAppVersion.text = versionViewModel.checkVersionCode().toString()
Expand Down Expand Up @@ -304,4 +320,47 @@ class MyPageActivity : BaseActivity<ActivityMyPageBinding>(ActivityMyPageBinding
)
}
}

// μ•Œλ¦Ό κΆŒν•œ μš”μ²­ ν•¨μˆ˜
private fun requestNotificationPermission(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ActivityCompat.requestPermissions(
activity,
arrayOf(android.Manifest.permission.POST_NOTIFICATIONS),
REQUEST_NOTIFICATION_PERMISSION
)
}
}


override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_NOTIFICATION_PERMISSION) {
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
// κΆŒν•œμ΄ ν—ˆμš©λ˜μ—ˆμ„ λ•Œ μ•Œλ¦Ό μ„€μ •
scheduleAlarm()
} else {
// κΆŒν•œμ΄ κ±°λΆ€λ˜μ—ˆμ„ λ•Œ 처리
Toast.makeText(this, "μ•Œλ¦Ό κΆŒν•œμ΄ κ±°λΆ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.", Toast.LENGTH_SHORT).show()
openAppNotificationSettings(this)
}
}
}


private fun openAppNotificationSettings(context: Context) {
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)
}
context.startActivity(intent)
}


companion object {
private const val REQUEST_NOTIFICATION_PERMISSION = 1001
}
}
Loading

0 comments on commit e7f98a6

Please sign in to comment.