diff --git a/presentation/src/main/java/common/Navigator.kt b/presentation/src/main/java/common/Navigator.kt index 3768e573..df493e20 100644 --- a/presentation/src/main/java/common/Navigator.kt +++ b/presentation/src/main/java/common/Navigator.kt @@ -178,6 +178,12 @@ class Navigator @Inject constructor(private val context: Context, private val no } fun showNotificationSettings(threadId: Long = 0) { + val intent = Intent(context, NotificationPrefsActivity::class.java) + intent.putExtra("threadId", threadId) + startActivity(intent) + } + + fun showNotificationChannel(threadId: Long = 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (threadId != 0L) { notificationManager.createNotificationChannel(threadId) @@ -188,10 +194,6 @@ class Navigator @Inject constructor(private val context: Context, private val no intent.putExtra(Settings.EXTRA_CHANNEL_ID, channelId) intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) startActivity(intent) - } else { - val intent = Intent(context, NotificationPrefsActivity::class.java) - intent.putExtra("threadId", threadId) - startActivity(intent) } } diff --git a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsActivity.kt b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsActivity.kt index 78ef8c72..8a3df7ac 100644 --- a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsActivity.kt +++ b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsActivity.kt @@ -19,16 +19,22 @@ package feature.notificationprefs import android.app.Activity +import android.app.AlertDialog import android.content.Intent import android.media.RingtoneManager import android.net.Uri +import android.os.Build import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView import com.jakewharton.rxbinding2.view.clicks import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.MenuItemAdapter import common.base.QkThemedActivity +import common.util.extensions.dpToPx +import common.util.extensions.setVisible import common.widget.PreferenceView import injection.appComponent import io.reactivex.subjects.PublishSubject @@ -39,11 +45,11 @@ import javax.inject.Inject class NotificationPrefsActivity : QkThemedActivity(), NotificationPrefsView { - @Inject lateinit var nightModeAdapter: MenuItemAdapter - @Inject lateinit var mmsSizeAdapter: MenuItemAdapter + @Inject lateinit var notificationPreviewModeAdapter: MenuItemAdapter override val viewModelClass = NotificationPrefsViewModel::class override val preferenceClickIntent: Subject = PublishSubject.create() + override val notificationPreviewModeSelectedIntent by lazy { notificationPreviewModeAdapter.menuItemClicks } override val ringtoneSelectedIntent: Subject = PublishSubject.create() init { @@ -57,8 +63,14 @@ class NotificationPrefsActivity : QkThemedActivity() showBackButton(true) viewModel.bindView(this) - nightModeAdapter.setData(R.array.night_modes) - mmsSizeAdapter.setData(R.array.mms_sizes, R.array.mms_sizes_ids) + val hasOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + + notificationsO.setVisible(hasOreo) + notifications.setVisible(!hasOreo) + vibration.setVisible(!hasOreo) + ringtone.setVisible(!hasOreo) + + notificationPreviewModeAdapter.setData(R.array.notification_preview_options) colors.background .autoDisposable(scope()) @@ -81,8 +93,28 @@ class NotificationPrefsActivity : QkThemedActivity() } notifications.checkbox.isChecked = state.notificationsEnabled + notificationPreviews.summary = state.notificationPreviewSummary vibration.checkbox.isChecked = state.vibrationEnabled ringtone.summary = state.ringtoneName + qkreply.checkbox.isChecked = state.qkReplyEnabled + qkreplyTapDismiss.setVisible(state.qkReplyEnabled) + qkreplyTapDismiss.checkbox.isChecked = state.qkReplyTapDismiss + } + + override fun showNotificationPreviewModeDialog() { + val recyclerView = RecyclerView(this) + recyclerView.layoutManager = LinearLayoutManager(this) + recyclerView.adapter = notificationPreviewModeAdapter + recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) + + val dialog = AlertDialog.Builder(this) + .setView(recyclerView) + .create() + .apply { show() } + + notificationPreviewModeAdapter.menuItemClicks + .autoDisposable(scope()) + .subscribe { dialog.dismiss() } } override fun showRingtonePicker(default: Uri) { diff --git a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsState.kt b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsState.kt index 6ffd0200..0cfdb20f 100644 --- a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsState.kt +++ b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsState.kt @@ -18,9 +18,13 @@ */ package feature.notificationprefs +import android.os.Build + data class NotificationPrefsState( val conversationTitle: String = "", val notificationsEnabled: Boolean = true, + val notificationPreviewSummary: String = "", val vibrationEnabled: Boolean = true, - val ringtoneName: String = "" -) \ No newline at end of file + val ringtoneName: String = "", + val qkReplyEnabled: Boolean = Build.VERSION.SDK_INT < Build.VERSION_CODES.N, + val qkReplyTapDismiss: Boolean = true) \ No newline at end of file diff --git a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsView.kt b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsView.kt index 0170c8a1..3ebb4a20 100644 --- a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsView.kt +++ b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsView.kt @@ -19,15 +19,17 @@ package feature.notificationprefs import android.net.Uri -import io.reactivex.Observable -import io.reactivex.subjects.Subject import common.base.QkView import common.widget.PreferenceView +import io.reactivex.Observable +import io.reactivex.subjects.Subject interface NotificationPrefsView : QkView { val preferenceClickIntent: Subject + val notificationPreviewModeSelectedIntent: Subject val ringtoneSelectedIntent: Observable + fun showNotificationPreviewModeDialog() fun showRingtonePicker(default: Uri) } diff --git a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsViewModel.kt b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsViewModel.kt index a466e2ce..dc40f64a 100644 --- a/presentation/src/main/java/feature/notificationprefs/NotificationPrefsViewModel.kt +++ b/presentation/src/main/java/feature/notificationprefs/NotificationPrefsViewModel.kt @@ -27,15 +27,14 @@ import com.f2prateek.rx.preferences2.Preference import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable +import common.Navigator +import common.base.QkViewModel import injection.appComponent -import util.Preferences import io.reactivex.Flowable import io.reactivex.rxkotlin.plusAssign import io.reactivex.schedulers.Schedulers -import common.Navigator -import common.base.QkViewModel import repository.MessageRepository -import timber.log.Timber +import util.Preferences import util.extensions.mapNotNull import javax.inject.Inject @@ -68,6 +67,10 @@ class NotificationPrefsViewModel(intent: Intent) : QkViewModel newState { it.copy(notificationsEnabled = enabled) } } + val notificationPreviewLabels = context.resources.getStringArray(R.array.notification_preview_options) + disposables += prefs.notificationPreviews().asObservable() + .subscribe { nightMode -> newState { it.copy(notificationPreviewSummary = notificationPreviewLabels[nightMode]) } } + disposables += vibration.asObservable() .subscribe { enabled -> newState { it.copy(vibrationEnabled = enabled) } } @@ -75,6 +78,12 @@ class NotificationPrefsViewModel(intent: Intent) : QkViewModel uri.toUri() } .map { uri -> RingtoneManager.getRingtone(context, uri).getTitle(context) } .subscribe { title -> newState { it.copy(ringtoneName = title) } } + + disposables += prefs.qkreply.asObservable() + .subscribe { enabled -> newState { it.copy(qkReplyEnabled = enabled) } } + + disposables += prefs.qkreplyTapDismiss.asObservable() + .subscribe { enabled -> newState { it.copy(qkReplyTapDismiss = enabled) } } } override fun bindView(view: NotificationPrefsView) { @@ -83,17 +92,27 @@ class NotificationPrefsViewModel(intent: Intent) : QkViewModel navigator.showNotificationChannel(threadId) + R.id.notifications -> notifications.set(!notifications.get()) + R.id.notificationPreviews -> view.showNotificationPreviewModeDialog() + R.id.vibration -> vibration.set(!vibration.get()) R.id.ringtone -> view.showRingtonePicker(Uri.parse(ringtone.get())) + + R.id.qkreply -> prefs.qkreply.set(!prefs.qkreply.get()) + + R.id.qkreplyTapDismiss -> prefs.qkreplyTapDismiss.set(!prefs.qkreplyTapDismiss.get()) } } + view.notificationPreviewModeSelectedIntent + .autoDisposable(view.scope()) + .subscribe { prefs.notificationPreviews().set(it) } + view.ringtoneSelectedIntent .autoDisposable(view.scope()) .subscribe { ringtone -> this.ringtone.set(ringtone) } diff --git a/presentation/src/main/java/feature/settings/SettingsActivity.kt b/presentation/src/main/java/feature/settings/SettingsActivity.kt index 1fdb704d..2ecbeea5 100644 --- a/presentation/src/main/java/feature/settings/SettingsActivity.kt +++ b/presentation/src/main/java/feature/settings/SettingsActivity.kt @@ -49,7 +49,6 @@ class SettingsActivity : QkThemedActivity(), SettingsView { @Inject lateinit var nightModeAdapter: MenuItemAdapter @Inject lateinit var textSizeAdapter: MenuItemAdapter - @Inject lateinit var notificationPreviewModeAdapter: MenuItemAdapter @Inject lateinit var mmsSizeAdapter: MenuItemAdapter override val viewModelClass = SettingsViewModel::class @@ -59,7 +58,6 @@ class SettingsActivity : QkThemedActivity(), SettingsView { override val startTimeSelectedIntent: Subject> = PublishSubject.create() override val endTimeSelectedIntent: Subject> = PublishSubject.create() override val textSizeSelectedIntent by lazy { textSizeAdapter.menuItemClicks } - override val notificationPreviewModeSelectedIntent by lazy { notificationPreviewModeAdapter.menuItemClicks } override val mmsSizeSelectedIntent: Subject by lazy { mmsSizeAdapter.menuItemClicks } // TODO remove this @@ -88,7 +86,6 @@ class SettingsActivity : QkThemedActivity(), SettingsView { nightModeAdapter.setData(R.array.night_modes) textSizeAdapter.setData(R.array.text_sizes) - notificationPreviewModeAdapter.setData(R.array.notification_preview_options) mmsSizeAdapter.setData(R.array.mms_sizes, R.array.mms_sizes_ids) version.text = getString(R.string.settings_version, BuildConfig.VERSION_NAME) @@ -127,12 +124,8 @@ class SettingsActivity : QkThemedActivity(), SettingsView { black.setVisible(state.nightModeId != Preferences.NIGHT_MODE_OFF) black.checkbox.isChecked = state.black - notificationPreviews.summary = state.notificationPreviewSummary autoEmoji.checkbox.isChecked = state.autoEmojiEnabled delivery.checkbox.isChecked = state.deliveryEnabled - qkreply.checkbox.isChecked = state.qkReplyEnabled - qkreplyTapDismiss.setVisible(state.qkReplyEnabled) - qkreplyTapDismiss.checkbox.isChecked = state.qkReplyTapDismiss textSize.summary = state.textSizeSummary systemFont.checkbox.isChecked = state.systemFontEnabled @@ -195,22 +188,6 @@ class SettingsActivity : QkThemedActivity(), SettingsView { textSizeDialog = null } - override fun showNotificationPreviewModeDialog() { - val recyclerView = RecyclerView(this) - recyclerView.layoutManager = LinearLayoutManager(this) - recyclerView.adapter = notificationPreviewModeAdapter - recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) - - val dialog = AlertDialog.Builder(this) - .setView(recyclerView) - .create() - .apply { show() } - - notificationPreviewModeAdapter.menuItemClicks - .autoDisposable(scope()) - .subscribe { dialog.dismiss() } - } - override fun showMmsSizePicker() { val recyclerView = RecyclerView(this) recyclerView.layoutManager = LinearLayoutManager(this) diff --git a/presentation/src/main/java/feature/settings/SettingsState.kt b/presentation/src/main/java/feature/settings/SettingsState.kt index b0b65a3d..f724ad02 100644 --- a/presentation/src/main/java/feature/settings/SettingsState.kt +++ b/presentation/src/main/java/feature/settings/SettingsState.kt @@ -18,12 +18,10 @@ */ package feature.settings -import android.os.Build import util.Preferences data class SettingsState( val syncing: Boolean = false, - val isDefaultSmsApp: Boolean = false, val theme: Int = 0, val nightModeSummary: String = "", @@ -33,10 +31,7 @@ data class SettingsState( val black: Boolean = false, val autoEmojiEnabled: Boolean = true, val notificationsEnabled: Boolean = true, - val notificationPreviewSummary: String = "", val deliveryEnabled: Boolean = false, - val qkReplyEnabled: Boolean = Build.VERSION.SDK_INT < Build.VERSION_CODES.N, - val qkReplyTapDismiss: Boolean = true, val textSizeSummary: String = "", val systemFontEnabled: Boolean = false, val splitSmsEnabled: Boolean = false, diff --git a/presentation/src/main/java/feature/settings/SettingsView.kt b/presentation/src/main/java/feature/settings/SettingsView.kt index adb9f095..4287131c 100644 --- a/presentation/src/main/java/feature/settings/SettingsView.kt +++ b/presentation/src/main/java/feature/settings/SettingsView.kt @@ -31,7 +31,6 @@ interface SettingsView : QkView { val startTimeSelectedIntent: Subject> val endTimeSelectedIntent: Subject> val textSizeSelectedIntent: Subject - val notificationPreviewModeSelectedIntent: Subject val mmsSizeSelectedIntent: Observable fun showNightModeDialog() @@ -40,7 +39,6 @@ interface SettingsView : QkView { fun showStartTimePicker(hour: Int, minute: Int) fun showEndTimePicker(hour: Int, minute: Int) fun showTextSizePicker() - fun showNotificationPreviewModeDialog() fun dismissTextSizePicker() fun showMmsSizePicker() fun dismissMmsSizePicker() diff --git a/presentation/src/main/java/feature/settings/SettingsViewModel.kt b/presentation/src/main/java/feature/settings/SettingsViewModel.kt index c499b15e..adb896ac 100644 --- a/presentation/src/main/java/feature/settings/SettingsViewModel.kt +++ b/presentation/src/main/java/feature/settings/SettingsViewModel.kt @@ -81,19 +81,9 @@ class SettingsViewModel : QkViewModel(SettingsState disposables += prefs.notifications().asObservable() .subscribe { enabled -> newState { it.copy(notificationsEnabled = enabled) } } - val notificationPreviewLabels = context.resources.getStringArray(R.array.notification_preview_options) - disposables += prefs.notificationPreviews().asObservable() - .subscribe { nightMode -> newState { it.copy(notificationPreviewSummary = notificationPreviewLabels[nightMode]) } } - disposables += prefs.delivery.asObservable() .subscribe { enabled -> newState { it.copy(deliveryEnabled = enabled) } } - disposables += prefs.qkreply.asObservable() - .subscribe { enabled -> newState { it.copy(qkReplyEnabled = enabled) } } - - disposables += prefs.qkreplyTapDismiss.asObservable() - .subscribe { enabled -> newState { it.copy(qkReplyTapDismiss = enabled) } } - val textSizeLabels = context.resources.getStringArray(R.array.text_sizes) disposables += prefs.textSize.asObservable() .subscribe { textSize -> newState { it.copy(textSizeSummary = textSizeLabels[textSize]) } } @@ -146,16 +136,10 @@ class SettingsViewModel : QkViewModel(SettingsState R.id.notifications -> navigator.showNotificationSettings() - R.id.notificationPreviews -> view.showNotificationPreviewModeDialog() - R.id.blocked -> navigator.showBlockedConversations() R.id.delivery -> prefs.delivery.set(!prefs.delivery.get()) - R.id.qkreply -> prefs.qkreply.set(!prefs.qkreply.get()) - - R.id.qkreplyTapDismiss -> prefs.qkreplyTapDismiss.set(!prefs.qkreplyTapDismiss.get()) - R.id.textSize -> view.showTextSizePicker() R.id.systemFont -> prefs.systemFont.set(!prefs.systemFont.get()) @@ -206,10 +190,6 @@ class SettingsViewModel : QkViewModel(SettingsState .autoDisposable(view.scope()) .subscribe { prefs.textSize.set(it) } - view.notificationPreviewModeSelectedIntent - .autoDisposable(view.scope()) - .subscribe { prefs.notificationPreviews().set(it) } - view.mmsSizeSelectedIntent .doOnNext { view.dismissMmsSizePicker() } .autoDisposable(view.scope()) diff --git a/presentation/src/main/res/layout/notification_prefs_activity.xml b/presentation/src/main/res/layout/notification_prefs_activity.xml index c8aa70f3..becf1979 100644 --- a/presentation/src/main/res/layout/notification_prefs_activity.xml +++ b/presentation/src/main/res/layout/notification_prefs_activity.xml @@ -1,5 +1,4 @@ - - - - + - + + + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar"> - + android:layout_height="wrap_content" + android:animateLayoutChanges="true" + android:orientation="vertical" + android:paddingBottom="8dp" + android:paddingTop="8dp"> - + app:icon="@drawable/ic_notifications_black_24dp" + app:title="@string/settings_notifications_title" + tools:visibility="gone" /> - + - + - + - + - + - + - + - + - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/settings_activity.xml b/presentation/src/main/res/layout/settings_activity.xml index fd2aa9a4..19ee4c70 100644 --- a/presentation/src/main/res/layout/settings_activity.xml +++ b/presentation/src/main/res/layout/settings_activity.xml @@ -144,13 +144,6 @@ app:icon="@drawable/ic_notifications_black_24dp" app:title="@string/settings_notifications_title" /> - - - - - - Appearance General + QK Reply + Default SMS app QKSMS is your default SMS app Set QKSMS as your default SMS app