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

Improve settings and license screen UI

parent 96eb9c6e
Branches
Tags
No related merge requests found
Showing
with 191 additions and 221 deletions
......@@ -76,23 +76,17 @@
android:parentActivityName=".ui.chat.ChatActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.coresettings.networkconfig.NetworkConfigActivity"
android:name=".ui.coresettings.identity.IdentityActivity"
android:exported="false"
android:label="@string/settings_networkconfig_title"
android:label="@string/settings_identity_title"
android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.coresettings.identity.IdentitiesActivity"
android:name=".ui.coresettings.networkconfig.NetworkConfigActivity"
android:exported="false"
android:label="@string/settings_identities_title"
android:label="@string/settings_networkconfig_title"
android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.coresettings.identity.IdentityActivity"
android:exported="false"
android:label="@string/settings_identity_title"
android:parentActivityName=".ui.coresettings.identity.IdentitiesActivity"
android:windowSoftInputMode="adjustResize" />
<!-- Client Setup Flow -->
<activity
......
......@@ -18,8 +18,6 @@ import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider
import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity
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
......@@ -53,9 +51,6 @@ abstract class ActivityModule {
@ContributesAndroidInjector(modules = [CoreSettingsFragmentProvider::class])
abstract fun bindCoreSettingsActivity(): CoreSettingsActivity
@ContributesAndroidInjector(modules = [IdentitiesFragmentProvider::class])
abstract fun bindIdentitiesActivity(): IdentitiesActivity
@ContributesAndroidInjector(modules = [IdentityFragmentProvider::class])
abstract fun bindIdentityActivity(): IdentityActivity
......
......@@ -139,6 +139,21 @@ class AboutSettingsFragment : DaggerFragment() {
license = apache2,
url = "https://github.com/square/leakcanary"
),
Library(
name = "Material Design Icons: Community",
license = License(
shortName = "SIL Open Font License v1.1",
fullName = "SIL OPEN FONT LICENSE",
text = R.string.license_materialdesignicons
),
url = "https://github.com/Templarian/MaterialDesign"
),
Library(
name = "Material Design Icons: Google",
version = "3.0.1",
license = apache2,
url = "https://github.com/google/material-design-icons"
),
Library(
name = "Material Dialogs",
version = "0.9.6.0",
......@@ -179,27 +194,27 @@ class AboutSettingsFragment : DaggerFragment() {
Contributor(
name = "Frederik M. J. Vestre",
nickName = "freqmod",
description = "Initial qdatastream deserialization attempts"
description = getString(R.string.contributor_description_freqmod)
),
Contributor(
name = "Martin “Java Sucks” Sandsmark",
nickName = "sandsmark",
description = "Legacy protocol implementation, (de)serializers, project (de)moralizer"
description = getString(R.string.contributor_description_sandsmark)
),
Contributor(
name = "Magnus Fjell",
nickName = "magnuf",
description = "Legacy UI"
description = getString(R.string.contributor_description_magnuf)
),
Contributor(
name = "Ken Børge Viktil",
nickName = "Kenji",
description = "Legacy UI"
description = getString(R.string.contributor_description_kenji)
),
Contributor(
name = "Janne Koschinski",
nickName = "justJanne",
description = "Rewrite, UI, Annotation Processors, Backend"
description = getString(R.string.contributor_description_justjanne)
)
))
contributors.addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
......
......@@ -2,7 +2,7 @@ package de.kuschku.quasseldroid.ui.clientsettings.about
data class Library(
val name: String,
val version: String,
val version: String? = null,
val license: License,
val url: String? = null
)
\ No newline at end of file
......@@ -10,6 +10,7 @@ import butterknife.BindView
import butterknife.ButterKnife
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
import de.kuschku.quasseldroid.util.helper.visibleIf
class LibraryAdapter(private val libraries: List<Library>) :
RecyclerView.Adapter<LibraryAdapter.LibraryViewHolder>() {
......@@ -39,8 +40,7 @@ class LibraryAdapter(private val libraries: List<Library>) :
ButterKnife.bind(this, itemView)
itemView.setOnClickListener {
this.item?.run {
val intent = Intent(itemView.context,
LicenseSettingsActivity::class.java)
val intent = Intent(itemView.context, LicenseSettingsActivity::class.java)
intent.putExtra("license_name", license.fullName)
intent.putExtra("license_text", license.text)
itemView.context.startActivity(intent)
......@@ -52,6 +52,7 @@ class LibraryAdapter(private val libraries: List<Library>) :
this.item = item
this.name.text = item.name
this.version.text = item.version
this.version.visibleIf(!item.version.isNullOrBlank())
this.license.text = item.license.shortName
}
}
......
......@@ -2,4 +2,4 @@ package de.kuschku.quasseldroid.ui.clientsettings.license
import de.kuschku.quasseldroid.util.ui.SettingsActivity
class LicenseSettingsActivity : SettingsActivity()
\ No newline at end of file
class LicenseSettingsActivity : SettingsActivity(LicenseSettingsFragment())
\ No newline at end of file
......@@ -12,9 +12,6 @@ import dagger.android.support.DaggerFragment
import de.kuschku.quasseldroid.R
class LicenseSettingsFragment : DaggerFragment() {
@BindView(R.id.name)
lateinit var name: TextView
@BindView(R.id.text)
lateinit var text: TextView
......@@ -23,8 +20,6 @@ class LicenseSettingsFragment : DaggerFragment() {
val view = inflater.inflate(R.layout.fragment_license, container, false)
ButterKnife.bind(this, view)
name.text = arguments?.getString("license_name")
val textResource = arguments?.getInt("license_text", 0) ?: 0
if (textResource != 0) {
text.text = Html.fromHtml(getString(textResource))
......
package de.kuschku.quasseldroid.ui.coresettings
import android.arch.lifecycle.Observer
import android.content.Intent
import android.os.Bundle
import android.support.v4.view.ViewCompat
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.quassel.syncables.BufferViewConfig
import de.kuschku.libquassel.quassel.syncables.Identity
import de.kuschku.libquassel.quassel.syncables.Network
import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentitiesActivity
import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity
import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
import de.kuschku.quasseldroid.util.helper.visibleIf
import de.kuschku.quasseldroid.util.helper.combineLatest
import de.kuschku.quasseldroid.util.helper.toLiveData
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
class CoreSettingsFragment : ServiceBoundFragment() {
@BindView(R.id.list)
lateinit var list: RecyclerView
@BindView(R.id.networks)
lateinit var networks: RecyclerView
@BindView(R.id.identities)
lateinit var identities: RecyclerView
@BindView(R.id.chatlists)
lateinit var chatlists: RecyclerView
@BindView(R.id.networkconfig)
lateinit var networkConfig: View
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 = CoreSettingsAdapter(listOf(
CoreSetting(
getString(R.string.settings_identities_title),
getString(R.string.settings_identities_description),
Intent(requireContext(), IdentitiesActivity::class.java)
),
CoreSetting(
getString(R.string.settings_networkconfig_title),
getString(R.string.settings_networkconfig_description),
Intent(requireContext(), NetworkConfigActivity::class.java)
)
))
list.adapter = adapter
list.layoutManager = LinearLayoutManager(context)
list.addItemDecoration(DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL))
val networkAdapter = SettingsItemAdapter {
/*
val intent = Intent(requireContext(), NetworkActivity::class.java)
intent.putExtra("network", it)
startActivity(intent)
*/
}
return view
val identityAdapter = SettingsItemAdapter {
val intent = Intent(requireContext(), IdentityActivity::class.java)
intent.putExtra("identity", it)
startActivity(intent)
}
data class CoreSetting(
val title: CharSequence,
val summary: CharSequence? = null,
val intent: Intent? = null
)
val chatListAdapter = SettingsItemAdapter {
/*
val intent = Intent(requireContext(), BufferViewConfigActivity::class.java)
intent.putExtra("bufferviewconfig", it)
startActivity(intent)
*/
}
class CoreSettingsAdapter(private val data: List<CoreSetting>) :
RecyclerView.Adapter<CoreSettingsAdapter.CoreSettingsViewHolder>() {
override fun getItemCount() = data.size
val itemDecoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = CoreSettingsViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.settings_item, parent, false)
)
networks.adapter = networkAdapter
networks.layoutManager = LinearLayoutManager(context)
networks.addItemDecoration(itemDecoration)
ViewCompat.setNestedScrollingEnabled(networks, false)
override fun onBindViewHolder(holder: CoreSettingsViewHolder, position: Int) {
holder.bind(data[position])
viewModel.networks.switchMap {
combineLatest(it.values.map(Network::liveNetworkInfo)).map {
it.map {
SettingsItem(it.networkId, it.networkName)
}.sortedBy(SettingsItem::name)
}
}.toLiveData().observe(this, Observer {
networkAdapter.submitList(it.orEmpty())
})
class CoreSettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
@BindView(R.id.title)
lateinit var title: TextView
identities.adapter = identityAdapter
identities.layoutManager = LinearLayoutManager(context)
identities.addItemDecoration(itemDecoration)
ViewCompat.setNestedScrollingEnabled(identities, false)
@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)
}
viewModel.identities.switchMap {
combineLatest(it.values.map(Identity::liveUpdates)).map {
it.map {
SettingsItem(it.id(), it.identityName())
}.sortedBy(SettingsItem::name)
}
}.toLiveData().observe(this, Observer {
identityAdapter.submitList(it.orEmpty())
})
fun bind(item: CoreSetting) {
this.item = item
chatlists.adapter = chatListAdapter
chatlists.layoutManager = LinearLayoutManager(context)
chatlists.addItemDecoration(itemDecoration)
ViewCompat.setNestedScrollingEnabled(chatlists, false)
this.title.text = item.title
this.summary.text = item.summary
this.summary.visibleIf(!item.summary.isNullOrBlank())
viewModel.bufferViewConfigs.switchMap {
combineLatest(it.map(BufferViewConfig::live_config)).map {
it.map {
SettingsItem(it.bufferViewId(), it.bufferViewName())
}.sortedBy(SettingsItem::name)
}
}.toLiveData().observe(this, Observer {
chatListAdapter.submitList(it.orEmpty())
})
networkConfig.setOnClickListener {
startActivity(Intent(requireContext(), NetworkConfigActivity::class.java))
}
return view
}
}
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings
data class SettingsItem(
val id: Int,
val name: String
)
\ No newline at end of file
package de.kuschku.quasseldroid.ui.coresettings
import android.support.v7.recyclerview.extensions.ListAdapter
import android.support.v7.util.DiffUtil
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.quasseldroid.R
class SettingsItemAdapter(private val clickListener: (Int) -> Unit) :
ListAdapter<SettingsItem, SettingsItemAdapter.SettingsItemViewHolder>(
object : DiffUtil.ItemCallback<SettingsItem>() {
override fun areItemsTheSame(oldItem: SettingsItem, newItem: SettingsItem) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: SettingsItem, newItem: SettingsItem) =
oldItem == newItem
}
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = SettingsItemViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.settings_item, parent, false),
clickListener
)
override fun onBindViewHolder(holder: SettingsItemViewHolder, position: Int) {
holder.bind(getItem(position))
}
class SettingsItemViewHolder(itemView: View, clickListener: (Int) -> 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: SettingsItem) {
this.id = item.id
this.title.text = item.name
}
}
}
\ No newline at end of file
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
}
......@@ -2,6 +2,7 @@ package de.kuschku.quasseldroid.ui.coresettings.identity
import android.arch.lifecycle.Observer
import android.os.Bundle
import android.support.v4.view.ViewCompat
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.ViewHolder
......@@ -98,6 +99,8 @@ class IdentityFragment : SettingsFragment() {
adapter = IdentityNicksAdapter(::nickClick, ::startDrag)
nicks.layoutManager = LinearLayoutManager(requireContext())
nicks.adapter = adapter
ViewCompat.setNestedScrollingEnabled(nicks, false)
val callback = DragSortItemTouchHelperCallback(adapter)
helper = ItemTouchHelper(callback)
helper.attachToRecyclerView(nicks)
......
<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="M7,5H21V7H7V5M7,13V11H21V13H7M4,4.5A1.5,1.5 0 0,1 5.5,6A1.5,1.5 0 0,1 4,7.5A1.5,1.5 0 0,1 2.5,6A1.5,1.5 0 0,1 4,4.5M4,10.5A1.5,1.5 0 0,1 5.5,12A1.5,1.5 0 0,1 4,13.5A1.5,1.5 0 0,1 2.5,12A1.5,1.5 0 0,1 4,10.5M7,19V17H21V19H7M4,16.5A1.5,1.5 0 0,1 5.5,18A1.5,1.5 0 0,1 4,19.5A1.5,1.5 0 0,1 2.5,18A1.5,1.5 0 0,1 4,16.5Z" />
</vector>
\ No newline at end of file
......@@ -2,7 +2,8 @@
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
......
......@@ -32,5 +32,6 @@
android:id="@+id/chatList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
tools:listitem="@layout/widget_buffer" />
</LinearLayout>
......@@ -2,4 +2,5 @@
<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
android:layout_height="match_parent"
android:scrollbars="vertical" />
\ No newline at end of file
......@@ -5,24 +5,10 @@
android:layout_height="match_parent"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
tools:text="Apache-2.0" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
tools:text="@string/license_apache_2" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
......@@ -16,6 +16,7 @@
android:id="@+id/messages"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:stackFromEnd="true"
tools:listitem="@layout/widget_chatmessage_plain" />
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment