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

Implement networkconfig setting

parent b9c5850d
No related branches found
No related tags found
No related merge requests found
Showing
with 565 additions and 15 deletions
package de.kuschku.quasseldroid.ui.settings.license package de.kuschku.quasseldroid.ui.clientsettings.license
import android.os.Bundle import android.os.Bundle
import android.text.Html import android.text.Html
......
package de.kuschku.quasseldroid.ui.settings.license package de.kuschku.quasseldroid.ui.clientsettings.license
import dagger.Module import dagger.Module
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
......
package de.kuschku.quasseldroid.ui.coresettings
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class CoreSettingsActivity : SettingsActivity(CoreSettingsFragment())
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings
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.TextView
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
import de.kuschku.quasseldroid.util.helper.visibleIf
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
class CoreSettingsFragment : 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.fragment_coresettings, container, false)
ButterKnife.bind(this, view)
list.layoutManager = LinearLayoutManager(context)
list.adapter = CoreSettingsAdapter(listOf(
CoreSetting(
getString(R.string.settings_networkconfig_title),
getString(R.string.settings_networkconfig_description),
Intent(requireContext(), NetworkConfigActivity::class.java)
)
))
return view
}
data class CoreSetting(
val title: CharSequence,
val summary: CharSequence? = null,
val intent: Intent? = null
)
class CoreSettingsAdapter(private val data: List<CoreSetting>) :
RecyclerView.Adapter<CoreSettingsAdapter.CoreSettingsViewHolder>() {
override fun getItemCount() = data.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CoreSettingsViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.widget_coresetting, parent, false)
)
override fun onBindViewHolder(holder: CoreSettingsViewHolder, position: Int) {
holder.bind(data[position])
}
class CoreSettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
@BindView(R.id.title)
lateinit var title: TextView
@BindView(R.id.summary)
lateinit var summary: TextView
var item: CoreSetting? = null
init {
ButterKnife.bind(this, itemView)
itemView.setOnClickListener {
item?.intent?.let(itemView.context::startActivity)
}
}
fun bind(item: CoreSetting) {
this.item = item
this.title.text = item.title
this.summary.text = item.summary
this.summary.visibleIf(!item.summary.isNullOrBlank())
}
}
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class CoreSettingsFragmentProvider {
@ContributesAndroidInjector
abstract fun CoreSettingsFragmentbind(): CoreSettingsFragment
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
abstract class SettingsFragment : ServiceBoundFragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
inflater?.inflate(R.menu.context_setting, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
R.id.action_save -> {
onSave()
true
}
else -> super.onOptionsItemSelected(item)
}
abstract fun onSave()
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.networkconfig
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class NetworkConfigActivity : SettingsActivity(NetworkConfigFragment())
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.networkconfig
import android.arch.lifecycle.Observer
import android.os.Bundle
import android.support.v7.widget.SwitchCompat
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.libquassel.quassel.syncables.NetworkConfig
import de.kuschku.libquassel.session.ISession
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 NetworkConfigFragment : SettingsFragment() {
private var networkConfig: NetworkConfig? = null
@BindView(R.id.ping_timeout_enabled)
lateinit var pingTimeoutEnabled: SwitchCompat
@BindView(R.id.ping_timeout_group)
lateinit var pingTimeoutGroup: ViewGroup
@BindView(R.id.ping_interval)
lateinit var pingInterval: EditText
@BindView(R.id.max_ping_count)
lateinit var maxPingCount: EditText
@BindView(R.id.auto_who_enabled)
lateinit var autoWhoEnabled: SwitchCompat
@BindView(R.id.auto_who_group)
lateinit var autoWhoGroup: ViewGroup
@BindView(R.id.auto_who_interval)
lateinit var autoWhoInterval: EditText
@BindView(R.id.auto_who_nick_limit)
lateinit var autoWhoNickLimit: EditText
@BindView(R.id.auto_who_delay)
lateinit var autoWhoDelay: EditText
@BindView(R.id.standard_ctcp)
lateinit var standardCtcp: SwitchCompat
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_networksettings, container, false)
ButterKnife.bind(this, view)
setHasOptionsMenu(true)
viewModel.session.map { it.map(ISession::networkConfig) }.toLiveData().observe(this, Observer {
it?.orNull()?.let {
this.networkConfig = it
pingTimeoutEnabled.isChecked = it.pingTimeoutEnabled()
pingInterval.setText(it.pingInterval().toString())
maxPingCount.setText(it.maxPingCount().toString())
autoWhoEnabled.isChecked = it.autoWhoEnabled()
autoWhoInterval.setText(it.autoWhoInterval().toString())
autoWhoNickLimit.setText(it.autoWhoNickLimit().toString())
autoWhoDelay.setText(it.autoWhoDelay().toString())
standardCtcp.isChecked = it.standardCtcp()
}
})
pingTimeoutEnabled.setDependent(pingTimeoutGroup)
autoWhoEnabled.setDependent(autoWhoGroup)
return view
}
override fun onSave() {
networkConfig?.let {
val config = it.copy()
config.setPingTimeoutEnabled(pingTimeoutEnabled.isChecked)
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()
it.requestUpdate(properties)
}
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings.networkconfig
import dagger.Module
import dagger.android.ContributesAndroidInjector
@Module
abstract class NetworkConfigFragmentProvider {
@ContributesAndroidInjector
abstract fun bindNetworkConfigFragment(): NetworkConfigFragment
}
\ No newline at end of file
package de.kuschku.quasseldroid.util.helper
import android.support.v7.widget.SwitchCompat
import android.view.ViewGroup
import de.kuschku.quasseldroid.util.ui.AnimationHelper
fun SwitchCompat.setDependent(view: ViewGroup, reverse: Boolean = false) {
this.setOnCheckedChangeListener { _, isChecked ->
if (reverse && !isChecked || !reverse && isChecked) {
AnimationHelper.expand(view)
} else {
AnimationHelper.collapse(view)
}
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.util.ui
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.Transformation
import kotlin.math.roundToLong
object AnimationHelper {
fun expand(v: ViewGroup) {
v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val targetHeight = v.measuredHeight
// Older versions of android (pre API 21) cancel animations for views with a height of 0.
v.layoutParams.height = 1
v.visibility = View.VISIBLE
v.clearAnimation()
v.startAnimation(object : Animation() {
init {
duration = (targetHeight / v.context.resources.displayMetrics.density).roundToLong()
}
override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
v.layoutParams.height = if (interpolatedTime == 1f)
ViewGroup.LayoutParams.WRAP_CONTENT
else
(targetHeight * interpolatedTime).toInt()
v.alpha = interpolatedTime
v.requestLayout()
}
override fun willChangeBounds(): Boolean {
return true
}
})
}
fun collapse(v: ViewGroup) {
val initialHeight = v.measuredHeight
v.clearAnimation()
v.startAnimation(object : Animation() {
init {
duration = (initialHeight / v.context.resources.displayMetrics.density).roundToLong()
}
override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
if (interpolatedTime == 1f) {
v.visibility = View.GONE
} else {
v.layoutParams.height = initialHeight - (initialHeight * interpolatedTime).toInt()
v.alpha = 1 - interpolatedTime
v.requestLayout()
}
}
override fun willChangeBounds(): Boolean {
return true
}
})
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.settings package de.kuschku.quasseldroid.util.ui
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
......
<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="M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2M8,14H6V12H8V14M8,11H6V9H8V11M8,8H6V6H8V8M15,14H10V12H15V14M18,11H10V9H18V11M18,8H10V6H18V8Z" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
\ 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_history" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/ping_timeout_enabled"
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_networkconfig_ping_timeout" />
</LinearLayout>
<LinearLayout
android:id="@+id/ping_timeout_group"
style="@style/Widget.CoreSettings.DependentGroup"
tools:visibility="visible">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_networkconfig_ping_interval">
<android.support.design.widget.TextInputEditText
android:id="@+id/ping_interval"
style="@style/Widget.CoreSettings.EditText"
android:inputType="number"
tools:text="30" />
</android.support.design.widget.TextInputLayout>
<TextView
style="@style/Widget.CoreSettings.EditTextSuffix"
android:text="@string/settings_networkconfig_ping_interval_unit" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_networkconfig_max_ping_count">
<android.support.design.widget.TextInputEditText
android:id="@+id/max_ping_count"
style="@style/Widget.CoreSettings.EditText"
android:inputType="number"
tools:text="10" />
</android.support.design.widget.TextInputLayout>
<TextView
style="@style/Widget.CoreSettings.EditTextSuffix"
android:text="@string/settings_networkconfig_max_ping_count_unit" />
</FrameLayout>
</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_account" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/auto_who_enabled"
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_networkconfig_auto_who" />
</LinearLayout>
<LinearLayout
android:id="@+id/auto_who_group"
style="@style/Widget.CoreSettings.DependentGroup"
tools:visibility="visible">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_networkconfig_auto_who_interval">
<android.support.design.widget.TextInputEditText
android:id="@+id/auto_who_interval"
style="@style/Widget.CoreSettings.EditText"
android:inputType="number"
tools:text="90" />
</android.support.design.widget.TextInputLayout>
<TextView
style="@style/Widget.CoreSettings.EditTextSuffix"
android:text="@string/settings_networkconfig_auto_who_interval_unit" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_networkconfig_auto_who_nick_limit">
<android.support.design.widget.TextInputEditText
android:id="@+id/auto_who_nick_limit"
style="@style/Widget.CoreSettings.EditText"
android:inputType="number"
tools:text="100" />
</android.support.design.widget.TextInputLayout>
<TextView
style="@style/Widget.CoreSettings.EditTextSuffix"
android:text="@string/settings_networkconfig_auto_who_nick_limit_unit" />
</FrameLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputLayout
style="@style/Widget.CoreSettings.EditTextLayout"
android:hint="@string/settings_networkconfig_auto_who_delay">
<android.support.design.widget.TextInputEditText
android:id="@+id/auto_who_delay"
style="@style/Widget.CoreSettings.EditText"
android:inputType="number"
tools:text="5" />
</android.support.design.widget.TextInputLayout>
<TextView
style="@style/Widget.CoreSettings.EditTextSuffix"
android:text="@string/settings_networkconfig_auto_who_delay_unit" />
</FrameLayout>
</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" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/standard_ctcp"
style="@style/Widget.CoreSettings.PrimaryItemSwitch"
android:text="@string/settings_networkconfig_standard_ctcp" />
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
...@@ -23,11 +23,11 @@ ...@@ -23,11 +23,11 @@
android:layout_width="56dp" android:layout_width="56dp"
android:layout_height="68dp"> android:layout_height="68dp">
<ImageView <android.support.v7.widget.AppCompatImageView
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:tint="#757575" app:tint="?android:textColorSecondary"
app:srcCompat="@drawable/ic_pencil" app:srcCompat="@drawable/ic_pencil"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
...@@ -61,11 +61,11 @@ ...@@ -61,11 +61,11 @@
android:layout_width="56dp" android:layout_width="56dp"
android:layout_height="68dp"> android:layout_height="68dp">
<ImageView <android.support.v7.widget.AppCompatImageView
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:tint="#757575" app:tint="?android:textColorSecondary"
app:srcCompat="@drawable/ic_server_network" app:srcCompat="@drawable/ic_server_network"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
...@@ -89,10 +89,6 @@ ...@@ -89,10 +89,6 @@
android:inputType="textUri" /> android:inputType="textUri" />
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<android.support.v4.widget.Space
android:layout_width="56dp"
android:layout_height="match_parent" />
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/portWrapper" android:id="@+id/portWrapper"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -125,11 +121,11 @@ ...@@ -125,11 +121,11 @@
android:layout_width="56dp" android:layout_width="56dp"
android:layout_height="68dp"> android:layout_height="68dp">
<ImageView <android.support.v7.widget.AppCompatImageView
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:tint="#757575" app:tint="?android:textColorSecondary"
app:srcCompat="@drawable/ic_account" app:srcCompat="@drawable/ic_account"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:focusable="true"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:paddingEnd="?android:attr/listPreferredItemPaddingRight"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:paddingStart="?android:attr/listPreferredItemPaddingLeft">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingTop="16dp">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textColor="?colorTextPrimary"
android:textSize="16sp"
tools:text="IRC Config" />
<TextView
android:id="@+id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?colorTextPrimary"
tools:visibility="gone" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
android:id="@+id/action_filter_messages" android:id="@+id/action_filter_messages"
android:title="@string/label_filter_messages" /> android:title="@string/label_filter_messages" />
<item <item
android:id="@+id/action_settings" android:id="@+id/action_core_settings"
android:title="@string/label_settings" /> android:title="@string/label_settings_core" />
<item
android:id="@+id/action_client_settings"
android:title="@string/label_settings_client" />
<item <item
android:id="@+id/action_disconnect" android:id="@+id/action_disconnect"
android:title="@string/label_disconnect" /> android:title="@string/label_disconnect" />
......
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_save"
android:title="@string/label_save"
app:showAsAction="ifRoom" />
</menu>
\ No newline at end of file
...@@ -41,6 +41,8 @@ ...@@ -41,6 +41,8 @@
<string name="label_save">Speichern</string> <string name="label_save">Speichern</string>
<string name="label_select">Auswählen</string> <string name="label_select">Auswählen</string>
<string name="label_settings">Einstellungen</string> <string name="label_settings">Einstellungen</string>
<string name="label_settings_client">Client-Einstellungen</string>
<string name="label_settings_core">Core-Einstellungen</string>
<string name="label_share">Teilen</string> <string name="label_share">Teilen</string>
<string name="label_share_crashreport">Absturzbericht Teilen</string> <string name="label_share_crashreport">Absturzbericht Teilen</string>
<string name="label_show_hidden">Alle anzeigen</string> <string name="label_show_hidden">Alle anzeigen</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment