aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.kt
blob: 233b0850c092ae3a5ee675c4567755073cf28039 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package net.lacolaco.smileessence.view.dialog

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.dialog_status_detail.view.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.activity.MainActivity
import net.lacolaco.smileessence.entity.DirectMessage
import net.lacolaco.smileessence.twitter.TwitterTaskException
import net.lacolaco.smileessence.twitter.task.destroyMessageAsync
import net.lacolaco.smileessence.twitter.task.getUserAsync
import net.lacolaco.smileessence.util.*
import net.lacolaco.smileessence.view.DialogHelper
import net.lacolaco.smileessence.view.Partials
import net.lacolaco.smileessence.view.PopupMenu
import net.lacolaco.smileessence.view.adapter.MessageListAdapter
import net.lacolaco.smileessence.view.confirm

class MessageDetailDialogFragment : StackableDialogFragment() {
    private lateinit var message: DirectMessage

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val found = DirectMessage.fetch(arguments.getLong(KEY_MESSAGE_ID))
        if (found == null) {
            world.notifyError(R.string.notice_error_get_messages)
            dismiss()
            return
        }
        message = found
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        val view = inflater.inflate(R.layout.dialog_status_detail, container, false)

        val messageHeader = Partials.getDirectMessageView(message, world, activity, view.detail_current_status)
        messageHeader.isClickable = false

        //--- buttons
        view.button_status_detail_reply.setOnClickListener {
            DialogHelper.showDialog(activity, SendMessageDialogFragment.newInstance(message.sender))
        }
        view.button_status_detail_delete.setOnClickListener {
            confirm(R.string.dialog_confirm_commands) {
                launchBg {
                    try {
                        world.destroyMessageAsync(message.id).await()
                        world.notify(R.string.notice_message_delete_succeeded)
                    } catch (e: TwitterTaskException) {
                        world.notifyError(R.string.notice_message_delete_failed)
                    }
                }
                dismiss()
            }
        }
        // -- menu dialog
        view.button_status_detail_menu.setOnClickListener {
            val popup = PopupMenu(activity, view.button_status_detail_menu)
            popup.add(R.string.command_status_copy_text_to_clipboard) {
                SystemServiceHelper.copyToClipboard(activity, "message text", message.text)
                world.notify(R.string.notice_copy_clipboard)
            }
            popup.show()
        }

        // -- menu embedded in dialog
        val users = mutableListOf<String>()
        if (message.sender !== message.recipient)
            users += message.recipient.screenName
        users += message.entities.mentions
        for (screenName in users.distinct())
            view.embedded_menu_items.add("@$screenName") {
                val ref = ref(activity as MainActivity)
                launchUi {
                    try {
                        val user = world.getUserAsync(screenName).await()
                        DialogHelper.showDialog(ref.get(), UserDetailDialogFragment.newInstance(user))
                    } catch (e: TwitterTaskException) {
                        world.notifyError(R.string.notice_error_show_user)
                    }
                }
            }
        for (hashtag in message.entities.hashtags)
            view.embedded_menu_items.add("#$hashtag") {
                // XXX
                (activity as MainActivity).openPostPageAndAppendText(" #$hashtag")
            }
        for (url in message.entities.urlsExpanded + message.entities.mediaUrls)
            view.embedded_menu_items.add(url) {
                activity.browse(url)
            }
        if (view.embedded_menu_items.childCount == 0) {
            view.detail_dialog_divider_bottom.visibility = View.GONE
            view.embedded_menu_items.visibility = View.GONE
        }
        view.detail_dialog_divider_top.visibility = View.GONE
        view.button_status_detail_retweet.visibility = View.GONE
        view.button_status_detail_favorite.visibility = View.GONE

        val adapter = MessageListAdapter(activity, world)
        view.listview_status_detail_reply_to.adapter = adapter

        // TODO: 効率的な探索どうする
        val replyTo: DirectMessage? = null
        // FIXME
        // for (DirectMessage mes : DirectMessage.cached()) {
        //     if (message.getId() > mes.getId() &&
        //             message.getRecipient() == mes.getSender() &&
        //             message.getSender() == mes.getRecipient() &&
        //             (replyTo == null || replyTo.getId() < mes.getId())) {
        //         replyTo = mes;
        //     }
        // }
        if (replyTo != null) {
            view.listview_status_detail_reply_to.visibility = View.VISIBLE
            adapter.add(replyTo)
            adapter.updateForce()
        } else {
            view.listview_status_detail_reply_to.visibility = View.GONE
        }

        return view
    }

    companion object {
        private val KEY_MESSAGE_ID = "message_id"

        fun newInstance(message: DirectMessage): MessageDetailDialogFragment {
            val obj = MessageDetailDialogFragment()
            val args = Bundle()
            args.putLong(KEY_MESSAGE_ID, message.id)
            obj.arguments = args
            return obj
        }
    }
}