mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-07 15:28:51 +01:00
fixed #933
This commit is contained in:
parent
8f18ba3b5f
commit
05be207e86
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user