supports destroy conversation
This commit is contained in:
parent
7edf73c7ff
commit
59c0e57add
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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 -> {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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 |
Loading…
Reference in New Issue