From a6cdf3217cb78d6fd896c04aac9006a287ae6aeb Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Sat, 18 Feb 2017 00:07:57 +0800 Subject: [PATCH] improved new dm conversation supports disable_notification --- .../TwitterOfficialConversationExtras.java | 3 ++ ...ParcelableMessageConversationExtensions.kt | 10 +++++ .../message/MessageNewConversationFragment.kt | 5 +-- .../twidere/loader/CacheUserSearchLoader.kt | 4 +- .../message/DestroyConversationTask.kt | 42 +++++++++++++++++-- .../task/twitter/message/GetMessagesTask.kt | 2 + .../util/ContentNotificationManager.kt | 5 ++- .../res/menu/menu_messages_conversation.xml | 23 ++++++++++ 8 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 twidere/src/main/res/menu/menu_messages_conversation.xml diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/TwitterOfficialConversationExtras.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/TwitterOfficialConversationExtras.java index 14f49bd3d..7fac2cd88 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/TwitterOfficialConversationExtras.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/message/conversation/TwitterOfficialConversationExtras.java @@ -49,6 +49,8 @@ public class TwitterOfficialConversationExtras extends ConversationExtras implem public long maxEntryTimestamp; @JsonField(name = "read_only") public boolean readOnly; + @JsonField(name = "notifications_disabled") + public boolean notificationsDisabled; @Override public String toString() { @@ -58,6 +60,7 @@ public class TwitterOfficialConversationExtras extends ConversationExtras implem ", status='" + status + '\'' + ", maxEntryTimestamp=" + maxEntryTimestamp + ", readOnly=" + readOnly + + ", notificationsDisabled=" + notificationsDisabled + "} " + super.toString(); } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/ParcelableMessageConversationExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/ParcelableMessageConversationExtensions.kt index bdf491992..c843a65c7 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/ParcelableMessageConversationExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/ParcelableMessageConversationExtensions.kt @@ -63,4 +63,14 @@ val ParcelableMessageConversation.readOnly: Boolean } } return false + } + +val ParcelableMessageConversation.notificationDisabled: Boolean + get() { + when (conversation_extras_type) { + ExtrasType.TWITTER_OFFICIAL -> { + return (conversation_extras as? TwitterOfficialConversationExtras)?.notificationsDisabled ?: false + } + } + return false } \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt index 7e4b76467..84175d0b1 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt @@ -149,10 +149,9 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks if (user != span.user) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CacheUserSearchLoader.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CacheUserSearchLoader.kt index c84c7ba72..86b77cf96 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CacheUserSearchLoader.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/loader/CacheUserSearchLoader.kt @@ -58,9 +58,9 @@ class CacheUserSearchLoader( c.close() val collator = Collator.getInstance() list.sortWith(Comparator { l, r -> - val compare = collator.compare(l.name, r.name) + val compare = collator.compare(r.name, l.name) if (compare != 0) return@Comparator compare - return@Comparator l.screen_name.compareTo(r.screen_name) + return@Comparator r.screen_name.compareTo(l.screen_name) }) } } \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/DestroyConversationTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/DestroyConversationTask.kt index a5b48d0bd..a2f2ba942 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/DestroyConversationTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/DestroyConversationTask.kt @@ -19,9 +19,19 @@ package org.mariotaku.twidere.task.twitter.message +import android.accounts.AccountManager import android.content.Context +import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlogException +import org.mariotaku.sqliteqb.library.Expression +import org.mariotaku.twidere.annotation.AccountType +import org.mariotaku.twidere.extension.model.isOfficial +import org.mariotaku.twidere.extension.model.newMicroBlogInstance +import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.UserKey +import org.mariotaku.twidere.model.util.AccountUtils +import org.mariotaku.twidere.provider.TwidereDataStore.Messages +import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations import org.mariotaku.twidere.task.ExceptionHandlingAbstractTask /** @@ -32,9 +42,35 @@ class DestroyConversationTask( context: Context, val accountKey: UserKey, val conversationId: String -) : ExceptionHandlingAbstractTask(context) { - override fun onExecute(params: Unit?) { - throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. +) : ExceptionHandlingAbstractTask(context) { + override fun onExecute(params: Unit?): Boolean { + val account = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey, true) ?: + throw MicroBlogException("No account") + val microBlog = account.newMicroBlogInstance(context, cls = MicroBlog::class.java) + if (!performDestroyConversation(microBlog, account)) { + return false + } + + val deleteMessageWhere = Expression.and(Expression.equalsArgs(Messages.ACCOUNT_KEY), + Expression.equalsArgs(Messages.CONVERSATION_ID)).sql + val deleteMessageWhereArgs = arrayOf(accountKey.toString(), conversationId) + context.contentResolver.delete(Messages.CONTENT_URI, deleteMessageWhere, deleteMessageWhereArgs) + val deleteConversationWhere = Expression.and(Expression.equalsArgs(Conversations.ACCOUNT_KEY), + Expression.equalsArgs(Conversations.CONVERSATION_ID)).sql + val deleteConversationWhereArgs = arrayOf(accountKey.toString(), conversationId) + context.contentResolver.delete(Conversations.CONTENT_URI, deleteConversationWhere, deleteConversationWhereArgs) + return true + } + + private fun performDestroyConversation(microBlog: MicroBlog, account: AccountDetails): Boolean { + when (account.type) { + AccountType.TWITTER -> { + if (account.isOfficial(context)) { + return microBlog.deleteDmConversation(conversationId).isSuccessful + } + } + } + return false } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt index dafbf12c7..589b24727 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/task/twitter/message/GetMessagesTask.kt @@ -414,6 +414,7 @@ class GetMessagesTask( this.maxEntryId = v.maxEntryId this.status = v.status this.readOnly = v.isReadOnly + this.notificationsDisabled = v.isNotificationsDisabled val maxEntryTimestamp = messagesMap.findLastReadTimestamp(k, maxEntryId) if (maxEntryTimestamp > 0) { this.maxEntryTimestamp = maxEntryTimestamp @@ -509,6 +510,7 @@ class GetMessagesTask( this.participants = participants + ParcelableUserUtils.fromUser(user, accountKey) } } + participants.sortBy(ParcelableUser::screen_name) } private fun Map>.findLastReadTimestamp(conversationId: String, lastReadEventId: String?): Long { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/ContentNotificationManager.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ContentNotificationManager.kt index 4d79e9775..74521d385 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/ContentNotificationManager.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ContentNotificationManager.kt @@ -43,6 +43,7 @@ import org.mariotaku.twidere.constant.iWantMyStarsBackKey import org.mariotaku.twidere.constant.nameFirstKey import org.mariotaku.twidere.extension.model.getConversationName import org.mariotaku.twidere.extension.model.getSummaryText +import org.mariotaku.twidere.extension.model.notificationDisabled import org.mariotaku.twidere.extension.rawQuery import org.mariotaku.twidere.model.* import org.mariotaku.twidere.model.util.ParcelableActivityUtils @@ -294,6 +295,7 @@ class ContentNotificationManager( builder.setContentTitle(notificationTitle) val remaining = cur.forEachRow(5) { cur, pos -> val conversation = indices.newObject(cur) + if (conversation.notificationDisabled) return@forEachRow false val title = conversation.getConversationName(context, userColorNameManager, nameFirst) val summary = conversation.getSummaryText(context, userColorNameManager, nameFirst) val line = SpanFormatter.format(context.getString(R.string.title_summary_line_format), @@ -304,6 +306,7 @@ class ContentNotificationManager( style.addLine(line) return@forEachRow true } + if (remaining < 0) return if (remaining > 0) { style.addLine(context.getString(R.string.and_N_more, remaining)) } @@ -323,7 +326,7 @@ class ContentNotificationManager( var current = 0 while (!isAfterLast) { if (limit >= 0 && current >= limit) break - if (action(this, position)) { + if (action(this, current)) { current++ } moveToNext() diff --git a/twidere/src/main/res/menu/menu_messages_conversation.xml b/twidere/src/main/res/menu/menu_messages_conversation.xml new file mode 100644 index 000000000..6fd9fce83 --- /dev/null +++ b/twidere/src/main/res/menu/menu_messages_conversation.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file