/* * Copyright (C) 2017 Moez Bhatti * * This file is part of QKSMS. * * QKSMS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * QKSMS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with QKSMS. If not, see . */ package presentation.feature.settings import android.content.Context import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import injection.appComponent import common.util.BillingManager import common.util.DateFormatter import common.util.NightModeManager import util.Preferences import interactor.FullSync import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.withLatestFrom import presentation.common.Navigator import presentation.common.base.QkViewModel import timber.log.Timber import java.util.* import javax.inject.Inject class SettingsViewModel : QkViewModel(SettingsState()) { @Inject lateinit var context: Context @Inject lateinit var billingManager: BillingManager @Inject lateinit var dateFormatter: DateFormatter @Inject lateinit var navigator: Navigator @Inject lateinit var nightModeManager: NightModeManager @Inject lateinit var prefs: Preferences @Inject lateinit var fullSync: FullSync init { appComponent.inject(this) disposables += prefs.defaultSms .asObservable() .subscribe { isDefaultSmsApp -> newState { it.copy(isDefaultSmsApp = isDefaultSmsApp) } } val nightModeLabels = context.resources.getStringArray(R.array.night_modes) disposables += prefs.nightMode.asObservable() .subscribe { nightMode -> newState { it.copy(nightModeSummary = nightModeLabels[nightMode], nightModeId = nightMode) } } disposables += prefs.nightStart.asObservable() .subscribe { nightStart -> newState { it.copy(nightStart = nightStart) } } disposables += prefs.nightEnd.asObservable() .subscribe { nightEnd -> newState { it.copy(nightEnd = nightEnd) } } disposables += prefs.black.asObservable() .subscribe { black -> newState { it.copy(black = black) } } disposables += prefs.autoEmoji.asObservable() .subscribe { enabled -> newState { it.copy(autoEmojiEnabled = enabled) } } disposables += prefs.notifications().asObservable() .subscribe { enabled -> newState { it.copy(notificationsEnabled = enabled) } } disposables += prefs.delivery.asObservable() .subscribe { enabled -> newState { it.copy(deliveryEnabled = enabled) } } disposables += prefs.unicode.asObservable() .subscribe { enabled -> newState { it.copy(stripUnicodeEnabled = enabled) } } disposables += prefs.mms.asObservable() .subscribe { enabled -> newState { it.copy(mmsEnabled = enabled) } } val mmsSizeLabels = context.resources.getStringArray(R.array.mms_sizes) val mmsSizeIds = context.resources.getIntArray(R.array.mms_sizes_ids) disposables += prefs.mmsSize.asObservable() .subscribe { maxMmsSize -> val index = mmsSizeIds.indexOf(maxMmsSize) newState { it.copy(maxMmsSizeSummary = mmsSizeLabels[index], maxMmsSizeId = maxMmsSize) } } disposables += fullSync } override fun bindView(view: SettingsView) { super.bindView(view) view.preferenceClickIntent .autoDisposable(view.scope()) .subscribe { Timber.v("Preference click: ${context.resources.getResourceName(it.id)}") when (it.id) { R.id.defaultSms -> navigator.showDefaultSmsDialog() R.id.theme -> navigator.showThemePicker() R.id.night -> view.showNightModeDialog() R.id.nightStart -> { val date = dateFormatter.parseTime(prefs.nightStart.get()) view.showStartTimePicker(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE)) } R.id.nightEnd -> { val date = dateFormatter.parseTime(prefs.nightEnd.get()) view.showEndTimePicker(date.get(Calendar.HOUR_OF_DAY), date.get(Calendar.MINUTE)) } R.id.black -> prefs.black.set(!prefs.black.get()) R.id.autoEmoji -> prefs.autoEmoji.set(!prefs.autoEmoji.get()) R.id.notifications -> navigator.showNotificationSettings() R.id.blocked -> navigator.showBlockedConversations() R.id.delivery -> prefs.delivery.set(!prefs.delivery.get()) R.id.unicode -> prefs.unicode.set(!prefs.unicode.get()) R.id.mms -> prefs.mms.set(!prefs.mms.get()) R.id.mmsSize -> view.showMmsSizePicker() R.id.sync -> { newState { it.copy(syncing = true) } fullSync.execute(Unit, { newState { it.copy(syncing = false) } }) } } } view.nightModeSelectedIntent .doOnNext { view.dismissNightModeDialog() } .withLatestFrom(billingManager.plusStatus, { mode, plusStatus -> if (plusStatus == BillingManager.UpgradeStatus.REGULAR && mode == Preferences.NIGHT_MODE_AUTO) { view.showQksmsPlusSnackbar() } else { nightModeManager.updateNightMode(mode) } }) .autoDisposable(view.scope()) .subscribe() view.viewQksmsPlusIntent .autoDisposable(view.scope()) .subscribe { navigator.showQksmsPlusActivity() } view.startTimeSelectedIntent .doOnNext { nightModeManager.updateAlarms() } .map { dateFormatter.formatTime(it.first, it.second) } .autoDisposable(view.scope()) .subscribe { prefs.nightStart.set(it) } view.endTimeSelectedIntent .doOnNext { nightModeManager.updateAlarms() } .map { dateFormatter.formatTime(it.first, it.second) } .autoDisposable(view.scope()) .subscribe { prefs.nightEnd.set(it) } view.mmsSizeSelectedIntent .doOnNext { view.dismissMmsSizePicker() } .autoDisposable(view.scope()) .subscribe { prefs.mmsSize.set(it) } } }