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.task.createSavedSearchAsync import net.lacolaco.smileessence.twitter.task.destroySavedSearchAsync import net.lacolaco.smileessence.twitter.task.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 twitter4j.Query import java.util.* class SearchPageFragment : RefreshableTimelinePageFragment() { 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 { 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 query = Query() query.query = pageInfo.query query.count = 200 query.resultType = Query.RECENT if (adapter.sortedList.size() > 0) { query.sinceId = adapter.sortedList[0].id } runRefreshTask(query) { view.isRefreshing = false } } override fun onSwipeUp(view: SwipyRefreshLayout) { val query = Query() query.query = pageInfo.query query.count = 200 query.resultType = Query.RECENT if (adapter.sortedList.size() > 0) { query.maxId = adapter.sortedList[adapter.sortedList.size() - 1].id - 1 } runRefreshTask(query) { view.isRefreshing = false } } override fun onBindItemView(item: Tweet, itemView: View) { Partials.getTweetView(item, world, activity, itemView, true) } override fun onCreateItemView(parent: ViewGroup): View { val layoutInflater = LayoutInflater.from(parent.context) return layoutInflater.inflate(R.layout.list_item_status, 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.put(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()) { val query = Query() query.query = queryString query.count = 200 query.resultType = Query.RECENT runRefreshTask(query) { } } } private fun runRefreshTask(query: Query, onFinish: () -> Unit) = launchUi { try { val tweets = world.doSearch(query).await() adapter.sortedList.addAll(tweets) onFinish() } catch (e: TwitterTaskException) { world.notifyError(R.string.notice_error_search) } } }