kopia lustrzana https://github.com/ryukoposting/Signal-Android
91 wiersze
3.1 KiB
Kotlin
91 wiersze
3.1 KiB
Kotlin
package org.thoughtcrime.securesms.components.settings.app.notifications.profiles
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.ViewModelProvider
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|
import io.reactivex.rxjava3.core.Observable
|
|
import io.reactivex.rxjava3.core.Single
|
|
import io.reactivex.rxjava3.disposables.CompositeDisposable
|
|
import io.reactivex.rxjava3.kotlin.plusAssign
|
|
import io.reactivex.rxjava3.kotlin.subscribeBy
|
|
import io.reactivex.rxjava3.subjects.BehaviorSubject
|
|
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfileSchedule
|
|
import java.time.DayOfWeek
|
|
|
|
/**
|
|
* ViewModel for driving edit schedule UI. UI starts in a disabled state until the first schedule is loaded
|
|
* from the database and into the [scheduleSubject] allowing the safe use of !! with [schedule].
|
|
*/
|
|
class EditNotificationProfileScheduleViewModel(
|
|
profileId: Long,
|
|
private val repository: NotificationProfilesRepository
|
|
) : ViewModel() {
|
|
|
|
private val disposables = CompositeDisposable()
|
|
private val scheduleSubject: BehaviorSubject<NotificationProfileSchedule> = BehaviorSubject.create()
|
|
private val schedule: NotificationProfileSchedule
|
|
get() = scheduleSubject.value!!
|
|
|
|
init {
|
|
disposables += repository.getProfile(profileId)
|
|
.take(1)
|
|
.map { it.schedule }
|
|
.singleOrError()
|
|
.subscribeBy(onSuccess = { scheduleSubject.onNext(it) })
|
|
}
|
|
|
|
override fun onCleared() {
|
|
super.onCleared()
|
|
disposables.dispose()
|
|
}
|
|
|
|
fun schedule(): Observable<NotificationProfileSchedule> {
|
|
return scheduleSubject.subscribeOn(AndroidSchedulers.mainThread())
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
}
|
|
|
|
fun toggleDay(day: DayOfWeek) {
|
|
val newDaysEnabled = schedule.daysEnabled.toMutableSet()
|
|
if (newDaysEnabled.contains(day)) {
|
|
newDaysEnabled.remove(day)
|
|
} else {
|
|
newDaysEnabled += day
|
|
}
|
|
scheduleSubject.onNext(schedule.copy(daysEnabled = newDaysEnabled))
|
|
}
|
|
|
|
fun setStartTime(hour: Int, minute: Int) {
|
|
scheduleSubject.onNext(schedule.copy(start = hour * 100 + minute))
|
|
}
|
|
|
|
fun setEndTime(hour: Int, minute: Int) {
|
|
scheduleSubject.onNext(schedule.copy(end = hour * 100 + minute))
|
|
}
|
|
|
|
fun setEnabled(enabled: Boolean) {
|
|
scheduleSubject.onNext(schedule.copy(enabled = enabled))
|
|
}
|
|
|
|
fun save(createMode: Boolean): Single<SaveScheduleResult> {
|
|
val result: Single<SaveScheduleResult> = if (schedule.enabled && schedule.daysEnabled.isEmpty()) {
|
|
Single.just(SaveScheduleResult.NoDaysSelected)
|
|
} else if (createMode && !schedule.enabled) {
|
|
Single.just(SaveScheduleResult.Success)
|
|
} else {
|
|
repository.updateSchedule(schedule).toSingle { SaveScheduleResult.Success }
|
|
}
|
|
return result.observeOn(AndroidSchedulers.mainThread())
|
|
}
|
|
|
|
class Factory(private val profileId: Long) : ViewModelProvider.Factory {
|
|
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
return modelClass.cast(EditNotificationProfileScheduleViewModel(profileId, NotificationProfilesRepository()))!!
|
|
}
|
|
}
|
|
|
|
enum class SaveScheduleResult {
|
|
NoDaysSelected,
|
|
Success
|
|
}
|
|
}
|