Skip to content

Commit fc82299

Browse files
authored
Merge pull request #132 from FossifyOrg/ask_notification_permission
Address some issues regarding missed alarms
2 parents c3fe662 + 22d0f69 commit fc82299

File tree

9 files changed

+163
-115
lines changed

9 files changed

+163
-115
lines changed

app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import org.fossify.clock.adapters.ViewPagerAdapter
1515
import org.fossify.clock.databinding.ActivityMainBinding
1616
import org.fossify.clock.extensions.config
1717
import org.fossify.clock.extensions.getEnabledAlarms
18+
import org.fossify.clock.extensions.handleFullScreenNotificationsPermission
1819
import org.fossify.clock.extensions.rescheduleEnabledAlarms
1920
import org.fossify.clock.extensions.updateWidgets
2021
import org.fossify.clock.helpers.*
@@ -44,11 +45,16 @@ class MainActivity : SimpleActivity() {
4445
setupTabs()
4546
updateWidgets()
4647
migrateFirstDayOfWeek()
48+
ensureBackgroundThread {
49+
rescheduleEnabledAlarms()
50+
}
4751

4852
getEnabledAlarms { enabledAlarms ->
49-
if (enabledAlarms.isNullOrEmpty()) {
50-
ensureBackgroundThread {
51-
rescheduleEnabledAlarms()
53+
if (!enabledAlarms.isNullOrEmpty()) {
54+
handleFullScreenNotificationsPermission {
55+
if (!it) {
56+
toast(org.fossify.commons.R.string.notifications_disabled)
57+
}
5258
}
5359
}
5460
}
@@ -87,10 +93,10 @@ class MainActivity : SimpleActivity() {
8793
private fun checkShortcuts() {
8894
val appIconColor = config.appIconColor
8995
if (isNougatMR1Plus() && config.lastHandledShortcutColor != appIconColor) {
90-
val launchDialpad = getLaunchStopwatchShortcut(appIconColor)
96+
val stopWatchShortcutInfo = getLaunchStopwatchShortcut(appIconColor)
9197

9298
try {
93-
shortcutManager.dynamicShortcuts = listOf(launchDialpad)
99+
shortcutManager.dynamicShortcuts = listOf(stopWatchShortcutInfo)
94100
config.lastHandledShortcutColor = appIconColor
95101
} catch (ignored: Exception) {
96102
}

app/src/main/kotlin/org/fossify/clock/activities/ReminderActivity.kt

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import org.fossify.clock.databinding.ActivityReminderBinding
2020
import org.fossify.clock.extensions.cancelAlarmClock
2121
import org.fossify.clock.extensions.config
2222
import org.fossify.clock.extensions.dbHelper
23+
import org.fossify.clock.extensions.disableExpiredAlarm
2324
import org.fossify.clock.extensions.getFormattedTime
2425
import org.fossify.clock.extensions.scheduleNextAlarm
2526
import org.fossify.clock.extensions.setupAlarmClock
26-
import org.fossify.clock.extensions.updateWidgets
2727
import org.fossify.clock.helpers.ALARM_ID
2828
import org.fossify.clock.helpers.ALARM_NOTIF_ID
2929
import org.fossify.clock.helpers.getPassedSeconds
@@ -363,15 +363,8 @@ class ReminderActivity : SimpleActivity() {
363363
if (alarm!!.days > 0) {
364364
scheduleNextAlarm(alarm!!, false)
365365
}
366-
if (alarm!!.days < 0) {
367-
if (alarm!!.oneShot) {
368-
alarm!!.isEnabled = false
369-
dbHelper.deleteAlarms(arrayListOf(alarm!!))
370-
} else {
371-
dbHelper.updateAlarmEnabledState(alarm!!.id, false)
372-
}
373-
updateWidgets()
374-
}
366+
367+
disableExpiredAlarm(alarm!!)
375368
}
376369

377370
finished = true

app/src/main/kotlin/org/fossify/clock/adapters/AlarmsAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ import org.fossify.commons.views.MyRecyclerView
3333

3434
class AlarmsAdapter(
3535
activity: SimpleActivity,
36-
var alarms: ArrayList<Alarm>,
37-
val toggleAlarmInterface: ToggleAlarmInterface,
36+
private var alarms: ArrayList<Alarm>,
37+
private val toggleAlarmInterface: ToggleAlarmInterface,
3838
recyclerView: MyRecyclerView,
3939
itemClick: (Any) -> Unit,
4040
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract {

app/src/main/kotlin/org/fossify/clock/extensions/Context.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import org.fossify.clock.helpers.getPassedSeconds
5656
import org.fossify.clock.helpers.getTimeOfNextAlarm
5757
import org.fossify.clock.interfaces.TimerDao
5858
import org.fossify.clock.models.Alarm
59+
import org.fossify.clock.models.AlarmEvent
5960
import org.fossify.clock.models.MyTimeZone
6061
import org.fossify.clock.models.Timer
6162
import org.fossify.clock.models.TimerState
@@ -87,6 +88,7 @@ import org.fossify.commons.helpers.TUESDAY_BIT
8788
import org.fossify.commons.helpers.WEDNESDAY_BIT
8889
import org.fossify.commons.helpers.ensureBackgroundThread
8990
import org.fossify.commons.helpers.isOreoPlus
91+
import org.greenrobot.eventbus.EventBus
9092
import java.text.SimpleDateFormat
9193
import java.util.Calendar
9294
import java.util.Locale
@@ -600,3 +602,17 @@ fun Context.firstDayOrder(bitMask: Int): Int {
600602

601603
return bitMask
602604
}
605+
606+
fun Context.disableExpiredAlarm(alarm: Alarm) {
607+
if (alarm.days < 0) {
608+
if (alarm.oneShot) {
609+
alarm.isEnabled = false
610+
dbHelper.deleteAlarms(arrayListOf(alarm))
611+
} else {
612+
dbHelper.updateAlarmEnabledState(alarm.id, false)
613+
}
614+
615+
updateWidgets()
616+
EventBus.getDefault().post(AlarmEvent.Refresh)
617+
}
618+
}

app/src/main/kotlin/org/fossify/clock/fragments/AlarmFragment.kt

Lines changed: 80 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,18 @@ import org.fossify.clock.adapters.AlarmsAdapter
1111
import org.fossify.clock.databinding.FragmentAlarmBinding
1212
import org.fossify.clock.dialogs.ChangeAlarmSortDialog
1313
import org.fossify.clock.dialogs.EditAlarmDialog
14-
import org.fossify.clock.extensions.*
15-
import org.fossify.clock.helpers.*
14+
import org.fossify.clock.extensions.cancelAlarmClock
15+
import org.fossify.clock.extensions.config
16+
import org.fossify.clock.extensions.createNewAlarm
17+
import org.fossify.clock.extensions.dbHelper
18+
import org.fossify.clock.extensions.firstDayOrder
19+
import org.fossify.clock.extensions.handleFullScreenNotificationsPermission
20+
import org.fossify.clock.extensions.scheduleNextAlarm
21+
import org.fossify.clock.extensions.updateWidgets
22+
import org.fossify.clock.helpers.DEFAULT_ALARM_MINUTES
23+
import org.fossify.clock.helpers.SORT_BY_ALARM_TIME
24+
import org.fossify.clock.helpers.SORT_BY_DATE_AND_TIME
25+
import org.fossify.clock.helpers.getTomorrowBit
1626
import org.fossify.clock.interfaces.ToggleAlarmInterface
1727
import org.fossify.clock.models.Alarm
1828
import org.fossify.clock.models.AlarmEvent
@@ -34,7 +44,11 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface {
3444

3545
private lateinit var binding: FragmentAlarmBinding
3646

37-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
47+
override fun onCreateView(
48+
inflater: LayoutInflater,
49+
container: ViewGroup?,
50+
savedInstanceState: Bundle?,
51+
): View {
3852
binding = FragmentAlarmBinding.inflate(inflater, container, false)
3953
return binding.root
4054
}
@@ -74,71 +88,76 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface {
7488
setupAlarms()
7589
}
7690

77-
private fun setupAlarms() {
78-
alarms = context?.dbHelper?.getAlarms() ?: return
79-
80-
when (requireContext().config.alarmSort) {
81-
SORT_BY_ALARM_TIME -> alarms.sortBy { it.timeInMinutes }
82-
SORT_BY_DATE_CREATED -> alarms.sortBy { it.id }
83-
SORT_BY_DATE_AND_TIME -> alarms.sortWith(compareBy<Alarm> {
84-
requireContext().firstDayOrder(it.days)
85-
}.thenBy {
86-
it.timeInMinutes
87-
})
88-
89-
SORT_BY_CUSTOM -> {
90-
val customAlarmsSortOrderString = activity?.config?.alarmsCustomSorting
91-
if (customAlarmsSortOrderString == "") {
92-
alarms.sortBy { it.id }
93-
} else {
94-
val customAlarmsSortOrder: List<Int> = customAlarmsSortOrderString?.split(", ")?.map { it.toInt() }!!
95-
val alarmsIdValueMap = alarms.associateBy { it.id }
96-
97-
val sortedAlarms: ArrayList<Alarm> = ArrayList()
98-
customAlarmsSortOrder.map { id ->
99-
if (alarmsIdValueMap[id] != null) {
100-
sortedAlarms.add(alarmsIdValueMap[id] as Alarm)
101-
}
102-
}
103-
104-
alarms = (sortedAlarms + alarms.filter { it !in sortedAlarms }) as ArrayList<Alarm>
91+
private fun getSortedAlarms(callback: (alarms: ArrayList<Alarm>) -> Unit) {
92+
val safeContext = context ?: return
93+
ensureBackgroundThread {
94+
var newAlarms = context?.dbHelper?.getAlarms()
95+
if (newAlarms == null) {
96+
activity?.runOnUiThread {
97+
callback(arrayListOf())
10598
}
99+
return@ensureBackgroundThread
106100
}
107-
}
108-
context?.getEnabledAlarms { enabledAlarms ->
109-
if (enabledAlarms.isNullOrEmpty()) {
110-
val removedAlarms = mutableListOf<Alarm>()
111-
alarms.forEach {
112-
if (it.days == TODAY_BIT && it.isEnabled && it.timeInMinutes <= getCurrentDayMinutes()) {
113-
it.isEnabled = false
114-
ensureBackgroundThread {
115-
if (it.oneShot) {
116-
it.isEnabled = false
117-
context?.dbHelper?.deleteAlarms(arrayListOf(it))
118-
removedAlarms.add(it)
119-
} else {
120-
context?.dbHelper?.updateAlarmEnabledState(it.id, false)
101+
102+
when (safeContext.config.alarmSort) {
103+
SORT_BY_ALARM_TIME -> newAlarms.sortBy { it.timeInMinutes }
104+
SORT_BY_DATE_CREATED -> newAlarms.sortBy { it.id }
105+
SORT_BY_DATE_AND_TIME -> newAlarms.sortWith(compareBy<Alarm> {
106+
safeContext.firstDayOrder(it.days)
107+
}.thenBy {
108+
it.timeInMinutes
109+
})
110+
111+
SORT_BY_CUSTOM -> {
112+
val customAlarmsSortOrderString = activity?.config?.alarmsCustomSorting
113+
if (customAlarmsSortOrderString == "") {
114+
newAlarms.sortBy { it.id }
115+
} else {
116+
val customAlarmsSortOrder: List<Int> =
117+
customAlarmsSortOrderString?.split(", ")?.map { it.toInt() }!!
118+
val alarmsIdValueMap = newAlarms.associateBy { it.id }
119+
120+
val sortedAlarms: ArrayList<Alarm> = ArrayList()
121+
customAlarmsSortOrder.map { id ->
122+
if (alarmsIdValueMap[id] != null) {
123+
sortedAlarms.add(alarmsIdValueMap[id] as Alarm)
121124
}
122125
}
126+
127+
newAlarms =
128+
(sortedAlarms + newAlarms.filter { it !in sortedAlarms }) as ArrayList<Alarm>
123129
}
124130
}
125-
alarms.removeAll(removedAlarms)
126131
}
127-
}
128132

129-
val currAdapter = binding.alarmsList.adapter
130-
if (currAdapter == null) {
131-
AlarmsAdapter(activity as SimpleActivity, alarms, this, binding.alarmsList) {
132-
openEditAlarm(it as Alarm)
133-
}.apply {
134-
binding.alarmsList.adapter = this
133+
activity?.runOnUiThread {
134+
callback(newAlarms)
135135
}
136-
} else {
137-
(currAdapter as AlarmsAdapter).apply {
138-
updatePrimaryColor()
139-
updateBackgroundColor(requireContext().getProperBackgroundColor())
140-
updateTextColor(requireContext().getProperTextColor())
141-
updateItems(this@AlarmFragment.alarms)
136+
}
137+
}
138+
139+
private fun setupAlarms() {
140+
getSortedAlarms { sortedAlarms ->
141+
alarms = sortedAlarms
142+
var currAdapter = binding.alarmsList.adapter as? AlarmsAdapter
143+
if (currAdapter == null) {
144+
currAdapter = AlarmsAdapter(
145+
activity = activity as SimpleActivity,
146+
alarms = alarms,
147+
toggleAlarmInterface = this,
148+
recyclerView = binding.alarmsList
149+
) {
150+
openEditAlarm(it as Alarm)
151+
}.apply {
152+
binding.alarmsList.adapter = this
153+
}
154+
} else {
155+
currAdapter.apply {
156+
updatePrimaryColor()
157+
updateBackgroundColor(requireContext().getProperBackgroundColor())
158+
updateTextColor(requireContext().getProperTextColor())
159+
updateItems(alarms)
160+
}
142161
}
143162
}
144163
}
@@ -156,7 +175,8 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface {
156175
(activity as SimpleActivity).handleFullScreenNotificationsPermission { granted ->
157176
if (granted) {
158177
if (requireContext().dbHelper.updateAlarmEnabledState(id, isEnabled)) {
159-
val alarm = alarms.firstOrNull { it.id == id } ?: return@handleFullScreenNotificationsPermission
178+
val alarm = alarms.firstOrNull { it.id == id }
179+
?: return@handleFullScreenNotificationsPermission
160180
alarm.isEnabled = isEnabled
161181
checkAlarmState(alarm)
162182
if (!alarm.isEnabled && alarm.oneShot) {

0 commit comments

Comments
 (0)