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

Implement identity editing

parent 50859db8
Branches
Tags
No related merge requests found
Showing
with 794 additions and 63 deletions
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
android:label="@string/app_name" android:label="@string/app_name"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SplashTheme"> android:theme="@style/Theme.SplashTheme">
<!-- Normal Chat -->
<activity <activity
android:name=".ui.chat.ChatActivity" android:name=".ui.chat.ChatActivity"
android:exported="true" android:exported="true"
...@@ -40,18 +42,33 @@ ...@@ -40,18 +42,33 @@
android:parentActivityName=".ui.chat.ChatActivity" android:parentActivityName=".ui.chat.ChatActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<!-- Client Settings -->
<activity <activity
android:name=".ui.setup.accounts.setup.AccountSetupActivity" android:name=".ui.clientsettings.app.AppSettingsActivity"
android:exported="false" android:exported="false"
android:label="@string/app_name" android:label="@string/label_settings_client"
android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity" android:parentActivityName=".ui.chat.ChatActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".ui.setup.accounts.edit.AccountEditActivity" android:name=".ui.clientsettings.crash.CrashSettingsActivity"
android:exported="false" android:exported="false"
android:label="@string/app_name" android:label="@string/label_crashes"
android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity" android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.clientsettings.about.AboutSettingsActivity"
android:exported="false"
android:label="@string/label_about"
android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.clientsettings.license.LicenseSettingsActivity"
android:exported="false"
android:label="@string/label_license"
android:parentActivityName=".ui.clientsettings.about.AboutSettingsActivity"
android:windowSoftInputMode="adjustResize" />
<!-- Core Settings -->
<activity <activity
android:name=".ui.coresettings.CoreSettingsActivity" android:name=".ui.coresettings.CoreSettingsActivity"
android:exported="false" android:exported="false"
...@@ -62,40 +79,42 @@ ...@@ -62,40 +79,42 @@
android:name=".ui.coresettings.networkconfig.NetworkConfigActivity" android:name=".ui.coresettings.networkconfig.NetworkConfigActivity"
android:exported="false" android:exported="false"
android:label="@string/settings_networkconfig_title" android:label="@string/settings_networkconfig_title"
android:parentActivityName=".ui.chat.ChatActivity" android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".ui.clientsettings.app.AppSettingsActivity" android:name=".ui.coresettings.identity.IdentitiesActivity"
android:exported="false" android:exported="false"
android:label="@string/label_settings_client" android:label="@string/settings_identities_title"
android:parentActivityName=".ui.chat.ChatActivity" android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".ui.clientsettings.crash.CrashSettingsActivity" android:name=".ui.coresettings.identity.IdentityActivity"
android:exported="false" android:exported="false"
android:label="@string/label_crashes" android:label="@string/settings_identity_title"
android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity" android:parentActivityName=".ui.coresettings.identity.IdentitiesActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<!-- Client Setup Flow -->
<activity <activity
android:name=".ui.clientsettings.about.AboutSettingsActivity" android:name=".ui.setup.accounts.selection.AccountSelectionActivity"
android:exported="false" android:exported="false"
android:label="@string/label_about" android:label="@string/app_name"
android:parentActivityName=".ui.clientsettings.app.AppSettingsActivity" android:parentActivityName=".ui.chat.ChatActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".ui.clientsettings.license.LicenseSettingsActivity" android:name=".ui.setup.accounts.setup.AccountSetupActivity"
android:exported="false" android:exported="false"
android:label="@string/label_license" android:label="@string/app_name"
android:parentActivityName=".ui.clientsettings.about.AboutSettingsActivity" android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity <activity
android:name=".ui.setup.accounts.selection.AccountSelectionActivity" android:name=".ui.setup.accounts.edit.AccountEditActivity"
android:exported="false" android:exported="false"
android:label="@string/app_name" android:label="@string/app_name"
android:parentActivityName=".ui.chat.ChatActivity" android:parentActivityName=".ui.setup.accounts.selection.AccountSelectionActivity"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<!-- Services -->
<service <service
android:name=".service.QuasselService" android:name=".service.QuasselService"
android:description="@string/connection_service_description" android:description="@string/connection_service_description"
......
...@@ -18,6 +18,10 @@ import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity ...@@ -18,6 +18,10 @@ import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider
import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity
import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsFragmentProvider
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentitiesActivity
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentitiesFragmentProvider
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityFragmentProvider
import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigFragmentProvider import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigFragmentProvider
import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity import de.kuschku.quasseldroid.ui.setup.accounts.edit.AccountEditActivity
...@@ -49,6 +53,12 @@ abstract class ActivityModule { ...@@ -49,6 +53,12 @@ abstract class ActivityModule {
@ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class]) @ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class])
abstract fun bindCoreSettingsActivity(): CoreSettingsActivity abstract fun bindCoreSettingsActivity(): CoreSettingsActivity
@ContributesAndroidInjector(modules = [IdentitiesFragmentProvider::class])
abstract fun bindIdentitiesActivity(): IdentitiesActivity
@ContributesAndroidInjector(modules = [IdentityFragmentProvider::class])
abstract fun bindIdentityActivity(): IdentityActivity
@ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class]) @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class])
abstract fun bindNetworkConfigActivity(): NetworkConfigActivity abstract fun bindNetworkConfigActivity(): NetworkConfigActivity
......
...@@ -2,6 +2,7 @@ package de.kuschku.quasseldroid.ui.coresettings ...@@ -2,6 +2,7 @@ package de.kuschku.quasseldroid.ui.coresettings
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.support.v7.widget.DividerItemDecoration
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
...@@ -11,6 +12,7 @@ import android.widget.TextView ...@@ -11,6 +12,7 @@ import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentitiesActivity
import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
import de.kuschku.quasseldroid.util.helper.visibleIf import de.kuschku.quasseldroid.util.helper.visibleIf
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
...@@ -21,17 +23,24 @@ class CoreSettingsFragment : ServiceBoundFragment() { ...@@ -21,17 +23,24 @@ class CoreSettingsFragment : ServiceBoundFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? { savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_coresettings, container, false) val view = inflater.inflate(R.layout.settings_list, container, false)
ButterKnife.bind(this, view) ButterKnife.bind(this, view)
list.layoutManager = LinearLayoutManager(context) val adapter = CoreSettingsAdapter(listOf(
list.adapter = CoreSettingsAdapter(listOf( CoreSetting(
getString(R.string.settings_identities_title),
getString(R.string.settings_identities_description),
Intent(requireContext(), IdentitiesActivity::class.java)
),
CoreSetting( CoreSetting(
getString(R.string.settings_networkconfig_title), getString(R.string.settings_networkconfig_title),
getString(R.string.settings_networkconfig_description), getString(R.string.settings_networkconfig_description),
Intent(requireContext(), NetworkConfigActivity::class.java) Intent(requireContext(), NetworkConfigActivity::class.java)
) )
)) ))
list.adapter = adapter
list.layoutManager = LinearLayoutManager(context)
list.addItemDecoration(DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL))
return view return view
} }
...@@ -47,7 +56,7 @@ class CoreSettingsFragment : ServiceBoundFragment() { ...@@ -47,7 +56,7 @@ class CoreSettingsFragment : ServiceBoundFragment() {
override fun getItemCount() = data.size override fun getItemCount() = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CoreSettingsViewHolder( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CoreSettingsViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.widget_coresetting, parent, false) LayoutInflater.from(parent.context).inflate(R.layout.settings_item, parent, false)
) )
override fun onBindViewHolder(holder: CoreSettingsViewHolder, position: Int) { override fun onBindViewHolder(holder: CoreSettingsViewHolder, position: Int) {
......
package de.kuschku.quasseldroid.ui.coresettings.identity
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class IdentitiesActivity : SettingsActivity(IdentitiesFragment())
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.identity
import android.arch.lifecycle.Observer
import android.content.Intent
import android.os.Bundle
import android.support.v7.recyclerview.extensions.ListAdapter
import android.support.v7.util.DiffUtil
import android.support.v7.widget.DividerItemDecoration
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.TextView
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.IdentityId
import de.kuschku.libquassel.quassel.syncables.Identity
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.util.helper.combineLatest
import de.kuschku.quasseldroid.util.helper.toLiveData
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
class IdentitiesFragment : ServiceBoundFragment() {
@BindView(R.id.list)
lateinit var list: RecyclerView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.settings_list, container, false)
ButterKnife.bind(this, view)
val adapter = IdentityAdapter {
val intent = Intent(requireContext(), IdentityActivity::class.java)
intent.putExtra("identity", it)
startActivity(intent)
}
list.adapter = adapter
list.layoutManager = LinearLayoutManager(context)
list.addItemDecoration(DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL))
viewModel.identities.switchMap {
combineLatest(it.values.map(Identity::liveUpdates)).map {
it.map {
IdentityItem(
it.id(),
it.identityName()
)
}
}
}.toLiveData().observe(this, Observer {
adapter.submitList(it.orEmpty())
})
return view
}
data class IdentityItem(
val id: IdentityId,
val name: String
)
class IdentityAdapter(private val clickListener: (IdentityId) -> Unit) :
ListAdapter<IdentityItem, IdentityAdapter.IdentityViewHolder>(
object : DiffUtil.ItemCallback<IdentityItem>() {
override fun areItemsTheSame(oldItem: IdentityItem, newItem: IdentityItem) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: IdentityItem, newItem: IdentityItem) =
oldItem == newItem
}
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = IdentityViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.settings_item, parent, false),
clickListener
)
override fun onBindViewHolder(holder: IdentityViewHolder, position: Int) {
holder.bind(getItem(position))
}
class IdentityViewHolder(itemView: View, clickListener: (IdentityId) -> Unit) :
RecyclerView.ViewHolder(itemView) {
@BindView(R.id.title)
lateinit var title: TextView
var id: IdentityId? = null
init {
ButterKnife.bind(this, itemView)
itemView.setOnClickListener {
id?.let(clickListener::invoke)
}
}
fun bind(item: IdentityItem) {
this.id = item.id
this.title.text = item.name
}
}
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.identity
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class IdentitiesFragmentProvider {
@ContributesAndroidInjector
abstract fun bindIdentitiesFragment(): IdentitiesFragment
}
package de.kuschku.quasseldroid.ui.coresettings.identity
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class IdentityActivity : SettingsActivity(IdentityFragment())
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.identity
import android.arch.lifecycle.Observer
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.ViewHolder
import android.support.v7.widget.SwitchCompat
import android.support.v7.widget.helper.ItemTouchHelper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import butterknife.BindView
import butterknife.ButterKnife
import com.afollestad.materialdialogs.MaterialDialog
import de.kuschku.libquassel.quassel.syncables.Identity
import de.kuschku.libquassel.util.Optional
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
import de.kuschku.quasseldroid.util.helper.setDependent
import de.kuschku.quasseldroid.util.helper.toLiveData
class IdentityFragment : SettingsFragment() {
private var identity: Pair<Identity, Identity>? = null
@BindView(R.id.identity_name)
lateinit var identityName: TextView
@BindView(R.id.real_name)
lateinit var realName: TextView
@BindView(R.id.ident)
lateinit var ident: TextView
@BindView(R.id.nicks)
lateinit var nicks: RecyclerView
@BindView(R.id.new_nick)
lateinit var newNick: Button
@BindView(R.id.kick_reason)
lateinit var kickReason: TextView
@BindView(R.id.part_reason)
lateinit var partReason: TextView
@BindView(R.id.quit_reason)
lateinit var quitReason: TextView
@BindView(R.id.away_reason)
lateinit var awayReason: TextView
@BindView(R.id.detach_away)
lateinit var detachAway: SwitchCompat
@BindView(R.id.detach_away_group)
lateinit var detachAwayGroup: ViewGroup
@BindView(R.id.detach_away_reason)
lateinit var detachAwayReason: TextView
private lateinit var adapter: IdentityNicksAdapter
private lateinit var helper: ItemTouchHelper
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.settings_identity, container, false)
ButterKnife.bind(this, view)
val identityId = arguments?.getInt("identity", -1) ?: -1
viewModel.identities.map {
Optional.ofNullable(it[identityId])
}.filter(Optional<Identity>::isPresent)
.map(Optional<Identity>::get)
.firstElement()
.toLiveData().observe(this, Observer {
if (it != null) {
this.identity = Pair(it, it.copy())
this.identity?.let { (_, data) ->
identityName.text = data.identityName()
realName.text = data.realName()
ident.text = data.ident()
kickReason.text = data.kickReason()
partReason.text = data.partReason()
quitReason.text = data.quitReason()
awayReason.text = data.awayReason()
detachAway.isChecked = data.detachAwayEnabled()
detachAwayReason.text = data.detachAwayReason()
adapter.nicks = data.nicks()
}
}
})
adapter = IdentityNicksAdapter(::nickClick, ::startDrag)
nicks.layoutManager = LinearLayoutManager(requireContext())
nicks.adapter = adapter
val callback = DragSortItemTouchHelperCallback(adapter)
helper = ItemTouchHelper(callback)
helper.attachToRecyclerView(nicks)
newNick.setOnClickListener {
MaterialDialog.Builder(requireContext())
.input(null, null, false) { _, _ -> }
.title(R.string.label_new_nick)
.negativeText(R.string.label_cancel)
.positiveText(R.string.label_save)
.onPositive { dialog, _ ->
dialog.inputEditText?.text?.toString()?.let {
if (it.isNotBlank()) {
adapter.addNick(it)
}
}
}.build().show()
}
detachAway.setDependent(detachAwayGroup)
return view
}
fun startDrag(holder: IdentityNicksAdapter.IdentityNickViewHolder) = helper.startDrag(holder)
fun nickClick(index: Int, nick: String) {
MaterialDialog.Builder(requireContext())
.input(null, nick, false) { _, _ -> }
.title(R.string.label_edit_nick)
.negativeText(R.string.label_cancel)
.positiveText(R.string.label_save)
.onPositive { dialog, _ ->
dialog.inputEditText?.text?.toString()?.let {
if (it.isNotBlank()) {
adapter.replaceNick(index, it)
}
}
}.build().show()
}
override fun onSave() = identity?.let { (it, data) ->
data.setIdentityName(identityName.text.toString())
data.setRealName(realName.text.toString())
data.setIdent(ident.text.toString())
data.setKickReason(kickReason.text.toString())
data.setPartReason(partReason.text.toString())
data.setQuitReason(quitReason.text.toString())
data.setAwayReason(awayReason.text.toString())
data.setDetachAwayEnabled(detachAway.isChecked)
data.setDetachAwayReason(detachAwayReason.text.toString())
data.setNicks(adapter.nicks)
it.requestUpdate(data.toVariantMap())
true
} ?: false
class DragSortItemTouchHelperCallback(private val adapter: IdentityNicksAdapter) :
ItemTouchHelper.Callback() {
override fun isLongPressDragEnabled() = true
override fun isItemViewSwipeEnabled() = true
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
return ItemTouchHelper.Callback.makeMovementFlags(dragFlags, swipeFlags)
}
override fun onMove(recyclerView: RecyclerView, viewHolder: ViewHolder,
target: ViewHolder): Boolean {
adapter.moveNick(viewHolder.adapterPosition, target.adapterPosition)
return true
}
override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
adapter.removeNick(viewHolder.adapterPosition)
}
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.identity
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class IdentityFragmentProvider {
@ContributesAndroidInjector
abstract fun bindIdentityFragment(): IdentityFragment
}
package de.kuschku.quasseldroid.ui.coresettings.identity
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.quasseldroid.R
import java.util.*
class IdentityNicksAdapter(
private val clickListener: (Int, String) -> Unit,
private val dragListener: (IdentityNickViewHolder) -> Unit
) :
RecyclerView.Adapter<IdentityNicksAdapter.IdentityNickViewHolder>() {
private val data = mutableListOf<String>()
var nicks: List<String>
get() = data
set(value) {
val length = data.size
data.clear()
notifyItemRangeRemoved(0, length)
data.addAll(value)
notifyItemRangeInserted(0, nicks.size)
}
fun addNick(nick: String) {
val index = data.size
data.add(nick)
notifyItemInserted(index)
}
fun replaceNick(index: Int, nick: String) {
data[index] = nick
notifyItemChanged(index)
}
fun removeNick(index: Int) {
data.removeAt(index)
notifyItemRemoved(index)
}
fun moveNick(from: Int, to: Int) {
Collections.swap(data, from, to)
notifyItemMoved(from, to)
}
override fun getItemCount() = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = IdentityNickViewHolder(
LayoutInflater.from(parent.context)
.inflate(R.layout.settings_identity_nick, parent, false),
clickListener,
dragListener
)
override fun onBindViewHolder(holder: IdentityNickViewHolder, position: Int) {
holder.bind(data[position])
}
class IdentityNickViewHolder(
itemView: View,
private val clickListener: (Int, String) -> Unit,
dragListener: (IdentityNickViewHolder) -> Unit
) :
RecyclerView.ViewHolder(itemView) {
@BindView(R.id.nick)
lateinit var nick: TextView
@BindView(R.id.handle)
lateinit var handle: View
private var item: String? = null
init {
ButterKnife.bind(this, itemView)
itemView.setOnClickListener {
item?.let {
clickListener(adapterPosition, it)
}
}
handle.setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
dragListener.invoke(this)
}
false
}
}
fun bind(item: String) {
this.item = item
nick.text = item
}
}
}
\ No newline at end of file
...@@ -10,14 +10,14 @@ import android.widget.EditText ...@@ -10,14 +10,14 @@ import android.widget.EditText
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.quassel.syncables.NetworkConfig import de.kuschku.libquassel.quassel.syncables.NetworkConfig
import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.util.Optional
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
import de.kuschku.quasseldroid.util.helper.setDependent import de.kuschku.quasseldroid.util.helper.setDependent
import de.kuschku.quasseldroid.util.helper.toLiveData import de.kuschku.quasseldroid.util.helper.toLiveData
class NetworkConfigFragment : SettingsFragment() { class NetworkConfigFragment : SettingsFragment() {
private var networkConfig: NetworkConfig? = null private var networkConfig: Pair<NetworkConfig, NetworkConfig>? = null
@BindView(R.id.ping_timeout_enabled) @BindView(R.id.ping_timeout_enabled)
lateinit var pingTimeoutEnabled: SwitchCompat lateinit var pingTimeoutEnabled: SwitchCompat
...@@ -51,25 +51,28 @@ class NetworkConfigFragment : SettingsFragment() { ...@@ -51,25 +51,28 @@ class NetworkConfigFragment : SettingsFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? { savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_networksettings, container, false) val view = inflater.inflate(R.layout.settings_networkconfig, container, false)
ButterKnife.bind(this, view) ButterKnife.bind(this, view)
setHasOptionsMenu(true) viewModel.networkConfig
.filter(Optional<NetworkConfig?>::isPresent)
viewModel.session.map { it.map(ISession::networkConfig) }.toLiveData().observe(this, Observer { .map(Optional<NetworkConfig?>::get)
it?.orNull()?.let { .firstElement()
this.networkConfig = it .toLiveData().observe(this, Observer {
if (it != null) {
pingTimeoutEnabled.isChecked = it.pingTimeoutEnabled() this.networkConfig = Pair(it, it.copy())
pingInterval.setText(it.pingInterval().toString()) this.networkConfig?.let { (_, data) ->
maxPingCount.setText(it.maxPingCount().toString()) pingTimeoutEnabled.isChecked = data.pingTimeoutEnabled()
pingInterval.setText(data.pingInterval().toString())
autoWhoEnabled.isChecked = it.autoWhoEnabled() maxPingCount.setText(data.maxPingCount().toString())
autoWhoInterval.setText(it.autoWhoInterval().toString())
autoWhoNickLimit.setText(it.autoWhoNickLimit().toString()) autoWhoEnabled.isChecked = data.autoWhoEnabled()
autoWhoDelay.setText(it.autoWhoDelay().toString()) autoWhoInterval.setText(data.autoWhoInterval().toString())
autoWhoNickLimit.setText(data.autoWhoNickLimit().toString())
standardCtcp.isChecked = it.standardCtcp() autoWhoDelay.setText(data.autoWhoDelay().toString())
standardCtcp.isChecked = data.standardCtcp()
}
} }
}) })
...@@ -80,22 +83,18 @@ class NetworkConfigFragment : SettingsFragment() { ...@@ -80,22 +83,18 @@ class NetworkConfigFragment : SettingsFragment() {
} }
override fun onSave() = networkConfig?.let { override fun onSave() = networkConfig?.let { (it, data) ->
val config = it.copy() data.setPingTimeoutEnabled(pingTimeoutEnabled.isChecked)
pingInterval.text.toString().toIntOrNull()?.let(data::setPingInterval)
config.setPingTimeoutEnabled(pingTimeoutEnabled.isChecked) maxPingCount.text.toString().toIntOrNull()?.let(data::setMaxPingCount)
pingInterval.text.toString().toIntOrNull()?.let(config::setPingInterval)
maxPingCount.text.toString().toIntOrNull()?.let(config::setMaxPingCount)
config.setAutoWhoEnabled(autoWhoEnabled.isChecked)
autoWhoInterval.text.toString().toIntOrNull()?.let(config::setAutoWhoInterval)
autoWhoNickLimit.text.toString().toIntOrNull()?.let(config::setAutoWhoNickLimit)
autoWhoDelay.text.toString().toIntOrNull()?.let(config::setAutoWhoDelay)
config.setStandardCtcp(standardCtcp.isChecked)
val properties = config.toVariantMap() data.setAutoWhoEnabled(autoWhoEnabled.isChecked)
it.requestUpdate(properties) autoWhoInterval.text.toString().toIntOrNull()?.let(data::setAutoWhoInterval)
autoWhoNickLimit.text.toString().toIntOrNull()?.let(data::setAutoWhoNickLimit)
autoWhoDelay.text.toString().toIntOrNull()?.let(data::setAutoWhoDelay)
data.setStandardCtcp(standardCtcp.isChecked)
it.requestUpdate(data.toVariantMap())
true true
} ?: false } ?: false
} }
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#000"
android:pathData="M2,3H22C23.05,3 24,3.95 24,5V19C24,20.05 23.05,21 22,21H2C0.95,21 0,20.05 0,19V5C0,3.95 0.95,3 2,3M14,6V7H22V6H14M14,8V9H21.5L22,9V8H14M14,10V11H21V10H14M8,13.91C6,13.91 2,15 2,17V18H14V17C14,15 10,13.91 8,13.91M8,6A3,3 0 0,0 5,9A3,3 0 0,0 8,12A3,3 0 0,0 11,9A3,3 0 0,0 8,6Z" />
</vector>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#000"
android:pathData="M5.5,7A1.5,1.5 0 0,0 7,5.5A1.5,1.5 0 0,0 5.5,4A1.5,1.5 0 0,0 4,5.5A1.5,1.5 0 0,0 5.5,7M21.41,11.58C21.77,11.94 22,12.44 22,13C22,13.55 21.78,14.05 21.41,14.41L14.41,21.41C14.05,21.77 13.55,22 13,22C12.45,22 11.95,21.77 11.58,21.41L2.59,12.41C2.22,12.05 2,11.55 2,11V4C2,2.89 2.89,2 4,2H11C11.55,2 12.05,2.22 12.41,2.58L21.41,11.58M13,20L20,13L11.5,4.5L4.5,11.5L13,20M10.09,8.91L11.5,7.5L17,13L15.59,14.41L10.09,8.91M7.59,11.41L9,10L13,14L11.59,15.41L7.59,11.41Z" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout style="@style/Widget.CoreSettings.Wrapper">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp">
<android.support.v7.widget.AppCompatImageView
style="@style/Widget.CoreSettings.PrimaryItemIcon"
app:srcCompat="@drawable/ic_account_card" />
<TextView
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_identity_names" />
</LinearLayout>
<LinearLayout
style="@style/Widget.CoreSettings.DependentGroup"
android:visibility="visible">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_identity_name">
<android.support.design.widget.TextInputEditText
android:id="@+id/identity_name"
style="@style/Widget.CoreSettings.EditText"
tools:text="Standardidentität" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_real_name">
<android.support.design.widget.TextInputEditText
android:id="@+id/real_name"
style="@style/Widget.CoreSettings.EditText"
tools:text="Janne Koschinski" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_ident">
<android.support.design.widget.TextInputEditText
android:id="@+id/ident"
style="@style/Widget.CoreSettings.EditText"
tools:text="justJanne" />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp">
<Space style="@style/Widget.CoreSettings.PrimaryItemIcon" />
<TextView
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_identity_nicks" />
</LinearLayout>
<LinearLayout
style="@style/Widget.CoreSettings.DependentGroup"
android:orientation="vertical"
android:visibility="visible">
<android.support.v7.widget.RecyclerView
android:id="@+id/nicks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:itemCount="4"
tools:listitem="@layout/settings_identity_nick" />
<LinearLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:orientation="horizontal">
<Button
android:id="@+id/new_nick"
style="@style/Widget.Button.Borderless.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_new_nick" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp">
<android.support.v7.widget.AppCompatImageView
style="@style/Widget.CoreSettings.PrimaryItemIcon"
app:srcCompat="@drawable/ic_message_bulleted" />
<TextView
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_identity_messages" />
</LinearLayout>
<LinearLayout
style="@style/Widget.CoreSettings.DependentGroup"
android:visibility="visible">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_kick_reason">
<android.support.design.widget.TextInputEditText
android:id="@+id/kick_reason"
style="@style/Widget.CoreSettings.EditText"
tools:text="" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_part_reason">
<android.support.design.widget.TextInputEditText
android:id="@+id/part_reason"
style="@style/Widget.CoreSettings.EditText"
tools:text="So if you care to find me, look to the western sky. As someone told me lately, everyone deserves a chance to fly." />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_quit_reason">
<android.support.design.widget.TextInputEditText
android:id="@+id/quit_reason"
style="@style/Widget.CoreSettings.EditText"
tools:text="So if you care to find me, look to the western sky. As someone told me lately, everyone deserves a chance to fly." />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp">
<android.support.v7.widget.AppCompatImageView
style="@style/Widget.CoreSettings.PrimaryItemIcon"
app:srcCompat="@drawable/ic_history" />
<TextView
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_identity_away" />
</LinearLayout>
<LinearLayout
style="@style/Widget.CoreSettings.DependentGroup"
android:visibility="visible">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_away_reason">
<android.support.design.widget.TextInputEditText
android:id="@+id/away_reason"
style="@style/Widget.CoreSettings.EditText"
tools:text="Gone Fishing." />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp">
<Space style="@style/Widget.CoreSettings.PrimaryItemIcon" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/detach_away"
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_identity_detach_away" />
</LinearLayout>
<LinearLayout
android:id="@+id/detach_away_group"
style="@style/Widget.CoreSettings.DependentGroup"
tools:visibility="visible">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_identity_detach_away_reason">
<android.support.design.widget.TextInputEditText
android:id="@+id/detach_away_reason"
style="@style/Widget.CoreSettings.EditText"
tools:text="Gone Fishing." />
</android.support.design.widget.TextInputLayout>
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
app:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:orientation="horizontal">
<TextView
android:id="@+id/nick"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:paddingLeft="?listPreferredItemPaddingLeft"
android:paddingStart="?listPreferredItemPaddingLeft"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
tools:text="@sample/messages.json/data/sender" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/handle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingEnd="?listPreferredItemPaddingRight"
android:paddingLeft="32dp"
android:paddingRight="?listPreferredItemPaddingRight"
android:paddingStart="32dp"
app:srcCompat="@drawable/ic_reorder"
app:tint="?colorTextSecondary" />
</LinearLayout>
</android.support.v7.widget.CardView>
\ No newline at end of file
...@@ -35,6 +35,6 @@ ...@@ -35,6 +35,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?colorTextPrimary" android:textColor="?colorTextPrimary"
tools:visibility="gone" /> android:visibility="gone" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list" android:id="@+id/list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
\ No newline at end of file tools:listitem="@layout/settings_item" />
\ No newline at end of file
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
<string name="label_delete_all">Alle Löschen</string> <string name="label_delete_all">Alle Löschen</string>
<string name="label_details">Details</string> <string name="label_details">Details</string>
<string name="label_disconnect">Verbindung trennen</string> <string name="label_disconnect">Verbindung trennen</string>
<string name="label_edit_nick">Spitznamen bearbeiten</string>
<string name="label_filter_messages">Nachrichten filtern</string> <string name="label_filter_messages">Nachrichten filtern</string>
<string name="label_github">GitHub</string> <string name="label_github">GitHub</string>
<string name="label_hide_perm">Permanent ausblenden</string> <string name="label_hide_perm">Permanent ausblenden</string>
...@@ -32,6 +33,7 @@ ...@@ -32,6 +33,7 @@
<string name="label_libraries">Bibliotheken</string> <string name="label_libraries">Bibliotheken</string>
<string name="label_license">Lizenz</string> <string name="label_license">Lizenz</string>
<string name="label_new_account">Account hinzufügen</string> <string name="label_new_account">Account hinzufügen</string>
<string name="label_new_nick">Spitzname hinzufügen</string>
<string name="label_no">Nein</string> <string name="label_no">Nein</string>
<string name="label_reset">Zurücksetzen</string> <string name="label_reset">Zurücksetzen</string>
<string name="label_open">Öffnen</string> <string name="label_open">Öffnen</string>
......
...@@ -20,4 +20,23 @@ ...@@ -20,4 +20,23 @@
<string name="settings_networkconfig_auto_who_delay_unit">Sekunden</string> <string name="settings_networkconfig_auto_who_delay_unit">Sekunden</string>
<string name="settings_networkconfig_standard_ctcp">Standardkonformes CTCP-Verhalten aktivieren</string> <string name="settings_networkconfig_standard_ctcp">Standardkonformes CTCP-Verhalten aktivieren</string>
<string name="settings_identities_title">Identitäten</string>
<string name="settings_identities_description" />
<string name="settings_identity_title">Identität</string>
<string name="settings_identity_names">Namen</string>
<string name="settings_identity_identity_name">Identitätsname</string>
<string name="settings_identity_real_name">Realname</string>
<string name="settings_identity_ident">Ident</string>
<string name="settings_identity_nicks">Spitznamen</string>
<string name="settings_identity_messages">Meldungen</string>
<string name="settings_identity_kick_reason">Rauswurfgrund</string>
<string name="settings_identity_part_reason">Part-Grund</string>
<string name="settings_identity_quit_reason">Beendigungsgrund</string>
<string name="settings_identity_away">Abwesenheitsmeldungen</string>
<string name="settings_identity_away_reason">Abwesenheitsgrund</string>
<string name="settings_identity_detach_away">Abwesend wenn nicht verbunden</string>
<string name="settings_identity_detach_away_reason">Abwesenheitsgrund</string>
</resources> </resources>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment