From f665318eb6982973eabb5055cf42530b2415c90a Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sat, 11 Feb 2017 14:50:17 +0800 Subject: [PATCH] added date displaying for DM improved DM time --- .../adapter/MessagesConversationAdapter.kt | 23 +++++++++++++--- ...ParcelableMessageConversationExtensions.kt | 1 + .../fragment/MessagesConversationFragment.kt | 4 +-- .../fragment/MessagesEntriesFragment.kt | 2 +- .../model/util/ParcelableMessageUtils.kt | 24 +++++++++++++---- .../mariotaku/twidere/task/GetMessagesTask.kt | 21 +++++++++------ .../twidere/util/AsyncTwitterWrapper.kt | 6 ++--- .../twidere/util/HttpClientFactory.kt | 2 -- .../holder/message/AbsMessageViewHolder.kt | 3 ++- .../view/holder/message/MessageViewHolder.kt | 27 ++++++++++++++++--- .../message/StickerMessageViewHolder.kt | 4 +-- .../list_item_message_conversation_text.xml | 21 +++++++++++---- 12 files changed, 101 insertions(+), 37 deletions(-) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/MessagesConversationAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/MessagesConversationAdapter.kt index 84b8e1335..977353627 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/MessagesConversationAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/MessagesConversationAdapter.kt @@ -23,17 +23,20 @@ import android.content.Context import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup +import org.apache.commons.lang3.time.DateUtils import org.mariotaku.twidere.adapter.iface.IItemCountsAdapter +import org.mariotaku.twidere.extension.model.timestamp import org.mariotaku.twidere.model.ItemCounts import org.mariotaku.twidere.model.ParcelableMessage import org.mariotaku.twidere.model.ParcelableMessage.MessageType import org.mariotaku.twidere.view.holder.message.AbsMessageViewHolder import org.mariotaku.twidere.view.holder.message.MessageViewHolder import org.mariotaku.twidere.view.holder.message.StickerMessageViewHolder +import java.util.* class MessagesConversationAdapter(context: Context) : LoadMoreSupportAdapter(context), IItemCountsAdapter { - + private val calendars = Pair(Calendar.getInstance(), Calendar.getInstance()) override val itemCounts: ItemCounts = ItemCounts(1) var messages: List? = null set(value) { @@ -59,14 +62,24 @@ class MessagesConversationAdapter(context: Context) : LoadMoreSupportAdapter { - (holder as AbsMessageViewHolder).display(getMessage(position)!!) + val message = getMessage(position)!! + // Display date for oldest item + var showDate = true + // ... or if current message is > 1 day newer than previous one + if (position < itemCounts.getItemStartPosition(ITEM_START_MESSAGE) + + itemCounts[ITEM_START_MESSAGE] - 1) { + calendars.first.timeInMillis = getMessage(position + 1)!!.timestamp + calendars.second.timeInMillis = message.timestamp + showDate = !DateUtils.isSameDay(calendars.first, calendars.second) + } + (holder as AbsMessageViewHolder).display(message, showDate) } } } override fun getItemCount(): Int { - itemCounts[0] = messages?.size ?: 0 + itemCounts[ITEM_START_MESSAGE] = messages?.size ?: 0 return itemCounts.itemCount } @@ -76,7 +89,7 @@ class MessagesConversationAdapter(context: Context) : LoadMoreSupportAdapter { + ITEM_START_MESSAGE -> { when (getMessage(position)!!.message_type) { MessageType.STICKER -> { return ITEM_TYPE_STICKER_MESSAGE @@ -89,6 +102,8 @@ class MessagesConversationAdapter(context: Context) : LoadMoreSupportAdapter Unit>(context) { - override fun doLongOperation(param: RefreshTaskParam) { +class GetMessagesTask( + context: Context +) : BaseAbstractTask Unit>(context) { + override fun doLongOperation(param: RefreshMessagesTaskParam) { val accountKeys = param.accountKeys val am = AccountManager.get(context) accountKeys.forEachIndexed { i, accountKey -> @@ -121,13 +123,13 @@ class GetMessagesTask(context: Context) : BaseAbstractTask - val message = ParcelableMessageUtils.incomingMessage(accountKey, dm) + received.forEachIndexed { i, dm -> + val message = ParcelableMessageUtils.incomingMessage(accountKey, dm, 1.0 - (i.toDouble() / received.size)) insertMessages.add(message) conversations.addConversation(details, message, dm.sender, dm.recipient) } - sent.forEach { dm -> - val message = ParcelableMessageUtils.outgoingMessage(accountKey, dm) + sent.forEachIndexed { i, dm -> + val message = ParcelableMessageUtils.outgoingMessage(accountKey, dm, 1.0 - (i.toDouble() / sent.size)) insertMessages.add(message) conversations.addConversation(details, message, dm.sender, dm.recipient) } @@ -225,7 +227,6 @@ class GetMessagesTask(context: Context) : BaseAbstractTask Array ) : RefreshMessagesTaskParam(context, getAccountKeys) { - override val sinceIds: Array? get() { val keys = accounts.map { account -> @@ -252,7 +253,6 @@ class GetMessagesTask(context: Context) : BaseAbstractTask Array ) : RefreshMessagesTaskParam(context, getAccountKeys) { - override val maxIds: Array? get() { val keys = accounts.map { account -> @@ -279,6 +279,11 @@ class GetMessagesTask(context: Context) : BaseAbstractTask Array ) : SimpleRefreshTaskParam() { + /** + * If `conversationId` has value, load messages in conversationId + */ + open var conversationId: String? = null + protected val accounts: Array by lazy { AccountUtils.getAllAccountDetails(AccountManager.get(context), accountKeys, false) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AsyncTwitterWrapper.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AsyncTwitterWrapper.kt index dfdaec538..0a909ec40 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/AsyncTwitterWrapper.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/AsyncTwitterWrapper.kt @@ -240,7 +240,7 @@ class AsyncTwitterWrapper( TaskStarter.execute(task) } - fun getMessagesAsync(param: RefreshTaskParam) { + fun getMessagesAsync(param: GetMessagesTask.RefreshMessagesTaskParam) { val task = GetMessagesTask(context) task.params = param TaskStarter.execute(task) @@ -293,9 +293,7 @@ class AsyncTwitterWrapper( }) } if (preferences.getBoolean(SharedPreferenceConstants.KEY_HOME_REFRESH_DIRECT_MESSAGES)) { - getMessagesAsync(object : SimpleRefreshTaskParam() { - override val accountKeys: Array by lazy { action() } - }) + getMessagesAsync(GetMessagesTask.RefreshMessagesTaskParam(context, action)) } if (preferences.getBoolean(SharedPreferenceConstants.KEY_HOME_REFRESH_SAVED_SEARCHES)) { getSavedSearchesAsync(action()) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/HttpClientFactory.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/HttpClientFactory.kt index 91cc12a7a..552bbef0c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/HttpClientFactory.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/HttpClientFactory.kt @@ -1,6 +1,5 @@ package org.mariotaku.twidere.util -import android.annotation.SuppressLint import android.content.Context import android.text.TextUtils.isEmpty import okhttp3.ConnectionPool @@ -34,7 +33,6 @@ object HttpClientFactory { DebugModeUtils.initForOkHttpClient(builder) } - @SuppressLint("SSLCertificateSocketFactoryGetInsecure") internal fun updateHttpClientConfiguration(builder: OkHttpClient.Builder, conf: HttpClientConfiguration, dns: Dns, connectionPool: ConnectionPool) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/AbsMessageViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/AbsMessageViewHolder.kt index 5ab8d5c66..603159e69 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/AbsMessageViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/AbsMessageViewHolder.kt @@ -29,7 +29,8 @@ import org.mariotaku.twidere.model.ParcelableMessage */ abstract class AbsMessageViewHolder(itemView: View, val adapter: MessagesConversationAdapter) : RecyclerView.ViewHolder(itemView) { - open fun display(message: ParcelableMessage) { + + open fun display(message: ParcelableMessage, showDate: Boolean) { } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt index 1edadb724..8a5f9c6b8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/MessageViewHolder.kt @@ -20,8 +20,10 @@ package org.mariotaku.twidere.view.holder.message import android.support.v4.view.GravityCompat +import android.text.format.DateUtils import android.view.View import android.widget.FrameLayout +import android.widget.LinearLayout import kotlinx.android.synthetic.main.list_item_message_conversation_text.view.* import org.mariotaku.ktextension.isNullOrEmpty import org.mariotaku.messagebubbleview.library.MessageBubbleView @@ -36,16 +38,32 @@ import org.mariotaku.twidere.model.ParcelableMessage class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) : AbsMessageViewHolder(itemView, adapter) { + private val date by lazy { itemView.date } private val text by lazy { itemView.text } private val time by lazy { itemView.time } private val mediaPreview by lazy { itemView.mediaPreview } private val messageContent by lazy { itemView.messageContent } - override fun display(message: ParcelableMessage) { - super.display(message) + init { + val textSize = adapter.textSize + text.textSize = textSize + time.textSize = textSize * 0.8f + date.textSize = textSize * 0.9f + } + + override fun display(message: ParcelableMessage, showDate: Boolean) { + super.display(message, showDate) setOutgoingStatus(messageContent, message.is_outgoing) text.text = message.text_unescaped - time.time = message.timestamp + if (showDate) { + date.visibility = View.VISIBLE + date.text = DateUtils.getRelativeTimeSpanString(message.timestamp, System.currentTimeMillis(), + DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_SHOW_DATE) + } else { + date.visibility = View.GONE + } + time.text = DateUtils.formatDateTime(adapter.context, message.timestamp, + DateUtils.FORMAT_SHOW_TIME) if (message.media.isNullOrEmpty()) { mediaPreview.visibility = View.GONE } else { @@ -69,6 +87,9 @@ class MessageViewHolder(itemView: View, adapter: MessagesConversationAdapter) : is FrameLayout.LayoutParams -> { lp.gravity = if (outgoing) GravityCompat.END else GravityCompat.START } + is LinearLayout.LayoutParams -> { + lp.gravity = if (outgoing) GravityCompat.END else GravityCompat.START + } } } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/StickerMessageViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/StickerMessageViewHolder.kt index 6ef76b7e3..c8fa6be0c 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/StickerMessageViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/message/StickerMessageViewHolder.kt @@ -35,8 +35,8 @@ class StickerMessageViewHolder(itemView: View, adapter: MessagesConversationAdap private val messageContent by lazy { itemView.messageContent } private val stickerIcon by lazy { itemView.stickerIcon } - override fun display(message: ParcelableMessage) { - super.display(message) + override fun display(message: ParcelableMessage, showDate: Boolean) { + super.display(message, showDate) MessageViewHolder.setMessageContentGravity(messageContent, message.is_outgoing) val extras = message.extras as StickerExtras adapter.mediaLoader.displayStickerImage(stickerIcon, extras.url) diff --git a/twidere/src/main/res/layout/list_item_message_conversation_text.xml b/twidere/src/main/res/layout/list_item_message_conversation_text.xml index b5320a82f..7c89fc734 100644 --- a/twidere/src/main/res/layout/list_item_message_conversation_text.xml +++ b/twidere/src/main/res/layout/list_item_message_conversation_text.xml @@ -17,14 +17,25 @@ ~ along with this program. If not, see . --> - + + - - \ No newline at end of file + \ No newline at end of file