Skip to content
Snippets Groups Projects
Commit a0b1eda7 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Implement topic editing

parent 55772918
No related branches found
No related tags found
No related merge requests found
Showing
with 225 additions and 21 deletions
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
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)
}
)
)
......
......@@ -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)
......
......@@ -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,16 +152,23 @@ class NickListFragment : ServiceBoundFragment() {
}
private val clickListener: ((String) -> Unit)? = { nick ->
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)
}
}
}
companion object {
private const val KEY_STATE_LIST = "KEY_STATE_LIST"
......
package de.kuschku.quasseldroid.ui.chat.topic
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class TopicActivity : SettingsActivity(TopicFragment())
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
}
}
package de.kuschku.quasseldroid.ui.chat.topic
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class TopicFragmentProvider {
@ContributesAndroidInjector
abstract fun bindTopicFragment(): TopicFragment
}
<?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>
......@@ -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"
......
......@@ -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>
......
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment