aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt
blob: 3b52185f934446f3dc714f8d685386f425f5295b (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package net.lacolaco.smileessence.view.page

import android.os.Bundle
import android.text.Spannable
import android.text.method.ArrowKeyMovementMethod
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import com.omadahealth.github.swipyrefreshlayout.library.SwipyRefreshLayout
import kotlinx.android.synthetic.main.page_fragment_search.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.data.PageInfo
import net.lacolaco.smileessence.entity.Tweet
import net.lacolaco.smileessence.twitter.TwitterTaskException
import net.lacolaco.smileessence.twitter.createSavedSearchAsync
import net.lacolaco.smileessence.twitter.destroySavedSearchAsync
import net.lacolaco.smileessence.twitter.doSearch
import net.lacolaco.smileessence.util.SystemServiceHelper
import net.lacolaco.smileessence.util.launchUi
import net.lacolaco.smileessence.view.Partials
import net.lacolaco.smileessence.view.PopupMenu
import net.lacolaco.smileessence.view.confirm
import java.util.*

class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.SearchPageInfo>() {
    override fun refresh() {
        if (pageInfo.query.isNotBlank())
            startSearch(pageInfo.query)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup,
                              savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.page_fragment_search, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setSwipeRefreshEnabled(pageInfo.query.isNotBlank())

        button_search_queries.setOnClickListener {
            if (world.savedSearches.isEmpty()) {
                world.notifyError("No saved searches")
                return@setOnClickListener
            }
            val popup = PopupMenu(activity, button_search_queries)
            val sss = ArrayList(world.savedSearches.values)
            for (ss in sss) {
                popup.add(ss.query) {
                    edittext_search.setText(ss.query)
                    startSearch(ss.query)
                }
            }
            popup.show()
        }
        button_search_execute.setOnClickListener {
            search()
        }
        button_search_save.setOnClickListener {
            saveQuery()
        }
        button_search_save.setOnLongClickListener {
            val text = edittext_search.text.toString()
            val ss = world.savedSearches.values.find { it.query == text }
            if (ss != null) {
                confirm(R.string.dialog_confirm_delete_query) {
                    launchUi {
                        try {
                            world.destroySavedSearchAsync(ss.id).await()
                            world.notify(R.string.notice_search_query_deleted)
                            world.savedSearches.remove(ss.id)
                        } catch (e: TwitterTaskException) {
                            world.notifyError("unable to delete search query")
                        }
                    }
                }
            }
            true
        }
        edittext_search.setOnFocusChangeListener { _, hasFocus ->
            if (!hasFocus)
                SystemServiceHelper.hideIM(activity, edittext_search)
        }
        edittext_search.setText(pageInfo.query)
        edittext_search.setOnEditorActionListener { _, i, keyEvent ->
            if (i == EditorInfo.IME_ACTION_SEARCH || keyEvent != null &&
                    keyEvent.action == KeyEvent.ACTION_DOWN &&
                    keyEvent.keyCode == KeyEvent.KEYCODE_ENTER) {
                search()
            }
            true
        }
        edittext_search.movementMethod = object : ArrowKeyMovementMethod() {
            override fun right(widget: TextView, buffer: Spannable): Boolean {
                //Don't move page
                return widget.selectionEnd == widget.length() || super.right(widget, buffer)
            }

            override fun left(widget: TextView, buffer: Spannable): Boolean {
                //Don't move page
                return widget.selectionStart == 0 || super.left(widget, buffer)
            }
        }

        refresh()
    }

    override fun onSwipeDown(view: SwipyRefreshLayout) {
        val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null
        runRefreshTask(pageInfo.query, sinceId = sinceId) {
            view.isRefreshing = false
        }
    }

    override fun onSwipeUp(view: SwipyRefreshLayout) {
        val maxId = if (adapter.sortedList.size > 0)
            adapter.sortedList[adapter.sortedList.size - 1].id - 1
        else
            null
        runRefreshTask(pageInfo.query, maxId = maxId) {
            view.isRefreshing = false
        }
    }

    override fun onBindItemView(item: Tweet, itemView: View) {
        Partials.getTweetView(item, world, activity, itemView)
    }

    override fun onCreateItemView(parent: ViewGroup): View {
        val layoutInflater = LayoutInflater.from(parent.context)
        return layoutInflater.inflate(R.layout.list_item_tweet, parent, false)
    }

    private fun saveQuery() = launchUi {
        val text = edittext_search.text.toString()
        try {
            val ss = world.createSavedSearchAsync(text).await()
            world.notify(R.string.notice_query_saved)
            world.savedSearches[ss.id] = ss
        } catch (e: TwitterTaskException) {
            world.notifyError("Query is not saved")
        }
    }

    private fun search() {
        startSearch(edittext_search.text.toString())
        SystemServiceHelper.hideIM(activity, edittext_search)
    }

    private fun startSearch(queryString: String) {
        pageInfo.query = queryString
        setSwipeRefreshEnabled(queryString.isNotBlank())
        adapter.sortedList.clear()
        if (queryString.isNotBlank()) {
            runRefreshTask(queryString) { }
        }
    }

    private fun runRefreshTask(query: String, sinceId: Long? = null, maxId: Long? = null,
                               onFinish: () -> Unit) = launchUi {
        try {
            val tweets = world.doSearch(query, sinceId = sinceId, maxId = maxId).await()
            adapter.sortedList.addAll(tweets)
            onFinish()
        } catch (e: TwitterTaskException) {
            world.notifyError(R.string.notice_error_search)
        }
    }
}