This commit is contained in:
Mariotaku Lee 2017-10-02 00:45:13 +08:00
parent 8f18ba3b5f
commit 05be207e86
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
4 changed files with 76 additions and 50 deletions

View File

@ -56,6 +56,7 @@ import org.mariotaku.chameleon.ChameleonUtils
import org.mariotaku.kpreferences.get
import org.mariotaku.ktextension.mapToArray
import org.mariotaku.ktextension.setItemAvailability
import org.mariotaku.ktextension.setItemTitle
import org.mariotaku.ktextension.spannable
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog
@ -219,10 +220,11 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
override fun onPrepareOptionsMenu(menu: Menu) {
menu.setItemAvailability(R.id.clear_messages, true)
menu.setItemAvailability(R.id.leave_conversation, true)
if (adapter.conversation?.conversation_extras_type == ExtrasType.TWITTER_OFFICIAL) {
menu.setItemAvailability(R.id.leave_conversation, true)
menu.setItemTitle(R.id.leave_conversation, R.string.action_leave_conversation)
} else {
menu.setItemAvailability(R.id.leave_conversation, false)
menu.setItemTitle(R.id.leave_conversation, R.string.action_clear_messages_and_delete_conversation)
}
}

View File

@ -26,6 +26,7 @@ import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.extension.queryReference
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableMessageConversation
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
@ -49,47 +50,58 @@ class ClearMessagesTask(
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)
val messagesWhere = Expression.and(Expression.equalsArgs(Messages.ACCOUNT_KEY),
Expression.equalsArgs(Messages.CONVERSATION_ID)).sql
val messagesWhereArgs = arrayOf(accountKey.toString(), conversationId)
val projection = arrayOf(Messages.MESSAGE_ID)
val messageIds = mutableListOf<String>()
context.contentResolver.queryReference(Messages.CONTENT_URI, projection, messagesWhere,
messagesWhereArgs, null)?.use { (cur) ->
cur.moveToFirst()
while (!cur.isAfterLast) {
val messageId = cur.getString(0)
try {
if (DestroyMessageTask.performDestroyMessage(context, microBlog, account,
messageId)) {
messageIds.add(messageId)
}
} catch (e: MicroBlogException) {
// Ignore
}
cur.moveToNext()
}
}
ContentResolverUtils.bulkDelete(context.contentResolver, Messages.CONTENT_URI,
Messages.MESSAGE_ID, false, messageIds, messagesWhere, messagesWhereArgs)
val conversationWhere = Expression.and(Expression.equalsArgs(Messages.Conversations.ACCOUNT_KEY),
Expression.equalsArgs(Messages.Conversations.CONVERSATION_ID)).sql
val conversationWhereArgs = arrayOf(accountKey.toString(), conversationId)
context.contentResolver.updateItems(Messages.Conversations.CONTENT_URI,
Messages.Conversations.COLUMNS, conversationWhere, conversationWhereArgs,
cls = ParcelableMessageConversation::class.java) { item ->
item.message_extras = null
item.message_type = null
item.message_timestamp = -1L
item.text_unescaped = null
item.media = null
return@updateItems item
}
clearMessages(context, account, conversationId)
return true
}
override fun afterExecute(callback: ((Boolean) -> Unit)?, result: Boolean?, exception: MicroBlogException?) {
callback?.invoke(result ?: false)
}
companion object {
fun clearMessages(context: Context, account: AccountDetails, conversationId: String): Boolean {
val microBlog = account.newMicroBlogInstance(context, cls = MicroBlog::class.java)
val messagesWhere = Expression.and(Expression.equalsArgs(Messages.ACCOUNT_KEY),
Expression.equalsArgs(Messages.CONVERSATION_ID)).sql
val messagesWhereArgs = arrayOf(account.key.toString(), conversationId)
val projection = arrayOf(Messages.MESSAGE_ID)
val messageIds = mutableListOf<String>()
var allSuccess = true
context.contentResolver.queryReference(Messages.CONTENT_URI, projection, messagesWhere,
messagesWhereArgs, null)?.use { (cur) ->
cur.moveToFirst()
while (!cur.isAfterLast) {
val messageId = cur.getString(0)
try {
if (DestroyMessageTask.performDestroyMessage(context, microBlog, account,
messageId)) {
messageIds.add(messageId)
}
} catch (e: MicroBlogException) {
allSuccess = false
// Ignore
}
cur.moveToNext()
}
}
ContentResolverUtils.bulkDelete(context.contentResolver, Messages.CONTENT_URI,
Messages.MESSAGE_ID, false, messageIds, messagesWhere, messagesWhereArgs)
val conversationWhere = Expression.and(Expression.equalsArgs(Messages.Conversations.ACCOUNT_KEY),
Expression.equalsArgs(Messages.Conversations.CONVERSATION_ID)).sql
val conversationWhereArgs = arrayOf(account.key.toString(), conversationId)
context.contentResolver.updateItems(Messages.Conversations.CONTENT_URI,
Messages.Conversations.COLUMNS, conversationWhere, conversationWhereArgs,
cls = ParcelableMessageConversation::class.java) { item ->
item.message_extras = null
item.message_type = null
item.message_timestamp = -1L
item.text_unescaped = null
item.media = null
return@updateItems item
}
return allSuccess
}
}
}

View File

@ -28,6 +28,7 @@ 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.ParcelableMessageConversation
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.provider.TwidereDataStore.Messages
@ -53,21 +54,31 @@ class DestroyConversationTask(
val microBlog = account.newMicroBlogInstance(context, cls = MicroBlog::class.java)
val conversation = DataStoreUtils.findMessageConversation(context, accountKey, conversationId)
var deleteMessages = true
var deleteConversation = true
// Only perform real deletion when it's not temp conversation (stored locally)
if (conversation == null || !conversation.is_temp) {
if (!performDestroyConversation(microBlog, account)) {
if (conversation != null) when {
conversation.conversation_extras_type != ParcelableMessageConversation.ExtrasType.TWITTER_OFFICIAL -> {
deleteMessages = false
deleteConversation = ClearMessagesTask.clearMessages(context, account, conversationId)
}
!conversation.is_temp -> if (!requestDestroyConversation(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)
if (deleteMessages) {
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)
}
if (deleteConversation) {
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
}
@ -75,7 +86,7 @@ class DestroyConversationTask(
callback?.invoke(result ?: false)
}
private fun performDestroyConversation(microBlog: MicroBlog, account: AccountDetails): Boolean {
private fun requestDestroyConversation(microBlog: MicroBlog, account: AccountDetails): Boolean {
when (account.type) {
AccountType.TWITTER -> {
if (account.isOfficial(context)) {

View File

@ -39,6 +39,7 @@
<string name="action_change_language">Change language</string>
<string name="action_clear">Clear</string>
<string name="action_clear_messages">Clear messages</string>
<string name="action_clear_messages_and_delete_conversation">Clear and delete conversation</string>
<string name="action_comment">Comment</string>
<string name="action_compose">Compose</string>
<string name="action_compose_message_convert_to_status">Convert to tweet</string>