From 93632c36db6590506b514885cd2f3b4d4085f85d Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sat, 7 Apr 2018 00:28:18 +0200 Subject: [PATCH] Minor cleanup --- .../quasseldroid/ui/chat/ChatActivity.kt | 51 +++++----- .../quasseldroid/ui/chat/input/Editor.kt | 33 ++++--- .../ui/chat/input/MessageHistoryAdapter.kt | 12 ++- .../ui/chat/messages/MessageAdapter.kt | 29 ++++-- .../ui/chat/messages/MessageListFragment.kt | 96 +++++++++---------- .../ui}/RipplePassthroughTextView.kt | 2 +- .../res/layout/widget_chatmessage_action.xml | 2 +- .../layout/widget_chatmessage_daychange.xml | 2 +- .../res/layout/widget_chatmessage_error.xml | 2 +- .../res/layout/widget_chatmessage_info.xml | 2 +- .../res/layout/widget_chatmessage_notice.xml | 2 +- .../res/layout/widget_chatmessage_plain.xml | 4 +- .../res/layout/widget_chatmessage_server.xml | 2 +- 13 files changed, 131 insertions(+), 108 deletions(-) rename app/src/main/java/de/kuschku/quasseldroid/{ui/chat/messages => util/ui}/RipplePassthroughTextView.kt (94%) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 938998a31..ad38ab225 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -115,9 +115,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc editor = Editor( this, - viewModel.rawAutoCompleteData, - viewModel.autoCompleteData, - viewModel.lastWord, + viewModel, findViewById(R.id.chatline), findViewById(R.id.send), findViewById(R.id.tab_complete), @@ -129,35 +127,38 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc ircFormatDeserializer, appearanceSettings, autoCompleteSettings, - messageSettings, - { lines -> - viewModel.session { sessionOptional -> - val session = sessionOptional.orNull() - viewModel.buffer { bufferId -> - session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo -> - val output = mutableListOf<IAliasManager.Command>() - for ((stripped, formatted) in lines) { - viewModel.addRecentlySentMessage(stripped) - session.aliasManager?.processInput(bufferInfo, formatted, output) - } - for (command in output) { - session.rpcHandler?.sendInput(command.buffer, command.message) - } + messageSettings + ) + + editor.setOnSendListener { lines -> + viewModel.session { sessionOptional -> + val session = sessionOptional.orNull() + viewModel.buffer { bufferId -> + session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo -> + val output = mutableListOf<IAliasManager.Command>() + for ((stripped, formatted) in lines) { + viewModel.addRecentlySentMessage(stripped) + session.aliasManager?.processInput(bufferInfo, formatted, output) + } + for (command in output) { + session.rpcHandler?.sendInput(command.buffer, command.message) } } } - }, - { expanded -> - historyPanel.panelState = if (expanded) - SlidingUpPanelLayout.PanelState.EXPANDED - else - SlidingUpPanelLayout.PanelState.COLLAPSED } - ) + } + + editor.setOnPanelStateListener { expanded -> + historyPanel.panelState = if (expanded) + SlidingUpPanelLayout.PanelState.EXPANDED + else + SlidingUpPanelLayout.PanelState.COLLAPSED + } msgHistory.itemAnimator = DefaultItemAnimator() msgHistory.layoutManager = LinearLayoutManager(this) - val messageHistoryAdapter = MessageHistoryAdapter { text -> + val messageHistoryAdapter = MessageHistoryAdapter() + messageHistoryAdapter.setOnItemClickListener { text -> editor.formatHandler.replace(text) historyPanel.panelState = SlidingUpPanelLayout.PanelState.COLLAPSED } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt index cbb03c826..cbcbd45ec 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/Editor.kt @@ -19,9 +19,7 @@ import butterknife.BindView import butterknife.ButterKnife import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.quassel.syncables.IrcChannel -import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.util.IrcUserUtils -import de.kuschku.libquassel.util.Optional import de.kuschku.libquassel.util.flag.hasFlag import de.kuschku.libquassel.util.helpers.value import de.kuschku.quasseldroid.R @@ -34,18 +32,16 @@ import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.ui.ColorChooserDialog import de.kuschku.quasseldroid.util.ui.EditTextSelectionChange import de.kuschku.quasseldroid.util.ui.TextDrawable +import de.kuschku.quasseldroid.viewmodel.QuasselViewModel import de.kuschku.quasseldroid.viewmodel.data.AutoCompleteItem import de.kuschku.quasseldroid.viewmodel.data.BufferStatus -import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject class Editor( // Contexts activity: AppCompatActivity, // LiveData - private val autoCompleteDataRaw: Observable<Triple<Optional<ISession>, Int, Pair<String, IntRange>>>, - private val autoCompleteData: Observable<Pair<String, List<AutoCompleteItem>>>, - lastWordContainer: BehaviorSubject<Observable<Pair<String, IntRange>>>, + private val viewModel: QuasselViewModel, // Views val chatline: EditTextSelectionChange, send: AppCompatImageButton, @@ -57,14 +53,23 @@ class Editor( // Settings private val appearanceSettings: AppearanceSettings, private val autoCompleteSettings: AutoCompleteSettings, - private val messageSettings: MessageSettings, + private val messageSettings: MessageSettings // Listeners - private val sendCallback: (Sequence<Pair<CharSequence, String>>) -> Unit, - private val panelStateCallback: (Boolean) -> Unit ) : ActionMenuView.OnMenuItemClickListener, Toolbar.OnMenuItemClickListener { + private var sendListener: ((Sequence<Pair<CharSequence, String>>) -> Unit)? = null + private var panelStateListener: ((Boolean) -> Unit)? = null + + fun setOnSendListener(listener: (Sequence<Pair<CharSequence, String>>) -> Unit) { + this.sendListener = listener + } + + fun setOnPanelStateListener(listener: (Boolean) -> Unit) { + this.panelStateListener = listener + } + override fun onMenuItemClick(item: MenuItem?) = when (item?.itemId) { R.id.action_input_history -> { - panelStateCallback(true) + panelStateListener?.invoke(true) true } else -> false @@ -171,7 +176,7 @@ class Editor( formatHandler::autoComplete ) - autoCompleteData.toLiveData().observe(activity, Observer { + viewModel.autoCompleteData.toLiveData().observe(activity, Observer { val query = it?.first ?: "" val shouldShowResults = (autoCompleteSettings.auto && query.length >= 3) || (autoCompleteSettings.prefix && query.startsWith('@')) || @@ -262,7 +267,7 @@ class Editor( autoComplete() } - lastWordContainer.onNext(lastWord) + viewModel.lastWord.onNext(lastWord) activity.menuInflater.inflate(R.menu.editor, formattingToolbar.menu) formattingToolbar.menu.retint(activity) @@ -465,7 +470,7 @@ class Editor( private fun send() { if (rawText.isNotBlank()) { - sendCallback(strippedText.lineSequence().zip(formattedText)) + sendListener?.invoke(strippedText.lineSequence().zip(formattedText)) } chatline.setText("") } @@ -484,7 +489,7 @@ class Editor( } private fun autoCompleteDataFull(): List<AutoCompleteItem> { - return autoCompleteDataRaw.value?.let { (sessionOptional, id, lastWord) -> + return viewModel.rawAutoCompleteData.value?.let { (sessionOptional, id, lastWord) -> val session = sessionOptional.orNull() val bufferInfo = session?.bufferSyncer?.bufferInfo(id) session?.networks?.let { networks -> diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/MessageHistoryAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/MessageHistoryAdapter.kt index 7163ee05e..68a1653c3 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/MessageHistoryAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/MessageHistoryAdapter.kt @@ -11,9 +11,7 @@ import butterknife.BindView import butterknife.ButterKnife import de.kuschku.quasseldroid.R -class MessageHistoryAdapter( - private val clickListener: ((CharSequence) -> Unit)? = null -) : ListAdapter<CharSequence, MessageHistoryAdapter.MessageViewHolder>( +class MessageHistoryAdapter : ListAdapter<CharSequence, MessageHistoryAdapter.MessageViewHolder>( object : DiffUtil.ItemCallback<CharSequence>() { override fun areItemsTheSame(oldItem: CharSequence?, newItem: CharSequence?) = oldItem === newItem @@ -21,6 +19,12 @@ class MessageHistoryAdapter( override fun areContentsTheSame(oldItem: CharSequence?, newItem: CharSequence?) = oldItem == newItem }) { + private var clickListener: ((CharSequence) -> Unit)? = null + + fun setOnItemClickListener(listener: (CharSequence) -> Unit) { + this.clickListener = listener + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = MessageViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.widget_history_message, parent, false), @@ -54,4 +58,4 @@ class MessageHistoryAdapter( content.text = data } } -} \ No newline at end of file +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt index c52c8e00f..c3ed188c9 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageAdapter.kt @@ -24,13 +24,10 @@ import de.kuschku.quasseldroid.persistence.QuasselDatabase import de.kuschku.quasseldroid.util.helper.getOrPut import de.kuschku.quasseldroid.viewmodel.data.FormattedMessage import me.saket.bettermovementmethod.BetterLinkMovementMethod +import javax.inject.Inject -class MessageAdapter( - private val messageRenderer: MessageRenderer, - private val clickListener: ((FormattedMessage) -> Unit)? = null, - private val selectionListener: ((FormattedMessage) -> Unit)? = null, - private val expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null, - private val urlLongClickListener: ((TextView, String) -> Boolean)? = null +class MessageAdapter @Inject constructor( + private val messageRenderer: MessageRenderer ) : PagedListAdapter<DisplayMessage, MessageAdapter.QuasselMessageViewHolder>( object : DiffUtil.ItemCallback<DisplayMessage>() { override fun areItemsTheSame(oldItem: DisplayMessage, newItem: DisplayMessage) = @@ -40,6 +37,26 @@ class MessageAdapter( oldItem == newItem }) { private val movementMethod = BetterLinkMovementMethod.newInstance() + private var clickListener: ((FormattedMessage) -> Unit)? = null + private var selectionListener: ((FormattedMessage) -> Unit)? = null + private var expansionListener: ((QuasselDatabase.DatabaseMessage) -> Unit)? = null + private var urlLongClickListener: ((TextView, String) -> Boolean)? = null + + fun setOnClickListener(listener: (FormattedMessage) -> Unit) { + this.clickListener = listener + } + + fun setOnSelectionListener(listener: (FormattedMessage) -> Unit) { + this.selectionListener = listener + } + + fun setOnExpansionListener(listener: (QuasselDatabase.DatabaseMessage) -> Unit) { + this.expansionListener = listener + } + + fun setOnUrlLongClickListener(listener: (TextView, String) -> Boolean) { + this.urlLongClickListener = listener + } init { movementMethod.setOnLinkLongClickListener { textView, url -> diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index b8a983601..014abbacb 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -63,10 +63,9 @@ class MessageListFragment : ServiceBoundFragment() { lateinit var database: QuasselDatabase @Inject - lateinit var messageRenderer: QuasselMessageRenderer + lateinit var adapter: MessageAdapter private lateinit var linearLayoutManager: LinearLayoutManager - private lateinit var adapter: MessageAdapter private var lastBuffer: BufferId? = null private var previousMessageId: MsgId? = null @@ -176,62 +175,59 @@ class MessageListFragment : ServiceBoundFragment() { linearLayoutManager.reverseLayout = true var linkMenu: PopupMenu? = null - adapter = MessageAdapter( - messageRenderer, - { msg -> - if (actionMode != null) { - if (!viewModel.selectedMessagesToggle(msg.id, msg)) { - actionMode?.finish() - } - } - }, - { msg -> - if (actionMode == null) { - activity?.startActionMode(actionModeCallback) - } + adapter.setOnClickListener { msg -> + if (actionMode != null) { if (!viewModel.selectedMessagesToggle(msg.id, msg)) { actionMode?.finish() } - }, - null, - { textView, url -> - if (linkMenu == null) { - linkMenu = PopupMenu(requireContext(), textView).also { menu -> - linkMenu?.dismiss() - menu.menuInflater.inflate(R.menu.context_link, menu.menu) - menu.setOnMenuItemClickListener { - when (it.itemId) { - R.id.action_copy -> { - val clipboard = requireContext().systemService<ClipboardManager>() - val clip = ClipData.newPlainText(null, url) - clipboard.primaryClip = clip - menu.dismiss() - linkMenu = null - true - } - R.id.action_share -> { - val intent = Intent(Intent.ACTION_SEND) - intent.type = "text/plain" - intent.putExtra(Intent.EXTRA_TEXT, url) - requireContext().startActivity( - Intent.createChooser(intent, requireContext().getString(R.string.label_share)) - ) - menu.dismiss() - linkMenu = null - true - } - else -> false + } + } + adapter.setOnSelectionListener { msg -> + if (actionMode == null) { + activity?.startActionMode(actionModeCallback) + } + if (!viewModel.selectedMessagesToggle(msg.id, msg)) { + actionMode?.finish() + } + } + adapter.setOnUrlLongClickListener { textView, url -> + if (linkMenu == null) { + linkMenu = PopupMenu(requireContext(), textView).also { menu -> + linkMenu?.dismiss() + menu.menuInflater.inflate(R.menu.context_link, menu.menu) + menu.setOnMenuItemClickListener { + when (it.itemId) { + R.id.action_copy -> { + val clipboard = requireContext().systemService<ClipboardManager>() + val clip = ClipData.newPlainText(null, url) + clipboard.primaryClip = clip + menu.dismiss() + linkMenu = null + true } + R.id.action_share -> { + val intent = Intent(Intent.ACTION_SEND) + intent.type = "text/plain" + intent.putExtra(Intent.EXTRA_TEXT, url) + requireContext().startActivity( + Intent.createChooser(intent, requireContext().getString(R.string.label_share)) + ) + menu.dismiss() + linkMenu = null + true + } + else -> false } - menu.setOnDismissListener { - linkMenu = null - } - menu.show() } + menu.setOnDismissListener { + linkMenu = null + } + menu.show() } - true } - ) + true + } + messageList.adapter = adapter messageList.layoutManager = linearLayoutManager messageList.itemAnimator = null diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/RipplePassthroughTextView.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/RipplePassthroughTextView.kt similarity index 94% rename from app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/RipplePassthroughTextView.kt rename to app/src/main/java/de/kuschku/quasseldroid/util/ui/RipplePassthroughTextView.kt index 02ebfaae3..fbc35dbe7 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/RipplePassthroughTextView.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/RipplePassthroughTextView.kt @@ -1,4 +1,4 @@ -package de.kuschku.quasseldroid.ui.chat.messages +package de.kuschku.quasseldroid.util.ui import android.content.Context import android.text.Spannable diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml index 357b871db..bc5a3db82 100644 --- a/app/src/main/res/layout/widget_chatmessage_action.xml +++ b/app/src/main/res/layout/widget_chatmessage_action.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_daychange.xml b/app/src/main/res/layout/widget_chatmessage_daychange.xml index a8a5bee40..2fd710fd3 100644 --- a/app/src/main/res/layout/widget_chatmessage_daychange.xml +++ b/app/src/main/res/layout/widget_chatmessage_daychange.xml @@ -23,7 +23,7 @@ android:paddingStart="@dimen/message_horizontal" android:paddingTop="@dimen/message_vertical_daychange"> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml index 12d904c15..57221c0b7 100644 --- a/app/src/main/res/layout/widget_chatmessage_error.xml +++ b/app/src/main/res/layout/widget_chatmessage_error.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_info.xml b/app/src/main/res/layout/widget_chatmessage_info.xml index bb275b6f8..74062d298 100644 --- a/app/src/main/res/layout/widget_chatmessage_info.xml +++ b/app/src/main/res/layout/widget_chatmessage_info.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_notice.xml b/app/src/main/res/layout/widget_chatmessage_notice.xml index d3e0e2760..2b830570b 100644 --- a/app/src/main/res/layout/widget_chatmessage_notice.xml +++ b/app/src/main/res/layout/widget_chatmessage_notice.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml index 03709e314..21d345076 100644 --- a/app/src/main/res/layout/widget_chatmessage_plain.xml +++ b/app/src/main/res/layout/widget_chatmessage_plain.xml @@ -73,7 +73,7 @@ android:layout_weight="1" android:orientation="vertical"> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -82,7 +82,7 @@ tools:text="@sample/messages.json/data/content" tools:visibility="visible" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="match_parent" android:layout_height="wrap_content" diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml index 9bcccdfb2..3b136eb8d 100644 --- a/app/src/main/res/layout/widget_chatmessage_server.xml +++ b/app/src/main/res/layout/widget_chatmessage_server.xml @@ -32,7 +32,7 @@ android:layout_marginRight="@dimen/message_horizontal" android:visibility="gone" /> - <de.kuschku.quasseldroid.ui.chat.messages.RipplePassthroughTextView + <de.kuschku.quasseldroid.util.ui.RipplePassthroughTextView android:id="@+id/combined" android:layout_width="0dip" android:layout_height="wrap_content" -- GitLab