supports destroy conversation

This commit is contained in:
Mariotaku Lee 2017-02-22 09:08:22 +08:00
parent 7edf73c7ff
commit 59c0e57add
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
13 changed files with 126 additions and 25 deletions

View File

@ -33,8 +33,8 @@ fun ParcelableMessageConversation.applyFrom(message: ParcelableMessage, details:
val ParcelableMessageConversation.timestamp: Long
get() = if (message_timestamp > 0) message_timestamp else local_timestamp
fun ParcelableMessageConversation.getConversationName(context: Context,
manager: UserColorNameManager, nameFirst: Boolean): Pair<String, String?> {
fun ParcelableMessageConversation.getTitle(context: Context, manager: UserColorNameManager,
nameFirst: Boolean): Pair<String, String?> {
if (conversation_type == ConversationType.ONE_TO_ONE) {
val user = this.user ?: return Pair(context.getString(R.string.title_direct_messages), null)
return Pair(user.name, "@${user.screen_name}")
@ -45,6 +45,12 @@ fun ParcelableMessageConversation.getConversationName(context: Context,
return Pair(participants.joinToString(separator = ", ") { manager.getDisplayName(it, nameFirst) }, null)
}
fun ParcelableMessageConversation.getSubtitle(context: Context): String {
val resources = context.resources
return resources.getQuantityString(R.plurals.N_message_participants, participants.size,
participants.size)
}
fun ParcelableMessageConversation.getSummaryText(context: Context, manager: UserColorNameManager,
nameFirst: Boolean): CharSequence? {
return getSummaryText(context, manager, nameFirst, message_type, message_extras, sender_key,

View File

@ -19,12 +19,15 @@
package org.mariotaku.twidere.fragment.message
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.support.v4.app.FragmentActivity
import android.support.v4.app.LoaderManager
import android.support.v4.content.AsyncTaskLoader
import android.support.v4.content.Loader
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.FixedLinearLayoutManager
import android.support.v7.widget.LinearLayoutManager
@ -35,6 +38,7 @@ import kotlinx.android.synthetic.main.activity_home_content.view.*
import kotlinx.android.synthetic.main.fragment_messages_conversation_info.*
import kotlinx.android.synthetic.main.header_message_conversation_info.view.*
import kotlinx.android.synthetic.main.layout_toolbar_message_conversation_title.*
import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.chameleon.Chameleon
import org.mariotaku.chameleon.ChameleonUtils
import org.mariotaku.kpreferences.get
@ -48,17 +52,23 @@ import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_CONVERSATION_ID
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.constant.profileImageStyleKey
import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.model.displayAvatarTo
import org.mariotaku.twidere.extension.model.getConversationName
import org.mariotaku.twidere.extension.model.getSubtitle
import org.mariotaku.twidere.extension.model.getTitle
import org.mariotaku.twidere.extension.model.notificationDisabled
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
import org.mariotaku.twidere.fragment.BaseDialogFragment
import org.mariotaku.twidere.fragment.BaseFragment
import org.mariotaku.twidere.fragment.ProgressDialogFragment
import org.mariotaku.twidere.fragment.iface.IToolBarSupportFragment
import org.mariotaku.twidere.fragment.message.MessageConversationInfoFragment.ConversationInfoAdapter.Companion.VIEW_TYPE_HEADER
import org.mariotaku.twidere.fragment.message.MessageConversationInfoFragment.ConversationInfoAdapter.Companion.VIEW_TYPE_SPACE
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.provider.TwidereDataStore.Messages.Conversations
import org.mariotaku.twidere.task.twitter.message.DestroyConversationTask
import org.mariotaku.twidere.view.holder.SimpleUserViewHolder
import java.lang.ref.WeakReference
/**
* Created by mariotaku on 2017/2/15.
@ -103,8 +113,8 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
appBarSubtitle.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationAvatar.setBackgroundColor(avatarBackground)
conversationName.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationSummary.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationTitle.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationSubtitle.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
loaderManager.initLoader(0, null, this)
@ -119,6 +129,20 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
inflater.inflate(R.menu.menu_messages_conversation_info, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.leave_conversation -> {
val df = DestroyConversationConfirmDialogFragment()
df.show(childFragmentManager, "destroy_conversation_confirm")
return true
}
R.id.delete_messages -> {
}
}
return false
}
override fun setupWindow(activity: FragmentActivity): Boolean {
return false
}
@ -137,15 +161,33 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
}
adapter.conversation = data
val name = data.getConversationName(context, userColorNameManager, preferences[nameFirstKey]).first
val summary = resources.getQuantityString(R.plurals.N_message_participants, data.participants.size, data.participants.size)
val name = data.getTitle(context, userColorNameManager, preferences[nameFirstKey]).first
val summary = data.getSubtitle(context)
data.displayAvatarTo(mediaLoader, conversationAvatar)
data.displayAvatarTo(mediaLoader, appBarIcon)
appBarTitle.text = name
appBarSubtitle.text = summary
conversationName.text = name
conversationSummary.text = summary
conversationTitle.text = name
conversationSubtitle.text = summary
}
private fun performDestroyConversation() {
ProgressDialogFragment.show(childFragmentManager, "leave_conversation_progress")
val weakThis = WeakReference(this)
val task = DestroyConversationTask(context, accountKey, conversationId)
task.callback = callback@ { succeed ->
val f = weakThis.get() ?: return@callback
f.executeAfterFragmentResumed { fragment ->
val df = fragment.childFragmentManager.findFragmentByTag("leave_conversation_progress") as? DialogFragment
df?.dismiss()
if (succeed) {
activity?.setResult(RESULT_CLOSE)
activity?.finish()
}
}
}
TaskStarter.execute(task)
}
class ConversationInfoLoader(
@ -285,4 +327,26 @@ class MessageConversationInfoFragment : BaseFragment(), IToolBarSupportFragment,
}
}
class DestroyConversationConfirmDialogFragment : BaseDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(context)
builder.setMessage(R.string.message_destroy_conversation_confirm)
builder.setPositiveButton(R.string.action_leave_conversation) { dialog, which ->
(parentFragment as MessageConversationInfoFragment).performDestroyConversation()
}
builder.setNegativeButton(android.R.string.cancel, null)
val dialog = builder.create()
dialog.setOnShowListener {
it as AlertDialog
it.applyTheme()
}
return dialog
}
}
companion object {
const val RESULT_CLOSE = 101
}
}

View File

@ -165,7 +165,7 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
}
conversationTitleContainer.setOnClickListener {
val intent = IntentUtils.messageConversationInfo(accountKey, conversationId)
startActivity(intent)
startActivityForResult(intent, REQUEST_MANAGE_CONVERSATION_INFO)
}
val activity = this.activity
@ -173,7 +173,8 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
activity.supportActionBar?.setDisplayShowTitleEnabled(false)
}
val theme = Chameleon.getOverrideTheme(context, activity)
conversationName.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationTitle.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationSubtitle.setTextColor(ChameleonUtils.getColorDependent(theme.colorToolbar))
conversationAvatar.style = preferences[profileImageStyleKey]
@ -211,6 +212,11 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
TaskStarter.execute(AddMediaTask(this, mediaUris))
}
}
REQUEST_MANAGE_CONVERSATION_INFO -> {
if (resultCode == MessageConversationInfoFragment.RESULT_CLOSE) {
activity?.finish()
}
}
}
}
@ -439,15 +445,16 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
private fun updateConversationStatus() {
val conversation = adapter.conversation ?: return
val name = conversation.getConversationName(context, userColorNameManager,
val title = conversation.getTitle(context, userColorNameManager,
preferences[nameFirstKey]).first
activity.title = name
activity.title = title
val readOnly = conversation.readOnly
addMedia.isEnabled = !readOnly
sendMessage.isEnabled = !readOnly
editText.isEnabled = !readOnly
conversationName.text = name
conversationTitle.text = title
conversationSubtitle.text = conversation.getSubtitle(context)
conversation.displayAvatarTo(mediaLoader, conversationAvatar)
}
@ -523,5 +530,9 @@ class MessagesConversationFragment : AbsContentListRecyclerViewFragment<Messages
}
}
companion object {
private const val REQUEST_MANAGE_CONVERSATION_INFO = 101
}
}

View File

@ -42,7 +42,8 @@ class DestroyConversationTask(
context: Context,
val accountKey: UserKey,
val conversationId: String
) : ExceptionHandlingAbstractTask<Unit?, Boolean, MicroBlogException, Unit?>(context) {
) : ExceptionHandlingAbstractTask<Unit?, Boolean, MicroBlogException, ((Boolean) -> Unit)?>(context) {
override fun onExecute(params: Unit?): Boolean {
val account = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey, true) ?:
throw MicroBlogException("No account")
@ -62,6 +63,11 @@ class DestroyConversationTask(
return true
}
override fun afterExecute(callback: ((Boolean) -> Unit)?, result: Boolean?, exception: MicroBlogException?) {
val succeed = result ?: false
callback?.invoke(succeed)
}
private fun performDestroyConversation(microBlog: MicroBlog, account: AccountDetails): Boolean {
when (account.type) {
AccountType.TWITTER -> {

View File

@ -41,7 +41,7 @@ import org.mariotaku.twidere.annotation.NotificationType
import org.mariotaku.twidere.constant.IntentConstants
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.getTitle
import org.mariotaku.twidere.extension.model.getSummaryText
import org.mariotaku.twidere.extension.model.notificationDisabled
import org.mariotaku.twidere.extension.rawQuery
@ -296,7 +296,7 @@ class ContentNotificationManager(
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 title = conversation.getTitle(context, userColorNameManager, nameFirst)
val summary = conversation.getSummaryText(context, userColorNameManager, nameFirst)
val line = SpanFormatter.format(context.getString(R.string.title_summary_line_format),
title.first, summary)

View File

@ -54,7 +54,7 @@ class MessageEntryViewHolder(itemView: View, val adapter: MessagesEntriesAdapter
} else {
content.drawEnd()
}
val (name, secondaryName) = conversation.getConversationName(itemView.context,
val (name, secondaryName) = conversation.getTitle(itemView.context,
adapter.userColorNameManager, adapter.nameFirst)
this.time.time = conversation.timestamp
this.name.name = name

View File

@ -91,7 +91,7 @@
app:behavior_childTransformation="org.mariotaku.twidere.util.view.ConversationTitlesTransformation"
app:behavior_dependencyViewId="@+id/appBarIcon"
app:behavior_marginStart="@dimen/element_spacing_normal"
app:behavior_targetViewId="@+id/conversationName"
app:behavior_targetViewId="@+id/conversationTitle"
app:behavior_toolbarId="@+id/toolbar"
app:layout_behavior="org.mariotaku.twidere.util.view.AppBarChildBehavior"
tools:text="Title"/>
@ -112,7 +112,7 @@
app:behavior_dependencyViewId="@+id/appBarIcon"
app:behavior_marginStart="@dimen/element_spacing_normal"
app:behavior_marginTop="@dimen/element_spacing_small"
app:behavior_targetViewId="@+id/conversationSummary"
app:behavior_targetViewId="@+id/conversationSubtitle"
app:behavior_toolbarId="@+id/toolbar"
app:layout_behavior="org.mariotaku.twidere.util.view.AppBarChildBehavior"
tools:text="Subtitle"/>

View File

@ -47,7 +47,7 @@
android:layout_gravity="center"
android:layout_margin="@dimen/element_spacing_normal"
android:scaleType="centerInside"
android:src="@drawable/ic_action_info"
android:src="@drawable/ic_action_list"
app:iabColor="?android:textColorSecondary"/>
</FrameLayout>

View File

@ -49,7 +49,7 @@
android:orientation="vertical">
<org.mariotaku.twidere.view.FixedTextView
android:id="@+id/conversationName"
android:id="@+id/conversationTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceMedium"
@ -57,7 +57,7 @@
tools:text="Conversation name"/>
<org.mariotaku.twidere.view.FixedTextView
android:id="@+id/conversationSummary"
android:id="@+id/conversationSubtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"

View File

@ -39,7 +39,7 @@
android:layout_centerVertical="true"
android:layout_margin="@dimen/element_spacing_normal"
android:scaleType="centerInside"
android:src="@drawable/ic_action_list"
android:src="@drawable/ic_action_users"
app:iabColor="?android:textColorSecondary"/>
<include

View File

@ -24,7 +24,7 @@
android:icon="@drawable/ic_action_delete"
android:title="@string/action_leave_conversation"/>
<item
android:id="@+id/clear_messages"
android:id="@+id/delete_messages"
android:icon="@drawable/ic_action_delete"
android:title="@string/action_delete_messages"/>
</menu>

View File

@ -1223,4 +1223,5 @@
<string name="users_statuses">User\'s tweets</string>
<string name="vibration">Vibration</string>
<string name="message_destroy_conversation_confirm">Leave this conversation?</string>
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 42 (36781) - http://www.bohemiancoding.com/sketch -->
<title>ic_action_users-mdpi</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Action-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="ic_action_users-mdpi">
<polygon id="Shape" points="4 4 28 4 28 28 4 28"></polygon>
<path d="M20,15 C21.66,15 22.99,13.66 22.99,12 C22.99,10.34 21.66,9 20,9 C18.34,9 17,10.34 17,12 C17,13.66 18.34,15 20,15 Z M12,15 C13.66,15 14.99,13.66 14.99,12 C14.99,10.34 13.66,9 12,9 C10.34,9 9,10.34 9,12 C9,13.66 10.34,15 12,15 Z M12,17 C9.67,17 5,18.17 5,20.5 L5,23 L19,23 L19,20.5 C19,18.17 14.33,17 12,17 Z M20,17 C19.71,17 19.38,17.02 19.03,17.05 C20.19,17.89 21,19.02 21,20.5 L21,23 L27,23 L27,20.5 C27,18.17 22.33,17 20,17 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB