diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7b23fbd97afd9f1c5e62b0e90e034246c5935911..a092edb2e4f3365b1a362ef8199abf1741989200 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,6 +41,12 @@ android:label="@string/label_details" android:parentActivityName=".ui.chat.ChatActivity" android:windowSoftInputMode="adjustResize" /> + <activity + android:name=".ui.chat.topic.TopicActivity" + android:exported="false" + android:label="@string/label_topic" + android:parentActivityName=".ui.chat.info.InfoActivity" + android:windowSoftInputMode="adjustResize" /> <!-- Client Settings --> <activity diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt index 5fa67e3b46e06574d85e6320508433d48fd00e80..193c776129355b91da732aed6a93d44f31ce0cfd 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt @@ -8,6 +8,8 @@ import de.kuschku.quasseldroid.ui.chat.ChatActivityModule import de.kuschku.quasseldroid.ui.chat.ChatFragmentProvider import de.kuschku.quasseldroid.ui.chat.info.InfoActivity import de.kuschku.quasseldroid.ui.chat.info.InfoFragmentProvider +import de.kuschku.quasseldroid.ui.chat.topic.TopicActivity +import de.kuschku.quasseldroid.ui.chat.topic.TopicFragmentProvider import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsActivity import de.kuschku.quasseldroid.ui.clientsettings.about.AboutSettingsFragmentProvider import de.kuschku.quasseldroid.ui.clientsettings.app.AppSettingsActivity @@ -38,6 +40,9 @@ abstract class ActivityModule { @ContributesAndroidInjector(modules = [InfoFragmentProvider::class]) abstract fun bindInfoActivity(): InfoActivity + @ContributesAndroidInjector(modules = [TopicFragmentProvider::class]) + abstract fun bindTopicActivity(): TopicActivity + @ContributesAndroidInjector(modules = [AppSettingsFragmentProvider::class]) abstract fun bindAppSettingsActivity(): AppSettingsActivity diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt index ca7cd350eb3054c8c73b8bfcbefe4f66929c440e..7f0e96b92e4e16b59251609583585da0383ad8cc 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ToolbarFragment.kt @@ -103,15 +103,18 @@ class ToolbarFragment : ServiceBoundFragment() { BufferInfo.Type.QueryBuffer.toInt() -> InfoDescriptor( type = InfoType.User, nick = info.bufferName, + buffer = info.bufferId, network = info.networkId ) BufferInfo.Type.ChannelBuffer.toInt() -> InfoDescriptor( type = InfoType.Channel, channel = info.bufferName, + buffer = info.bufferId, network = info.networkId ) BufferInfo.Type.StatusBuffer.toInt() -> InfoDescriptor( type = InfoType.Network, + buffer = info.bufferId, network = info.networkId ) else -> null @@ -129,4 +132,4 @@ class ToolbarFragment : ServiceBoundFragment() { private fun colorizeDescription(description: String?) = ircFormatDeserializer.formatString( requireContext(), description, messageSettings.colorizeMirc ) -} \ No newline at end of file +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt index ad5328320242fce75e53a6ed8e41210c490b001d..95c5a772e1d0b5dcc239b95ee4f7544f55022fb5 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoDescriptor.kt @@ -6,5 +6,6 @@ data class InfoDescriptor( val type: InfoType, val nick: String? = null, val channel: String? = null, + val buffer: Int, val network: Int -) : Serializable \ No newline at end of file +) : Serializable diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt index acb8d8c7b0ef6627c74bd331e8f42121725670eb..4d2df684dd09c2ad2287d69f9a945750b1cabcbb 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt @@ -1,18 +1,19 @@ package de.kuschku.quasseldroid.ui.chat.info import android.arch.lifecycle.Observer +import android.content.Intent import android.os.Bundle import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import butterknife.BindView import butterknife.ButterKnife import de.kuschku.libquassel.util.Optional import de.kuschku.libquassel.util.compatibility.LoggingHandler import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.ui.chat.topic.TopicActivity import de.kuschku.quasseldroid.util.helper.toLiveData import de.kuschku.quasseldroid.util.irc.format.ContentFormatter import de.kuschku.quasseldroid.util.service.ServiceBoundFragment @@ -98,11 +99,9 @@ class InfoFragment : ServiceBoundFragment() { name = getString(R.string.property_ircchannel_topic_action_edit), featured = true, onClick = { - Toast.makeText( - requireContext(), - "Not implemented", - Toast.LENGTH_SHORT - ).show() + val intent = Intent(requireContext(), TopicActivity::class.java) + intent.putExtra("buffer", info.buffer) + startActivity(intent) } ) ) @@ -130,4 +129,4 @@ class InfoFragment : ServiceBoundFragment() { return view } -} \ No newline at end of file +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt index fcd2f85781361913eaec1e270284614872498752..cebc155c413c7cc0f85627bb225d280957b5ca47 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/ChatlineFragment.kt @@ -77,7 +77,7 @@ class ChatlineFragment : ServiceBoundFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = LayoutInflater.from(activity).inflate(R.layout.fragment_chatline, container, false) + val view = inflater.inflate(R.layout.fragment_chatline, container, false) ButterKnife.bind(this, view) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt index edda1525503069d1f96a97bfa6708eb47818db3f..8d0362fbfceb852ccf3dc4d49a2f30d98d7de447 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt @@ -19,6 +19,7 @@ import com.bumptech.glide.Glide import com.bumptech.glide.ListPreloader import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader import com.bumptech.glide.util.FixedPreloadSizeProvider +import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.util.IrcUserUtils import de.kuschku.libquassel.util.helpers.value @@ -151,14 +152,21 @@ class NickListFragment : ServiceBoundFragment() { } private val clickListener: ((String) -> Unit)? = { nick -> - viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId -> - val intent = Intent(requireContext(), InfoActivity::class.java) - intent.putExtra("info", InfoDescriptor( - type = InfoType.User, - nick = nick, - network = networkId - )) - startActivity(intent) + viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer -> + viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId -> + val intent = Intent(requireContext(), InfoActivity::class.java) + intent.putExtra("info", InfoDescriptor( + type = InfoType.User, + nick = nick, + buffer = bufferSyncer.find( + bufferName = nick, + networkId = networkId, + type = Buffer_Type.of(Buffer_Type.QueryBuffer) + )?.bufferId ?: -1, + network = networkId + )) + startActivity(intent) + } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt new file mode 100644 index 0000000000000000000000000000000000000000..83fb366f0ff367ff593379fa8c03f0c74ec53524 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicActivity.kt @@ -0,0 +1,5 @@ +package de.kuschku.quasseldroid.ui.chat.topic + +import de.kuschku.quasseldroid.util.ui.SettingsActivity + +class TopicActivity : SettingsActivity(TopicFragment()) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt new file mode 100644 index 0000000000000000000000000000000000000000..5c7d3ac8a6a192fd923a0a75580b5f5cdb551c64 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragment.kt @@ -0,0 +1,115 @@ +package de.kuschku.quasseldroid.ui.chat.topic + +import android.arch.lifecycle.Observer +import android.arch.lifecycle.ViewModelProviders +import android.os.Bundle +import android.support.v7.widget.DefaultItemAnimator +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import butterknife.BindView +import butterknife.ButterKnife +import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.settings.AppearanceSettings +import de.kuschku.quasseldroid.settings.AutoCompleteSettings +import de.kuschku.quasseldroid.settings.MessageSettings +import de.kuschku.quasseldroid.ui.chat.input.* +import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment +import de.kuschku.quasseldroid.util.helper.invoke +import de.kuschku.quasseldroid.util.helper.toLiveData +import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer +import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer +import de.kuschku.quasseldroid.viewmodel.EditorViewModel +import javax.inject.Inject + +class TopicFragment : SettingsFragment() { + @BindView(R.id.chatline) + lateinit var chatline: RichEditText + + @BindView(R.id.formatting_toolbar) + lateinit var toolbar: RichToolbar + + @Inject + lateinit var autoCompleteSettings: AutoCompleteSettings + + @Inject + lateinit var messageSettings: MessageSettings + + @Inject + lateinit var appearanceSettings: AppearanceSettings + + @Inject + lateinit var formatDeserializer: IrcFormatDeserializer + + @Inject + lateinit var formatSerializer: IrcFormatSerializer + + lateinit var editorHelper: EditorHelper + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + val view = inflater.inflate(R.layout.fragment_topic, container, false) + ButterKnife.bind(this, view) + + val editorViewModel = ViewModelProviders.of(this).get(EditorViewModel::class.java) + editorViewModel.quasselViewModel.onNext(viewModel) + + val autoCompleteHelper = AutoCompleteHelper( + requireActivity(), + autoCompleteSettings, + messageSettings, + formatDeserializer, + editorViewModel + ) + + editorHelper = EditorHelper( + requireActivity(), + chatline, + toolbar, + autoCompleteHelper, + autoCompleteSettings, + appearanceSettings + ) + + editorViewModel.lastWord.onNext(editorHelper.lastWord) + + if (autoCompleteSettings.prefix || autoCompleteSettings.auto) { + val autoCompleteLists = listOfNotNull<RecyclerView>( + view.findViewById(R.id.autocomplete_list) + ) + val autocompleteAdapter = AutoCompleteAdapter(messageSettings, chatline::autoComplete) + for (autoCompleteList in autoCompleteLists) { + autoCompleteList.layoutManager = LinearLayoutManager(activity) + autoCompleteList.itemAnimator = DefaultItemAnimator() + autoCompleteList.adapter = autocompleteAdapter + } + } + + + val bufferId = arguments?.getInt("buffer", -1) ?: -1 + viewModel.buffer.onNext(bufferId) + viewModel.bufferData.filter { + it.info != null + }.firstElement().toLiveData().observe(this, Observer { + chatline.setText(formatDeserializer.formatString(chatline.context, it?.description, true)) + }) + + return view + } + + override fun onSave(): Boolean { + viewModel.session { sessionOptional -> + val session = sessionOptional.orNull() + viewModel.buffer { bufferId -> + session?.bufferSyncer?.bufferInfo(bufferId)?.also { bufferInfo -> + val topic = formatSerializer.toEscapeCodes(chatline.text) + session.rpcHandler?.sendInput(bufferInfo, "/topic $topic") + return true + } + } + } + return false + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt new file mode 100644 index 0000000000000000000000000000000000000000..0cdcb82b07044e08cd3b9b6f6e9ce5bdf916a9e5 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/topic/TopicFragmentProvider.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid.ui.chat.topic + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class TopicFragmentProvider { + @ContributesAndroidInjector + abstract fun bindTopicFragment(): TopicFragment +} diff --git a/app/src/main/res/layout/fragment_topic.xml b/app/src/main/res/layout/fragment_topic.xml new file mode 100644 index 0000000000000000000000000000000000000000..0cbc3a0de9506a45fdaf522151df6acb8c987bbd --- /dev/null +++ b/app/src/main/res/layout/fragment_topic.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <ScrollView + android:id="@+id/chatline_scroller" + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="1"> + + <de.kuschku.quasseldroid.ui.chat.input.RichEditText + android:id="@+id/chatline" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@android:color/transparent" + android:gravity="center_vertical" + android:hint="@string/label_placeholder_topic" + android:imeOptions="flagNoExtractUi" + android:inputType="textCapSentences|textAutoCorrect|textShortMessage|textMultiLine" + android:minHeight="?attr/actionBarSize" + android:paddingBottom="8dp" + android:paddingLeft="20dp" + android:paddingRight="20dp" + android:paddingTop="8dp" + android:textColor="?attr/colorForeground" + android:textSize="16sp" /> + </ScrollView> + + <de.kuschku.quasseldroid.util.ui.AutoCompleteRecyclerView + android:id="@+id/autocomplete_list" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <android.support.design.widget.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/colorBackgroundCard"> + + <de.kuschku.quasseldroid.ui.chat.input.RichToolbar + android:id="@+id/formatting_toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + app:contentInsetStart="0dip" /> + </android.support.design.widget.AppBarLayout> +</LinearLayout> diff --git a/app/src/main/res/layout/layout_editor.xml b/app/src/main/res/layout/layout_editor.xml index 65fc344c985bb505ec40d62eaad05265ec62d963..e0f2d665891e6d35906cd4fab2149ef5d41d224f 100644 --- a/app/src/main/res/layout/layout_editor.xml +++ b/app/src/main/res/layout/layout_editor.xml @@ -33,7 +33,7 @@ android:layout_height="wrap_content" android:background="@android:color/transparent" android:gravity="center_vertical" - android:hint="@string/label_placeholder" + android:hint="@string/label_placeholder_message" android:imeOptions="flagNoExtractUi" android:inputType="textCapSentences|textAutoCorrect|textShortMessage" android:minHeight="?attr/actionBarSize" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 503ddec9ac71cab2d29aeec3c1848e97b84c46ba..594b7cfcd47b3592cf62d194b6c5c65424270da7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -42,7 +42,8 @@ <string name="label_reset">Zurücksetzen</string> <string name="label_open">Öffnen</string> <string name="label_part">Verlassen</string> - <string name="label_placeholder">Nachricht schreiben…</string> + <string name="label_placeholder_message">Nachricht schreiben…</string> + <string name="label_placeholder_topic">Beschreib das Thema des Kanals…</string> <string name="label_rename">Umbenennen</string> <string name="label_save">Speichern</string> <string name="label_select">Auswählen</string> @@ -52,6 +53,7 @@ <string name="label_share">Teilen</string> <string name="label_share_crashreport">Absturzbericht Teilen</string> <string name="label_show_hidden">Alle anzeigen</string> + <string name="label_topic">Kanal-Thema</string> <string name="label_unhide">Nicht mehr ausblenden</string> <string name="label_website">Webseite</string> <string name="label_yes">Ja</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 64d745e20aa50d851ef333d34af19b001eeb504b..1aecf7ac075df24bcf1262113ace5ab690c56683 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,7 +42,8 @@ <string name="label_reset">Reset</string> <string name="label_open">Open</string> <string name="label_part">Part</string> - <string name="label_placeholder">Write a message…</string> + <string name="label_placeholder_message">Write a message…</string> + <string name="label_placeholder_topic">Describe the channel topic…</string> <string name="label_rename">Rename</string> <string name="label_save">Save</string> <string name="label_select">Select</string> @@ -52,6 +53,7 @@ <string name="label_share">Share</string> <string name="label_share_crashreport">Share Crash Report</string> <string name="label_show_hidden">Show Hidden</string> + <string name="label_topic">Channel Topic</string> <string name="label_unhide">Make Visible</string> <string name="label_website">Website</string> <string name="label_yes">Yes</string>