Skip to content

Commit 7b8378d

Browse files
authored
Merge pull request #93 from boostcampwm-2022/89-feature-alarm-background-bug
[PR] 알람 버그 수정
2 parents 81b5be5 + 95da8bf commit 7b8378d

File tree

19 files changed

+247
-182
lines changed

19 files changed

+247
-182
lines changed

data/src/main/java/com/stop/data/local/model/Alarm.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.stop.domain.model.route.tmap.custom.Route
88
data class Alarm(
99
val startPosition: String,
1010
val endPosition: String,
11-
val routes: List<Route>,
11+
val routes: Route,
1212
val lastTime: String, // 막차 시간 -> 23:30:15 시분초
1313
val walkTime : Int, // 도보시간 -> 분단위
1414
val alarmTime: Int, // 10분 전 알람 설정 -> 10

data/src/main/java/com/stop/data/model/alarm/AlarmRepositoryItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.stop.domain.model.route.tmap.custom.Route
77
data class AlarmRepositoryItem(
88
val startPosition: String,
99
val endPosition: String,
10-
val routes: List<Route>,
10+
val routes: Route,
1111
val lastTime: String, // 막차 시간 -> 23:30:15 시분초
1212
val walkTime : Int, // 도보시간 -> 분단위
1313
val alarmTime: Int, // 10분 전 알람 설정 -> 10

domain/src/main/java/com/stop/domain/model/alarm/AlarmUseCaseItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.stop.domain.model.route.tmap.custom.Route
55
data class AlarmUseCaseItem(
66
val startPosition: String,
77
val endPosition: String,
8-
val routes: List<Route>,
8+
val routes: Route,
99
val lastTime: String, // 막차 시간 -> 23:30:15 시분초
1010
val walkTime : Int, // 도보시간 -> 분단위
1111
val alarmTime: Int, // 10분 전 알람 설정 -> 10

presentation/src/main/AndroidManifest.xml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<uses-permission android:name="android.permission.INTERNET" />
77
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
88
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
9-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
9+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1010

1111
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
1212
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
@@ -33,6 +33,8 @@
3333

3434
<service android:name=".alarm.SoundService" />
3535

36+
<service android:name=".alarm.SoundRestartService" />
37+
3638
<provider
3739
android:name="androidx.startup.InitializationProvider"
3840
android:authorities="${applicationId}.androidx-startup"
@@ -44,13 +46,17 @@
4446
tools:node="merge" />
4547

4648
<activity
47-
android:name=".MainActivity"
48-
android:excludeFromRecents="true"
49+
android:name=".AlarmActivity"
4950
android:exported="true"
50-
android:launchMode="singleTask"
5151
android:screenOrientation="portrait"
5252
android:showOnLockScreen="true"
53+
android:theme="@style/Theme.PlzStop" />
54+
55+
<activity
56+
android:name=".MainActivity"
5357
android:configChanges="orientation|screenSize|keyboardHidden"
58+
android:exported="true"
59+
android:screenOrientation="portrait"
5460
android:theme="@style/Theme.Splash">
5561

5662
<intent-filter>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.stop
2+
3+
import android.app.KeyguardManager
4+
import android.content.Context
5+
import android.os.Bundle
6+
import android.view.WindowManager
7+
import androidx.appcompat.app.AppCompatActivity
8+
import androidx.core.view.WindowCompat
9+
import com.stop.databinding.ActivityAlarmBinding
10+
import dagger.hilt.android.AndroidEntryPoint
11+
12+
@AndroidEntryPoint
13+
class AlarmActivity : AppCompatActivity() {
14+
15+
private lateinit var binding: ActivityAlarmBinding
16+
17+
override fun onCreate(savedInstanceState: Bundle?) {
18+
WindowCompat.setDecorFitsSystemWindows(window, false)
19+
super.onCreate(savedInstanceState)
20+
21+
binding = ActivityAlarmBinding.inflate(layoutInflater)
22+
setContentView(binding.root)
23+
24+
binding.navHostFragment.setPadding(0, 0, 0, this.navigationHeight())
25+
showOverLockScreen()
26+
}
27+
28+
private fun showOverLockScreen() {
29+
window.addFlags(
30+
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
31+
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
32+
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
33+
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
34+
)
35+
36+
if (isMoreThanOreoMr1()) {
37+
setShowWhenLocked(true)
38+
setTurnScreenOn(true)
39+
(getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).requestDismissKeyguard(
40+
this,
41+
null
42+
)
43+
}
44+
}
45+
46+
}
Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,22 @@
11
package com.stop
22

3-
import android.app.KeyguardManager
43
import android.content.Context
5-
import android.content.Intent
64
import android.graphics.Rect
75
import android.os.Bundle
86
import android.view.MotionEvent
97
import android.view.View
10-
import android.view.WindowManager
118
import android.view.inputmethod.InputMethodManager
129
import android.widget.EditText
1310
import androidx.appcompat.app.AppCompatActivity
1411
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
1512
import androidx.core.view.WindowCompat
16-
import androidx.navigation.fragment.NavHostFragment
1713
import com.stop.databinding.ActivityMainBinding
18-
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
19-
import com.stop.ui.mission.MissionWorker.Companion.MISSION_CODE
2014
import dagger.hilt.android.AndroidEntryPoint
2115

2216
@AndroidEntryPoint
2317
class MainActivity : AppCompatActivity() {
2418
private lateinit var binding: ActivityMainBinding
2519

26-
override fun onNewIntent(intent: Intent?) {
27-
super.onNewIntent(intent)
28-
setIntent(intent)
29-
30-
intent?.extras?.getInt("ALARM_CODE")?.let {
31-
if (it == ALARM_CODE) {
32-
val navHostFragment =
33-
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
34-
val inflater = navHostFragment.navController.navInflater
35-
val graph = inflater.inflate(R.navigation.nav_graph)
36-
graph.setStartDestination(R.id.alarmStartFragment)
37-
38-
navHostFragment.navController.graph = graph
39-
}
40-
}
41-
42-
intent?.extras?.getInt("MISSION_CODE")?.let {
43-
if (it == MISSION_CODE) {
44-
val navHostFragment =
45-
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
46-
val inflater = navHostFragment.navController.navInflater
47-
val graph = inflater.inflate(R.navigation.nav_graph)
48-
graph.setStartDestination(R.id.missionFragment)
49-
50-
navHostFragment.navController.graph = graph
51-
}
52-
}
53-
}
54-
5520
override fun onCreate(savedInstanceState: Bundle?) {
5621
installSplashScreen()
5722
WindowCompat.setDecorFitsSystemWindows(window, false)
@@ -61,7 +26,6 @@ class MainActivity : AppCompatActivity() {
6126
setContentView(binding.root)
6227

6328
binding.navHostFragment.setPadding(0, 0, 0, this.navigationHeight())
64-
showOverLockScreen()
6529
}
6630

6731
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
@@ -87,22 +51,4 @@ class MainActivity : AppCompatActivity() {
8751
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
8852
}
8953

90-
private fun showOverLockScreen() {
91-
window.addFlags(
92-
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
93-
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
94-
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
95-
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
96-
)
97-
98-
if (isMoreThanOreoMr1()) {
99-
setShowWhenLocked(true)
100-
setTurnScreenOn(true)
101-
(getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).requestDismissKeyguard(
102-
this,
103-
null
104-
)
105-
}
106-
}
107-
10854
}

presentation/src/main/java/com/stop/alarm/AlarmReceiver.kt

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,44 @@ import android.app.NotificationManager
44
import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
7-
import com.stop.MainActivity
7+
import com.stop.AlarmActivity
88
import com.stop.R
99
import com.stop.isMoreThanOreo
1010
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_CODE
1111
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_HIGH_ID
1212
import com.stop.ui.alarmsetting.AlarmSettingFragment.Companion.ALARM_NOTIFICATION_ID
1313
import com.stop.util.getAlarmReceiverNotification
1414
import com.stop.util.getAlarmReceiverPendingIntent
15-
import com.stop.util.getAlarmScreenOnNotification
16-
import com.stop.util.isScreenOn
1715

1816
class AlarmReceiver : BroadcastReceiver() {
1917

2018
override fun onReceive(context: Context, intent: Intent) {
2119
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
2220
notificationManager.cancel(ALARM_NOTIFICATION_ID)
2321

24-
val soundServiceIntent = Intent(context, SoundService::class.java)
2522
val content = context.getString(R.string.alarm_content_text)
2623

27-
if (context.isScreenOn()) {
28-
if (isMoreThanOreo()) {
29-
context.startForegroundService(soundServiceIntent)
30-
} else {
31-
context.startService(soundServiceIntent)
32-
}
24+
if (isMoreThanOreo()) {
25+
val soundRestartServiceIntent = Intent(context, SoundRestartService::class.java)
26+
context.startForegroundService(soundRestartServiceIntent)
3327

3428
val alarmStartPendingIntent = context.getAlarmReceiverPendingIntent()
35-
val alarmStartNotification = context.getAlarmScreenOnNotification(alarmStartPendingIntent, content)
29+
val alarmStartNotification = context.getAlarmReceiverNotification(
30+
alarmStartPendingIntent,
31+
content
32+
)
3633

37-
notificationManager.notify(ALARM_NOTIFICATION_ID, alarmStartNotification)
34+
notificationManager.notify(ALARM_NOTIFICATION_HIGH_ID, alarmStartNotification)
35+
} else {
36+
val soundServiceIntent = Intent(context, SoundService::class.java)
37+
context.startService(soundServiceIntent)
3838

39-
/*Intent(context, MainActivity::class.java).apply {
39+
Intent(context, AlarmActivity::class.java).apply {
4040
putExtra("ALARM_CODE", ALARM_CODE)
41+
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
4142
context.startActivity(this)
42-
}*/
43-
} else {
44-
if (isMoreThanOreo()) {
45-
context.startForegroundService(soundServiceIntent)
46-
47-
val alarmStartPendingIntent = context.getAlarmReceiverPendingIntent()
48-
val alarmStartNotification = context.getAlarmReceiverNotification(
49-
alarmStartPendingIntent,
50-
content
51-
)
52-
53-
notificationManager.notify(ALARM_NOTIFICATION_HIGH_ID, alarmStartNotification)
54-
} else {
55-
context.startService(soundServiceIntent)
56-
Intent(context, MainActivity::class.java).apply {
57-
putExtra("ALARM_CODE", ALARM_CODE)
58-
context.startActivity(this)
59-
}
6043
}
6144
}
62-
6345
}
6446

6547
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.stop.alarm
2+
3+
import android.app.*
4+
import android.content.Context
5+
import android.content.Intent
6+
import android.os.Build
7+
import android.os.IBinder
8+
import androidx.core.app.NotificationCompat
9+
import com.stop.AlarmActivity
10+
import com.stop.R
11+
12+
class SoundRestartService : Service() {
13+
14+
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
15+
val builder = NotificationCompat.Builder(this, "default")
16+
builder.setSmallIcon(R.mipmap.ic_bus)
17+
builder.setContentTitle(null)
18+
builder.setContentText(null)
19+
20+
val notificationIntent = Intent(this, AlarmActivity::class.java)
21+
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
22+
builder.setContentIntent(pendingIntent)
23+
24+
val manager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
25+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
26+
manager.createNotificationChannel(
27+
NotificationChannel(
28+
"default",
29+
"기본 채널",
30+
NotificationManager.IMPORTANCE_NONE
31+
)
32+
)
33+
}
34+
35+
val notification: Notification = builder.build()
36+
startForeground(9, notification)
37+
38+
val serviceIntent = Intent(this, SoundService::class.java)
39+
40+
startService(serviceIntent)
41+
stopForeground(true)
42+
stopSelf()
43+
44+
return START_NOT_STICKY
45+
}
46+
47+
override fun onBind(intent: Intent?): IBinder? {
48+
return null
49+
}
50+
}

0 commit comments

Comments
 (0)