diff --git a/src/main/kotlin/com/criptext/mail/BaseActivity.kt b/src/main/kotlin/com/criptext/mail/BaseActivity.kt index 369321b31..88257db4c 100644 --- a/src/main/kotlin/com/criptext/mail/BaseActivity.kt +++ b/src/main/kotlin/com/criptext/mail/BaseActivity.kt @@ -12,6 +12,7 @@ import android.view.Menu import android.view.MenuItem import com.criptext.mail.push.data.IntentExtrasData import com.criptext.mail.push.services.LinkDeviceActionService +import com.criptext.mail.push.services.NewMailActionService import com.criptext.mail.scenes.ActivityMessage import com.criptext.mail.scenes.SceneController import com.criptext.mail.scenes.composer.ComposerModel @@ -164,7 +165,7 @@ abstract class BaseActivity: AppCompatActivity(), IHostActivity { is SignInParams -> SignInSceneModel() is MailboxParams -> MailboxSceneModel(params.showWelcome) is EmailDetailParams -> EmailDetailSceneModel(params.threadId, - params.currentLabel, params.threadPreview) + params.currentLabel, params.threadPreview, params.doReply) is ComposerParams -> ComposerModel(params.type) is SettingsParams -> SettingsModel() is SignatureParams -> SignatureModel(params.recipientId) @@ -223,6 +224,16 @@ abstract class BaseActivity: AppCompatActivity(), IHostActivity { } return IntentExtrasData.IntentExtrasDataDevice(intent.action, uuid, deviceType) } + NewMailActionService.REPLY -> { + val threadId = intent.extras.get(MessagingInstance.THREAD_ID).toString() + val metadataKey = intent.extras.getLong("metadataKey") + if(intent.extras != null) { + for (key in intent.extras.keySet()){ + intent.removeExtra(key) + } + } + return IntentExtrasData.IntentExtrasReply(intent.action, threadId, metadataKey) + } } diff --git a/src/main/kotlin/com/criptext/mail/androidui/CriptextNotification.kt b/src/main/kotlin/com/criptext/mail/androidui/CriptextNotification.kt index 62b8a1760..29905184a 100644 --- a/src/main/kotlin/com/criptext/mail/androidui/CriptextNotification.kt +++ b/src/main/kotlin/com/criptext/mail/androidui/CriptextNotification.kt @@ -13,10 +13,12 @@ import android.os.Build import android.support.annotation.RequiresApi import android.support.v4.app.NotificationCompat import com.criptext.mail.R +import com.criptext.mail.db.KeyValueStorage import com.criptext.mail.push.services.LinkDeviceActionService import com.criptext.mail.push.data.PushDataSource import com.criptext.mail.push.services.NewMailActionService import com.criptext.mail.scenes.mailbox.MailboxActivity +import com.criptext.mail.services.MessagingInstance import com.criptext.mail.utils.DeviceUtils import com.criptext.mail.utils.UIMessage import com.criptext.mail.utils.Utility @@ -28,6 +30,8 @@ import com.criptext.mail.utils.getLocalizedUIMessage */ class CriptextNotification(val ctx: Context) { + private val storage = KeyValueStorage.SharedPrefs(ctx) + companion object { //Actions for Notifications const val ACTION_OPEN = "open_activity" @@ -89,22 +93,26 @@ class CriptextNotification(val ctx: Context) { return notBuild } - fun createNewMailNotification(clickIntent: PendingIntent, title: String, body:String, metadataKey: Long, + fun createNewMailNotification(clickIntent: PendingIntent, title: String, body:String, + metadataKey: Long, threadId: String, notificationId: Int) : Notification { + val notCount = storage.getInt(KeyValueStorage.StringKey.NewMailNotificationCount, 0) + storage.putInt(KeyValueStorage.StringKey.NewMailNotificationCount, notCount + 1) + val readAction = Intent(ctx, NewMailActionService::class.java) readAction.action = NewMailActionService.READ - readAction.putExtra("notificationId", INBOX_ID) + readAction.putExtra("notificationId", notificationId) readAction.putExtra("metadataKey", metadataKey) - val readPendingIntent = PendingIntent.getService(ctx, 0, readAction, + val readPendingIntent = PendingIntent.getService(ctx, notificationId, readAction, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_ONE_SHOT) val trashAction = Intent(ctx, NewMailActionService::class.java) trashAction.action = NewMailActionService.TRASH - trashAction.putExtra("notificationId", INBOX_ID) + trashAction.putExtra("notificationId", notificationId) trashAction.putExtra("metadataKey", metadataKey) - val trashPendingIntent = PendingIntent.getService(ctx, 0, trashAction, + val trashPendingIntent = PendingIntent.getService(ctx, notificationId, trashAction, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_ONE_SHOT) val replyAction = Intent(ctx, MailboxActivity::class.java) @@ -112,6 +120,7 @@ class CriptextNotification(val ctx: Context) { replyAction.addCategory(Intent.CATEGORY_LAUNCHER) replyAction.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_SINGLE_TOP) replyAction.putExtra("metadataKey", metadataKey) + replyAction.putExtra(MessagingInstance.THREAD_ID, threadId) val replyPendingAction = PendingIntent.getActivity(ctx, 0, replyAction, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_ONE_SHOT) @@ -126,8 +135,9 @@ class CriptextNotification(val ctx: Context) { .setGroup(ACTION_INBOX) .setGroupSummary(false) .setSmallIcon(R.drawable.push_icon) - .addAction(R.drawable.check, ctx.getString(R.string.push_read), readPendingIntent) - .addAction(R.drawable.x, ctx.getString(R.string.push_trash), trashPendingIntent) + .addAction(R.drawable.mail_opened, ctx.getString(R.string.push_read), readPendingIntent) + .addAction(R.drawable.trash, ctx.getString(R.string.push_trash), trashPendingIntent) + .addAction(R.drawable.reply, ctx.getString(R.string.push_reply), replyPendingAction) .setLargeIcon(Utility.getBitmapFromText( title, 250, diff --git a/src/main/kotlin/com/criptext/mail/db/KeyValueStorage.kt b/src/main/kotlin/com/criptext/mail/db/KeyValueStorage.kt index d85ff4201..983248f99 100644 --- a/src/main/kotlin/com/criptext/mail/db/KeyValueStorage.kt +++ b/src/main/kotlin/com/criptext/mail/db/KeyValueStorage.kt @@ -16,13 +16,15 @@ interface KeyValueStorage { fun putStringSet(key: StringKey, value: MutableSet) fun getLong(key: StringKey, default: Long): Long fun putLong(key: StringKey, value: Long) + fun getInt(key: StringKey, default: Int): Int + fun putInt(key: StringKey, value: Int) fun clearAll() enum class StringKey(val stringKey: String) { ActiveAccount("ActiveAccount"), SignInSession("SignInSession"), SearchHistory("searchHistory"), LastTimeFeedOpened("LastTimeFeedOpened"), LastTimeConfirmationLinkSent("LastTimeConfirmationLinkSent"), - LastLoggedUser("LastLoggedUser") + LastLoggedUser("LastLoggedUser"), NewMailNotificationCount("NewMailPushCount") } class SharedPrefs(ctx: Context) : KeyValueStorage { @@ -58,6 +60,14 @@ interface KeyValueStorage { withApply { editor -> editor.putLong(key.stringKey, value) } } + override fun getInt(key: StringKey, default: Int): Int { + return prefs.getInt(key.stringKey, default) + } + + override fun putInt(key: StringKey, value: Int) { + withApply { editor -> editor.putInt(key.stringKey, value) } + } + override fun clearAll() { withApply { editor -> editor.clear() } } diff --git a/src/main/kotlin/com/criptext/mail/push/NewMailNotifier.kt b/src/main/kotlin/com/criptext/mail/push/NewMailNotifier.kt index f68e7e92c..2e6c2e87d 100644 --- a/src/main/kotlin/com/criptext/mail/push/NewMailNotifier.kt +++ b/src/main/kotlin/com/criptext/mail/push/NewMailNotifier.kt @@ -18,7 +18,7 @@ sealed class NewMailNotifier(val data: PushData.NewMail): Notifier { private fun postNotification(ctx: Context, isPostNougat: Boolean) { val cn = CriptextNotification(ctx) val notification = buildNotification(ctx, cn) - cn.notify(if(isPostNougat) type.requestCodeRandom() else type.requestCode(), notification, CriptextNotification.ACTION_INBOX) + cn.notify(notification.first, notification.second, CriptextNotification.ACTION_INBOX) } private fun postHeaderNotification(ctx: Context){ @@ -29,7 +29,7 @@ sealed class NewMailNotifier(val data: PushData.NewMail): Notifier { CriptextNotification.ACTION_INBOX, pendingIntent) } - protected abstract fun buildNotification(ctx: Context, cn: CriptextNotification): Notification + protected abstract fun buildNotification(ctx: Context, cn: CriptextNotification): Pair override fun notifyPushEvent(ctx: Context) { if (data.shouldPostNotification){ @@ -42,13 +42,15 @@ sealed class NewMailNotifier(val data: PushData.NewMail): Notifier { class Single(data: PushData.NewMail): NewMailNotifier(data) { - override fun buildNotification(ctx: Context, cn: CriptextNotification): Notification { + override fun buildNotification(ctx: Context, cn: CriptextNotification): Pair { val pendingIntent = ActivityIntentFactory.buildSceneActivityPendingIntent(ctx, type, data.threadId, data.isPostNougat) - return cn.createNewMailNotification(clickIntent = pendingIntent, - title = data.title, body = data.body, metadataKey = data.metadataKey ?: -1, - notificationId = if(data.isPostNougat) type.requestCodeRandom() else type.requestCode()) + val notificationId = if(data.isPostNougat) type.requestCodeRandom() else type.requestCode() + + return Pair(notificationId, cn.createNewMailNotification(clickIntent = pendingIntent, threadId = data.threadId, + title = data.title, body = data.body, metadataKey = data.metadataKey, + notificationId = notificationId)) } } diff --git a/src/main/kotlin/com/criptext/mail/push/PushController.kt b/src/main/kotlin/com/criptext/mail/push/PushController.kt index ec4eb8a89..370e338e3 100644 --- a/src/main/kotlin/com/criptext/mail/push/PushController.kt +++ b/src/main/kotlin/com/criptext/mail/push/PushController.kt @@ -41,7 +41,7 @@ class PushController(private val dataSource: PushDataSource, private val host: M val metadataKey = pushData["metadataKey"]?.toLong() return PushData.NewMail(title = title, body = body, threadId = threadId, - metadataKey = metadataKey, shouldPostNotification = shouldPostNotification, + metadataKey = metadataKey ?: -1, shouldPostNotification = shouldPostNotification, isPostNougat = isPostNougat) } diff --git a/src/main/kotlin/com/criptext/mail/push/PushData.kt b/src/main/kotlin/com/criptext/mail/push/PushData.kt index 327939ee5..c03f3cdd2 100644 --- a/src/main/kotlin/com/criptext/mail/push/PushData.kt +++ b/src/main/kotlin/com/criptext/mail/push/PushData.kt @@ -12,8 +12,8 @@ class PushData { /** * POJO that holds all the data from the NewMail push notification */ - data class NewMail(val title: String, val body: String, val threadId: String?, - val metadataKey: Long?, val isPostNougat: Boolean, + data class NewMail(val title: String, val body: String, val threadId: String, + val metadataKey: Long, val isPostNougat: Boolean, val shouldPostNotification:Boolean) data class OpenMailbox(val title: String, val body: String, val isPostNougat: Boolean, val shouldPostNotification:Boolean) diff --git a/src/main/kotlin/com/criptext/mail/push/data/IntentExtrasData.kt b/src/main/kotlin/com/criptext/mail/push/data/IntentExtrasData.kt index c5a34e321..a19798bd3 100644 --- a/src/main/kotlin/com/criptext/mail/push/data/IntentExtrasData.kt +++ b/src/main/kotlin/com/criptext/mail/push/data/IntentExtrasData.kt @@ -7,5 +7,6 @@ sealed class IntentExtrasData(open val action: String) { data class IntentExtrasDataMail(override val action: String, val threadId: String) : IntentExtrasData(action) data class IntentExtrasDataDevice(override val action: String, val deviceId: String, val deviceType: DeviceUtils.DeviceType) : IntentExtrasData(action) + data class IntentExtrasReply(override val action: String, val threadId: String, val metadataKey: Long) : IntentExtrasData(action) } \ No newline at end of file diff --git a/src/main/kotlin/com/criptext/mail/push/data/PushAPIRequestHandler.kt b/src/main/kotlin/com/criptext/mail/push/data/PushAPIRequestHandler.kt index bbe6abdd4..162bfb85d 100644 --- a/src/main/kotlin/com/criptext/mail/push/data/PushAPIRequestHandler.kt +++ b/src/main/kotlin/com/criptext/mail/push/data/PushAPIRequestHandler.kt @@ -11,6 +11,7 @@ import com.criptext.mail.api.HttpClient import com.criptext.mail.api.HttpErrorHandlingHelper import com.criptext.mail.db.AppDatabase import com.criptext.mail.db.EmailDetailLocalDB +import com.criptext.mail.db.KeyValueStorage import com.criptext.mail.db.dao.EmailDao import com.criptext.mail.db.models.ActiveAccount import com.criptext.mail.db.models.EmailLabel @@ -28,7 +29,8 @@ import org.json.JSONObject class PushAPIRequestHandler(private val not: CriptextNotification, private val manager: NotificationManager, val activeAccount: ActiveAccount, - val httpClient: HttpClient){ + val httpClient: HttpClient, + private val storage: KeyValueStorage){ private val apiClient = PushAPIClient(httpClient, activeAccount.jwt) private val isPostNougat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N @@ -75,9 +77,11 @@ class PushAPIRequestHandler(private val not: CriptextNotification, .flatMap { Result.of { emailDao.toggleCheckingRead(listOf(it.id), false) } } .flatMap { Result.of { apiClient.postOpenEvent(listOf(metadataKey)) } } when(operation){ - is Result.Success -> manager.cancel(notificationId) + is Result.Success -> { + handleNotificationCountForNewEmail(notificationId) + } is Result.Failure -> { - manager.cancel(notificationId) + handleNotificationCountForNewEmail(notificationId) operation.error.printStackTrace() val data = ErrorNotificationData(UIMessage(R.string.push_email_error_title), UIMessage(R.string.push_mail_error_message_read)) @@ -121,10 +125,10 @@ class PushAPIRequestHandler(private val not: CriptextNotification, db.createLabelEmailRelations(emailLabels) db.setTrashDate(emailIds) - manager.cancel(notificationId) + handleNotificationCountForNewEmail(notificationId) } is Result.Failure -> { - manager.cancel(notificationId) + handleNotificationCountForNewEmail(notificationId) val data = ErrorNotificationData(UIMessage(R.string.push_email_error_title), UIMessage(R.string.push_mail_error_message_trash)) val errorNot = not.createErrorNotification(data.title, data.body) @@ -133,6 +137,16 @@ class PushAPIRequestHandler(private val not: CriptextNotification, } } + private fun handleNotificationCountForNewEmail(notificationId: Int){ + val notCount = storage.getInt(KeyValueStorage.StringKey.NewMailNotificationCount, 0) + manager.cancel(notificationId) + if((notCount - 1) == 0) { + manager.cancel(CriptextNotification.INBOX_ID) + }else{ + storage.putInt(KeyValueStorage.StringKey.NewMailNotificationCount, notCount - 1) + } + } + private fun postNotification(data: ErrorNotificationData, cn: CriptextNotification, notification: Notification) { cn.notify(if(isPostNougat) PushTypes.linkDevice.requestCodeRandom() else diff --git a/src/main/kotlin/com/criptext/mail/push/services/LinkDeviceActionService.kt b/src/main/kotlin/com/criptext/mail/push/services/LinkDeviceActionService.kt index bd489b147..097867491 100644 --- a/src/main/kotlin/com/criptext/mail/push/services/LinkDeviceActionService.kt +++ b/src/main/kotlin/com/criptext/mail/push/services/LinkDeviceActionService.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.Intent import com.criptext.mail.androidui.CriptextNotification import com.criptext.mail.api.HttpClient +import com.criptext.mail.db.KeyValueStorage import com.criptext.mail.db.models.ActiveAccount import com.criptext.mail.push.data.PushAPIRequestHandler @@ -24,7 +25,8 @@ class LinkDeviceActionService : IntentService("Link Device Action Service") { val manager = this.applicationContext .getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val requestHandler = PushAPIRequestHandler(CriptextNotification(this), manager, - ActiveAccount.loadFromStorage(this)!!, HttpClient.Default()) + ActiveAccount.loadFromStorage(this)!!, HttpClient.Default(), + KeyValueStorage.SharedPrefs(this)) when { APPROVE == data.action -> { diff --git a/src/main/kotlin/com/criptext/mail/push/services/NewMailActionService.kt b/src/main/kotlin/com/criptext/mail/push/services/NewMailActionService.kt index 28dba1d5d..3a3ae881a 100644 --- a/src/main/kotlin/com/criptext/mail/push/services/NewMailActionService.kt +++ b/src/main/kotlin/com/criptext/mail/push/services/NewMailActionService.kt @@ -8,6 +8,7 @@ import com.criptext.mail.androidui.CriptextNotification import com.criptext.mail.api.HttpClient import com.criptext.mail.db.AppDatabase import com.criptext.mail.db.EmailDetailLocalDB +import com.criptext.mail.db.KeyValueStorage import com.criptext.mail.db.models.ActiveAccount import com.criptext.mail.push.data.PushAPIRequestHandler @@ -27,7 +28,8 @@ class NewMailActionService : IntentService("New Mail Action Service") { val manager = this.applicationContext .getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val requestHandler = PushAPIRequestHandler(CriptextNotification(this), manager, - ActiveAccount.loadFromStorage(this)!!, HttpClient.Default()) + ActiveAccount.loadFromStorage(this)!!, HttpClient.Default(), + KeyValueStorage.SharedPrefs(this)) val db = AppDatabase.getAppDatabase(this) when { diff --git a/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneController.kt b/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneController.kt index 9837b0b0f..6adf05aed 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneController.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneController.kt @@ -72,6 +72,7 @@ class EmailDetailSceneController(private val scene: EmailDetailScene, is EmailDetailResult.UpdateUnreadStatus -> onUpdateUnreadStatus(result) is EmailDetailResult.MoveEmailThread -> onMoveEmailThread(result) is EmailDetailResult.DownloadFile -> onDownloadedFile(result) + is EmailDetailResult.ReadEmails -> onReadEmails(result) } } @@ -283,6 +284,16 @@ class EmailDetailSceneController(private val scene: EmailDetailScene, } } + private fun onReadEmails(result: EmailDetailResult.ReadEmails){ + when(result){ + is EmailDetailResult.ReadEmails.Success -> { + if(model.doReply){ + emailHolderEventListener.onReplyBtnClicked() + } + } + } + } + private fun updateAttachmentProgress(emailId: Long, filetoken: String, progress: Int){ val emailIndex = model.emails.indexOfFirst { it.email.id == emailId } if (emailIndex < 0) return diff --git a/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneModel.kt b/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneModel.kt index 8623c261f..13ac9ad99 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneModel.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/emaildetail/EmailDetailSceneModel.kt @@ -13,7 +13,8 @@ import com.criptext.mail.utils.virtuallist.VirtualList class EmailDetailSceneModel(val threadId: String, val currentLabel: Label, - var threadPreview: EmailPreview) : SceneModel { + var threadPreview: EmailPreview, + val doReply: Boolean = false) : SceneModel { val emails = ArrayList() val fileDetails = HashMap>() } diff --git a/src/main/kotlin/com/criptext/mail/scenes/mailbox/MailboxSceneController.kt b/src/main/kotlin/com/criptext/mail/scenes/mailbox/MailboxSceneController.kt index ed4d836c1..c20352c50 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/mailbox/MailboxSceneController.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/mailbox/MailboxSceneController.kt @@ -28,6 +28,7 @@ import android.content.Intent import com.criptext.mail.ExternalActivityParams import com.criptext.mail.push.data.IntentExtrasData import com.criptext.mail.push.services.LinkDeviceActionService +import com.criptext.mail.push.services.NewMailActionService import com.criptext.mail.scenes.signin.data.LinkStatusData @@ -340,6 +341,11 @@ class MailboxSceneController(private val scene: MailboxScene, "", "", extrasDevice.deviceType) generalDataSource.submitRequest(GeneralRequest.LinkAccept(untrustedDeviceInfo)) } + NewMailActionService.REPLY -> { + val extrasMail = extras as IntentExtrasData.IntentExtrasReply + dataSource.submitRequest(MailboxRequest.GetEmailPreview(threadId = extrasMail.threadId, + userEmail = activeAccount.userEmail, doReply = true)) + } } } @@ -688,7 +694,8 @@ class MailboxSceneController(private val scene: MailboxScene, reloadMailboxThreads() feedController.reloadFeeds() host.goToScene(EmailDetailParams(threadId = result.emailPreview.threadId, - currentLabel = model.selectedLabel, threadPreview = result.emailPreview), true) + currentLabel = model.selectedLabel, threadPreview = result.emailPreview, + doReply = result.doReply), true) } is MailboxResult.GetEmailPreview.Failure -> { dataSourceController.updateMailbox(model.selectedLabel) diff --git a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/GetEmailPreviewWorker.kt b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/GetEmailPreviewWorker.kt index 2b40104a8..acf2bb54f 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/GetEmailPreviewWorker.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/GetEmailPreviewWorker.kt @@ -5,6 +5,7 @@ import com.criptext.mail.bgworker.ProgressReporter import com.criptext.mail.db.MailboxLocalDB import com.criptext.mail.db.models.Label import com.criptext.mail.email_preview.EmailPreview +import com.criptext.mail.push.data.IntentExtrasData import com.criptext.mail.utils.EmailThreadValidator import com.github.kittinunf.result.Result @@ -15,6 +16,7 @@ import com.github.kittinunf.result.Result class GetEmailPreviewWorker(private val threadId:String, private val mailboxLocalDB: MailboxLocalDB, + private val doReply: Boolean = false, private val userEmail: String, override val publishFn: (MailboxResult.GetEmailPreview) -> Unit) : BackgroundWorker { @@ -38,7 +40,8 @@ class GetEmailPreviewWorker(private val threadId:String, MailboxResult.GetEmailPreview.Success( emailPreview = EmailPreview.fromEmailThread(emailThreadResult.value), isTrash = EmailThreadValidator.isLabelInList(labels, Label.LABEL_TRASH), - isSpam = EmailThreadValidator.isLabelInList(labels, Label.LABEL_SPAM)) + isSpam = EmailThreadValidator.isLabelInList(labels, Label.LABEL_SPAM), + doReply = doReply) } is Result.Failure -> { catchException(emailThreadResult.error) diff --git a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxDataSource.kt b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxDataSource.kt index 89f226d2e..fcb7e2381 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxDataSource.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxDataSource.kt @@ -117,6 +117,7 @@ class MailboxDataSource( threadId = params.threadId, mailboxLocalDB = mailboxLocalDB, userEmail = params.userEmail, + doReply = params.doReply, publishFn = { result -> flushResults(result) }) diff --git a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxRequest.kt b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxRequest.kt index 12c49e4d8..f9eac5173 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxRequest.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxRequest.kt @@ -45,7 +45,7 @@ sealed class MailboxRequest{ val updateUnreadStatus: Boolean, val currentLabel: Label): MailboxRequest() - data class GetEmailPreview(val threadId: String, val userEmail: String): MailboxRequest() + data class GetEmailPreview(val threadId: String, val userEmail: String, val doReply: Boolean = false): MailboxRequest() class EmptyTrash: MailboxRequest() diff --git a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxResult.kt b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxResult.kt index 6e31f5378..fd8ec3c39 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxResult.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/mailbox/data/MailboxResult.kt @@ -83,7 +83,8 @@ sealed class MailboxResult { sealed class GetEmailPreview: MailboxResult() { data class Success(val emailPreview: EmailPreview, - val isTrash: Boolean, val isSpam: Boolean): GetEmailPreview() + val isTrash: Boolean, val isSpam: Boolean, + val doReply: Boolean = false): GetEmailPreview() data class Failure(val message: String): GetEmailPreview() } diff --git a/src/main/kotlin/com/criptext/mail/scenes/params/EmailDetailParams.kt b/src/main/kotlin/com/criptext/mail/scenes/params/EmailDetailParams.kt index 7590c5a07..822b2bd51 100644 --- a/src/main/kotlin/com/criptext/mail/scenes/params/EmailDetailParams.kt +++ b/src/main/kotlin/com/criptext/mail/scenes/params/EmailDetailParams.kt @@ -10,6 +10,7 @@ import com.criptext.mail.email_preview.EmailPreview class EmailDetailParams(val threadId: String, val currentLabel: Label, - val threadPreview: EmailPreview): SceneParams() { + val threadPreview: EmailPreview, + val doReply: Boolean = false): SceneParams() { override val activityClass = EmailDetailActivity::class.java } diff --git a/src/main/kotlin/com/criptext/mail/utils/EmailAddressUtils.kt b/src/main/kotlin/com/criptext/mail/utils/EmailAddressUtils.kt index 7c0931281..a5b3bed2f 100644 --- a/src/main/kotlin/com/criptext/mail/utils/EmailAddressUtils.kt +++ b/src/main/kotlin/com/criptext/mail/utils/EmailAddressUtils.kt @@ -35,7 +35,7 @@ object EmailAddressUtils { leftBracket > 0 -> contactAddress.substring(0, leftBracket - 1) contactAddress.contains("@") -> contactAddress.split("@")[0] else -> contactAddress - } + }.removeSurrounding("'") return realName.replace("\"", "") .replace("<", "") .replace(">", "") diff --git a/src/main/kotlin/com/criptext/mail/utils/HTMLUtils.kt b/src/main/kotlin/com/criptext/mail/utils/HTMLUtils.kt index 6bd570234..3e7fc81af 100644 --- a/src/main/kotlin/com/criptext/mail/utils/HTMLUtils.kt +++ b/src/main/kotlin/com/criptext/mail/utils/HTMLUtils.kt @@ -68,7 +68,7 @@ class HTMLUtils { } fun addCriptextFooter(body: String): String{ - val watermarkString = "


Sent with Criptext secure email" if(body.contains(watermarkString)) return body return body.plus(watermarkString) diff --git a/src/main/res/layout/open_full_mail_item.xml b/src/main/res/layout/open_full_mail_item.xml index e206f8c2e..f5c8eaaf6 100644 --- a/src/main/res/layout/open_full_mail_item.xml +++ b/src/main/res/layout/open_full_mail_item.xml @@ -92,7 +92,7 @@ android:id="@+id/to" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:maxWidth="100dp" + android:maxWidth="150dp" android:text="To me, Allison, Daniel, Natasha" android:layout_toEndOf="@+id/check" android:layout_centerVertical="true" diff --git a/src/test/java/com/criptext/mail/mocks/MockedKeyValueStorage.kt b/src/test/java/com/criptext/mail/mocks/MockedKeyValueStorage.kt index 4f0baab76..37658886d 100644 --- a/src/test/java/com/criptext/mail/mocks/MockedKeyValueStorage.kt +++ b/src/test/java/com/criptext/mail/mocks/MockedKeyValueStorage.kt @@ -6,6 +6,13 @@ import com.criptext.mail.db.KeyValueStorage * Created by gabriel on 3/8/18. */ class MockedKeyValueStorage: KeyValueStorage { + override fun getInt(key: KeyValueStorage.StringKey, default: Int): Int { + return intMap[key.stringKey] ?: default + } + + override fun putInt(key: KeyValueStorage.StringKey, value: Int) { + intMap[key.stringKey] = value + } override fun getLong(key: KeyValueStorage.StringKey, default: Long): Long { return longMap[key.stringKey] ?: default @@ -31,6 +38,7 @@ class MockedKeyValueStorage: KeyValueStorage { private val stringSetMap = HashMap>() private val stringMap = HashMap() private val longMap = HashMap() + private val intMap = HashMap() override fun getString(key: KeyValueStorage.StringKey, default: String): String { return stringMap[key.stringKey] ?: default }