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

Improved core info UI

parent cea66cf3
No related branches found
No related tags found
No related merge requests found
Pipeline #
...@@ -20,6 +20,9 @@ import de.kuschku.quasseldroid.util.helper.getVectorDrawableCompat ...@@ -20,6 +20,9 @@ import de.kuschku.quasseldroid.util.helper.getVectorDrawableCompat
import de.kuschku.quasseldroid.util.helper.styledAttributes import de.kuschku.quasseldroid.util.helper.styledAttributes
import de.kuschku.quasseldroid.util.helper.tint import de.kuschku.quasseldroid.util.helper.tint
import de.kuschku.quasseldroid.util.helper.visibleIf import de.kuschku.quasseldroid.util.helper.visibleIf
import org.threeten.bp.ZoneId
import org.threeten.bp.format.DateTimeFormatter
import org.threeten.bp.format.FormatStyle
class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.ClientViewHolder>( class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.ClientViewHolder>(
object : DiffUtil.ItemCallback<CoreInfo.ConnectedClientData>() { object : DiffUtil.ItemCallback<CoreInfo.ConnectedClientData>() {
...@@ -41,14 +44,18 @@ class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.Cl ...@@ -41,14 +44,18 @@ class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.Cl
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ClientViewHolder( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ClientViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.widget_client, parent, false), LayoutInflater.from(parent.context).inflate(R.layout.widget_client, parent, false),
dateTimeFormatter,
::disconnect ::disconnect
) )
private val dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
override fun onBindViewHolder(holder: ClientViewHolder, position: Int) = override fun onBindViewHolder(holder: ClientViewHolder, position: Int) =
holder.bind(getItem(position)) holder.bind(getItem(position))
class ClientViewHolder( class ClientViewHolder(
itemView: View, itemView: View,
private val dateTimeFormatter: DateTimeFormatter,
private val disconnectListener: (Int) -> Unit private val disconnectListener: (Int) -> Unit
) : RecyclerView.ViewHolder(itemView) { ) : RecyclerView.ViewHolder(itemView) {
...@@ -97,8 +104,9 @@ class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.Cl ...@@ -97,8 +104,9 @@ class ClientAdapter : ListAdapter<CoreInfo.ConnectedClientData, ClientAdapter.Cl
ip.text = data.remoteAddress ip.text = data.remoteAddress
version.text = Html.fromHtml(data.clientVersion) version.text = Html.fromHtml(data.clientVersion)
val connectedSinceFormatted = dateTimeFormatter.format(data.connectedSince.atZone(ZoneId.systemDefault()))
uptime.text = itemView.context.getString(R.string.label_core_connected_since, uptime.text = itemView.context.getString(R.string.label_core_connected_since,
data.connectedSince.toString()) connectedSinceFormatted)
location.text = data.location location.text = data.location
location.visibleIf(data.location.isNotBlank()) location.visibleIf(data.location.isNotBlank())
......
...@@ -27,15 +27,23 @@ import android.text.Html ...@@ -27,15 +27,23 @@ import android.text.Html
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.quassel.QuasselFeatures
import de.kuschku.libquassel.util.helpers.value import de.kuschku.libquassel.util.helpers.value
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.ssl.X509Helper import de.kuschku.quasseldroid.ssl.X509Helper
import de.kuschku.quasseldroid.util.helper.* import de.kuschku.quasseldroid.util.helper.*
import de.kuschku.quasseldroid.util.missingfeatures.MissingFeature
import de.kuschku.quasseldroid.util.missingfeatures.MissingFeaturesDialog
import de.kuschku.quasseldroid.util.missingfeatures.RequiredFeatures
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
import org.threeten.bp.ZoneId
import org.threeten.bp.format.DateTimeFormatter
import org.threeten.bp.format.FormatStyle
class CoreInfoFragment : ServiceBoundFragment() { class CoreInfoFragment : ServiceBoundFragment() {
...@@ -45,6 +53,9 @@ class CoreInfoFragment : ServiceBoundFragment() { ...@@ -45,6 +53,9 @@ class CoreInfoFragment : ServiceBoundFragment() {
@BindView(R.id.version_date) @BindView(R.id.version_date)
lateinit var versionDate: TextView lateinit var versionDate: TextView
@BindView(R.id.missing_features)
lateinit var missingFeatures: Button
@BindView(R.id.uptime_container) @BindView(R.id.uptime_container)
lateinit var uptimeContainer: View lateinit var uptimeContainer: View
...@@ -63,22 +74,38 @@ class CoreInfoFragment : ServiceBoundFragment() { ...@@ -63,22 +74,38 @@ class CoreInfoFragment : ServiceBoundFragment() {
@BindView(R.id.clients) @BindView(R.id.clients)
lateinit var clients: RecyclerView lateinit var clients: RecyclerView
private val dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
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_info_core, container, false) val view = inflater.inflate(R.layout.fragment_info_core, container, false)
ButterKnife.bind(this, view) ButterKnife.bind(this, view)
var missingFeatureList: List<MissingFeature> = emptyList()
viewModel.coreInfo.toLiveData().observe(this, Observer { viewModel.coreInfo.toLiveData().observe(this, Observer {
it?.orNull().let { it?.orNull().let { data ->
version.text = it?.quasselVersion?.let(Html::fromHtml) version.text = data?.quasselVersion?.let(Html::fromHtml)
versionDate.text = it?.quasselBuildDate?.let(Html::fromHtml) versionDate.text = data?.quasselBuildDate?.let(Html::fromHtml)
val features = viewModel.session.value?.orNull()?.features?.core
?: QuasselFeatures.empty()
missingFeatureList = RequiredFeatures.features.filter {
it.feature !in features.enabledFeatures
}
missingFeatures.visibleIf(missingFeatureList.isNotEmpty())
val startTime = it?.startTime?.toString() val startTime = data?.startTime?.atZone(ZoneId.systemDefault())?.let(dateTimeFormatter::format)
uptime.text = requireContext().getString(R.string.label_core_online_since, uptime.text = requireContext().getString(R.string.label_core_online_since,
startTime.toString()) startTime.toString())
uptimeContainer.visibleIf(startTime != null) uptimeContainer.visibleIf(startTime != null)
} }
}) })
missingFeatures.setOnClickListener {
MissingFeaturesDialog.Builder(requireActivity())
.missingFeatures(missingFeatureList)
.readOnly(true)
.show()
}
val secure = requireContext().getVectorDrawableCompat(R.drawable.ic_lock)?.mutate() val secure = requireContext().getVectorDrawableCompat(R.drawable.ic_lock)?.mutate()
val partiallySecure = requireContext().getVectorDrawableCompat(R.drawable.ic_lock)?.mutate() val partiallySecure = requireContext().getVectorDrawableCompat(R.drawable.ic_lock)?.mutate()
......
...@@ -44,9 +44,10 @@ class MissingFeaturesDialog : DialogFragment() { ...@@ -44,9 +44,10 @@ class MissingFeaturesDialog : DialogFragment() {
val dialog = MaterialDialog.Builder(requireContext()) val dialog = MaterialDialog.Builder(requireContext())
.customView(R.layout.dialog_missing_features, true) .customView(R.layout.dialog_missing_features, true)
.title(R.string.label_missing_features) .title(R.string.label_missing_features)
.positiveText(R.string.label_accept) .also {
.also { dialog -> it.positiveText(if (builder?.readOnly == true) R.string.label_accept
builder?.positiveListener?.let(dialog::onPositive) else R.string.label_close)
builder?.positiveListener?.let(it::onPositive)
} }
.build() .build()
ButterKnife.bind(this, dialog.customView!!) ButterKnife.bind(this, dialog.customView!!)
...@@ -82,12 +83,18 @@ class MissingFeaturesDialog : DialogFragment() { ...@@ -82,12 +83,18 @@ class MissingFeaturesDialog : DialogFragment() {
var dismissListener: DialogInterface.OnDismissListener? = null var dismissListener: DialogInterface.OnDismissListener? = null
var positiveListener: MaterialDialog.SingleButtonCallback? = null var positiveListener: MaterialDialog.SingleButtonCallback? = null
var missingFeatures: List<MissingFeature>? = null var missingFeatures: List<MissingFeature>? = null
var readOnly: Boolean = false
fun missingFeatures(missingFeatures: List<MissingFeature>): Builder { fun missingFeatures(missingFeatures: List<MissingFeature>): Builder {
this.missingFeatures = missingFeatures this.missingFeatures = missingFeatures
return this return this
} }
fun readOnly(readOnly: Boolean): Builder {
this.readOnly = readOnly
return this
}
fun dismissListener(dismissListener: DialogInterface.OnDismissListener): Builder { fun dismissListener(dismissListener: DialogInterface.OnDismissListener): Builder {
this.dismissListener = dismissListener this.dismissListener = dismissListener
return this return this
......
...@@ -45,6 +45,13 @@ ...@@ -45,6 +45,13 @@
android:id="@+id/version_date" android:id="@+id/version_date"
style="@style/Widget.Info.Item.Description" style="@style/Widget.Info.Item.Description"
tools:text="June 8, 2018" /> tools:text="June 8, 2018" />
<Button
android:id="@+id/missing_features"
style="@style/Widget.Button.Borderless.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_missing_features" />
</LinearLayout> </LinearLayout>
<View <View
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment