diff --git a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt index 8b6dd02c..d2298460 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt @@ -218,10 +218,16 @@ class MessageRepositoryImpl @Inject constructor( attachments: List, delay: Int ) { + val signedBody = when { + prefs.signature.get().isEmpty() -> body + body.isNotEmpty() -> body + '\n' + prefs.signature.get() + else -> prefs.signature.get() + } + if (addresses.size == 1 && attachments.isEmpty()) { // SMS if (delay > 0) { // With delay val sendTime = System.currentTimeMillis() + delay - val message = insertSentSms(subId, threadId, addresses.first(), body, sendTime) + val message = insertSentSms(subId, threadId, addresses.first(), signedBody, sendTime) val intent = getIntentForDelayedSms(message.id) @@ -232,14 +238,14 @@ class MessageRepositoryImpl @Inject constructor( alarmManager.setExact(AlarmManager.RTC_WAKEUP, sendTime, intent) } } else { // No delay - val message = insertSentSms(subId, threadId, addresses.first(), body, System.currentTimeMillis()) + val message = insertSentSms(subId, threadId, addresses.first(), signedBody, System.currentTimeMillis()) sendSms(message) } } else { // MMS val parts = arrayListOf() - if (body.isNotBlank()) { - parts += MMSPart("text", ContentType.TEXT_PLAIN, body.toByteArray()) + if (signedBody.isNotBlank()) { + parts += MMSPart("text", ContentType.TEXT_PLAIN, signedBody.toByteArray()) } // Add the GIFs as attachments diff --git a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt index a13858f8..53437b2d 100644 --- a/data/src/main/java/com/moez/QKSMS/util/Preferences.kt +++ b/data/src/main/java/com/moez/QKSMS/util/Preferences.kt @@ -83,6 +83,7 @@ class Preferences @Inject constructor(private val rxPrefs: RxSharedPreferences) val swipeLeft = rxPrefs.getInteger("swipeLeft", SWIPE_ACTION_ARCHIVE) val autoEmoji = rxPrefs.getBoolean("autoEmoji", true) val delivery = rxPrefs.getBoolean("delivery", false) + val signature = rxPrefs.getString("signature", "") val unicode = rxPrefs.getBoolean("unicode", false) val mobileOnly = rxPrefs.getBoolean("mobileOnly", false) val mmsSize = rxPrefs.getInteger("mmsSize", 300) diff --git a/presentation/src/main/java/com/moez/QKSMS/common/widget/FieldDialog.kt b/presentation/src/main/java/com/moez/QKSMS/common/widget/FieldDialog.kt new file mode 100644 index 00000000..1649edf6 --- /dev/null +++ b/presentation/src/main/java/com/moez/QKSMS/common/widget/FieldDialog.kt @@ -0,0 +1,48 @@ +/* + * 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 com.moez.QKSMS.common.widget + +import android.app.Activity +import android.content.DialogInterface +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import com.moez.QKSMS.R +import kotlinx.android.synthetic.main.field_dialog.view.* + +class FieldDialog(context: Activity, hint: String, listener: (String) -> Unit) : AlertDialog(context) { + + private val layout = LayoutInflater.from(context).inflate(R.layout.field_dialog, null) + + init { + layout.field.hint = hint + + setView(layout) + setButton(DialogInterface.BUTTON_NEUTRAL, context.getString(R.string.button_cancel)) { _, _ -> } + setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.button_delete)) { _, _ -> listener("") } + setButton(DialogInterface.BUTTON_POSITIVE, context.getString(R.string.button_save)) { _, _ -> + listener(layout.field.text.toString()) + } + } + + fun setText(text: String): FieldDialog { + layout.field.setText(text) + return this + } + +} diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/conversationinfo/ConversationInfoController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/conversationinfo/ConversationInfoController.kt index caabfebb..f5140e88 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/conversationinfo/ConversationInfoController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/conversationinfo/ConversationInfoController.kt @@ -18,7 +18,6 @@ */ package com.moez.QKSMS.feature.conversationinfo -import android.text.InputFilter import android.view.View import androidx.appcompat.app.AlertDialog import com.bluelinelabs.conductor.RouterTransaction @@ -28,11 +27,9 @@ import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.QkChangeHandler import com.moez.QKSMS.common.base.QkController import com.moez.QKSMS.common.util.extensions.animateLayoutChanges -import com.moez.QKSMS.common.util.extensions.dpToPx -import com.moez.QKSMS.common.util.extensions.resolveThemeColor import com.moez.QKSMS.common.util.extensions.scrapViews import com.moez.QKSMS.common.util.extensions.setVisible -import com.moez.QKSMS.common.widget.QkEditText +import com.moez.QKSMS.common.widget.FieldDialog import com.moez.QKSMS.feature.conversationinfo.injection.ConversationInfoModule import com.moez.QKSMS.feature.themepicker.ThemePickerController import com.moez.QKSMS.injection.appComponent @@ -43,7 +40,9 @@ import io.reactivex.subjects.Subject import kotlinx.android.synthetic.main.conversation_info_controller.* import javax.inject.Inject -class ConversationInfoController(val threadId: Long = 0) : QkController(), ConversationInfoView { +class ConversationInfoController( + val threadId: Long = 0 +) : QkController(), ConversationInfoView { @Inject override lateinit var presenter: ConversationInfoPresenter @Inject lateinit var navigator: Navigator @@ -51,6 +50,10 @@ class ConversationInfoController(val threadId: Long = 0) : QkController = PublishSubject.create() private val confirmDeleteSubject: Subject = PublishSubject.create() @@ -130,26 +133,7 @@ class ConversationInfoController(val threadId: Long = 0) : QkController nameChangeSubject.onNext(editText.text.toString()) } - .setNegativeButton(R.string.button_cancel, null) - .show() - } + override fun showNameDialog(name: String) = nameDialog.setText(name).show() override fun showThemePicker(threadId: Long) { router.pushController(RouterTransaction.with(ThemePickerController(threadId)) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt index d90ae016..ffa8f1dd 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt @@ -37,6 +37,7 @@ import com.moez.QKSMS.common.util.Colors import com.moez.QKSMS.common.util.extensions.animateLayoutChanges import com.moez.QKSMS.common.util.extensions.setBackgroundTint import com.moez.QKSMS.common.util.extensions.setVisible +import com.moez.QKSMS.common.widget.FieldDialog import com.moez.QKSMS.common.widget.PreferenceView import com.moez.QKSMS.feature.settings.about.AboutController import com.moez.QKSMS.feature.settings.swipe.SwipeActionsController @@ -65,9 +66,14 @@ class SettingsController : QkController = PublishSubject.create() private val startTimeSelectedSubject: Subject> = PublishSubject.create() private val endTimeSelectedSubject: Subject> = PublishSubject.create() + private val signatureSubject: Subject = PublishSubject.create() private val progressAnimator by lazy { ObjectAnimator.ofInt(syncingProgress, "progress", 0, 0) } @@ -119,6 +125,8 @@ class SettingsController : QkController = sendDelayDialog.adapter.menuItemClicks + override fun signatureSet(): Observable = signatureSubject + override fun mmsSizeSelected(): Observable = mmsSizeDialog.adapter.menuItemClicks override fun render(state: SettingsState) { @@ -140,6 +148,8 @@ class SettingsController : QkController newState { copy(deliveryEnabled = enabled) } } + disposables += prefs.signature.asObservable() + .subscribe { signature -> newState { copy(signature = signature) } } + val textSizeLabels = context.resources.getStringArray(R.array.text_sizes) disposables += prefs.textSize.asObservable() .subscribe { textSize -> @@ -153,6 +156,8 @@ class SettingsPresenter @Inject constructor( R.id.delivery -> prefs.delivery.set(!prefs.delivery.get()) + R.id.signature -> view.showSignatureDialog(prefs.signature.get()) + R.id.textSize -> view.showTextSizePicker() R.id.systemFont -> prefs.systemFont.set(!prefs.systemFont.get()) @@ -205,7 +210,7 @@ class SettingsPresenter @Inject constructor( view.textSizeSelected() .autoDisposable(view.scope()) - .subscribe { prefs.textSize.set(it) } + .subscribe(prefs.textSize::set) view.sendDelaySelected() .withLatestFrom(billingManager.upgradeStatus) { duration, upgraded -> @@ -218,9 +223,14 @@ class SettingsPresenter @Inject constructor( .autoDisposable(view.scope()) .subscribe() + view.signatureSet() + .doOnNext(prefs.signature::set) + .autoDisposable(view.scope()) + .subscribe() + view.mmsSizeSelected() .autoDisposable(view.scope()) - .subscribe { prefs.mmsSize.set(it) } + .subscribe(prefs.mmsSize::set) } } \ No newline at end of file diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt index 18285627..d2a35995 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsState.kt @@ -33,6 +33,7 @@ data class SettingsState( val sendDelaySummary: String = "", val sendDelayId: Int = 0, val deliveryEnabled: Boolean = false, + val signature: String = "", val textSizeSummary: String = "", val textSizeId: Int = Preferences.TEXT_SIZE_NORMAL, val systemFontEnabled: Boolean = false, diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt index 081d4c08..80431508 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsView.kt @@ -31,6 +31,7 @@ interface SettingsView : QkViewContract { fun nightEndSelected(): Observable> fun textSizeSelected(): Observable fun sendDelaySelected(): Observable + fun signatureSet(): Observable fun mmsSizeSelected(): Observable fun showQksmsPlusSnackbar() @@ -39,6 +40,7 @@ interface SettingsView : QkViewContract { fun showEndTimePicker(hour: Int, minute: Int) fun showTextSizePicker() fun showDelayDurationDialog() + fun showSignatureDialog(signature: String) fun showMmsSizePicker() fun showSwipeActions() fun showThemePicker() diff --git a/presentation/src/main/res/drawable/ic_short_text_black_24dp.xml b/presentation/src/main/res/drawable/ic_short_text_black_24dp.xml new file mode 100644 index 00000000..11c24c5a --- /dev/null +++ b/presentation/src/main/res/drawable/ic_short_text_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/layout/field_dialog.xml b/presentation/src/main/res/layout/field_dialog.xml new file mode 100644 index 00000000..76326dd5 --- /dev/null +++ b/presentation/src/main/res/layout/field_dialog.xml @@ -0,0 +1,33 @@ + + + diff --git a/presentation/src/main/res/layout/settings_controller.xml b/presentation/src/main/res/layout/settings_controller.xml index 9fa9f4a3..198ac607 100644 --- a/presentation/src/main/res/layout/settings_controller.xml +++ b/presentation/src/main/res/layout/settings_controller.xml @@ -144,6 +144,13 @@ app:title="@string/settings_delivery_title" app:widget="@layout/settings_switch_widget" /> + + - \ No newline at end of file + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 1562885a..718d1db6 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -138,7 +138,6 @@ Details Conversation title - Enter title Notifications Theme Archive @@ -241,6 +240,7 @@ Delivery confirmations Confirm that messages were sent successfully + Signature Strip accents Remove accents from characters in outgoing SMS messages Mobile numbers only