From e27f3d13669b6f92e9373d4c738f3c483aa193e3 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 29 Mar 2018 00:35:09 +0200
Subject: [PATCH] Implement translation and actions for detailled info screen

---
 .../quasseldroid/ui/chat/info/InfoData.kt     |  1 -
 .../quasseldroid/ui/chat/info/InfoFragment.kt | 34 ++++++----
 .../quasseldroid/ui/chat/info/InfoGroup.kt    |  7 ++
 .../ui/chat/info/InfoGroupAdapter.kt          |  7 +-
 .../ui/chat/info}/InfoProperty.kt             |  5 +-
 .../ui/chat/info/InfoPropertyAction.kt        |  7 ++
 .../ui/chat/info/InfoPropertyActionAdapter.kt | 66 +++++++++++++++++++
 .../ui/chat/info/InfoPropertyAdapter.kt       | 15 ++++-
 app/src/main/res/layout/fragment_info.xml     |  2 +-
 .../main/res/layout/widget_info_action.xml    |  9 +++
 .../res/layout/widget_info_action_main.xml    |  9 +++
 ...erinfo_group.xml => widget_info_group.xml} |  2 +-
 ..._userinfo.xml => widget_info_property.xml} |  9 +++
 .../main/res/values-de/strings_properties.xml | 14 ++++
 .../main/res/values/strings_properties.xml    | 14 ++++
 app/src/main/res/values/styles_widgets.xml    |  6 ++
 .../quasseldroid/viewmodel/data/InfoGroup.kt  |  6 --
 17 files changed, 184 insertions(+), 29 deletions(-)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroup.kt
 rename {viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data => app/src/main/java/de/kuschku/quasseldroid/ui/chat/info}/InfoProperty.kt (53%)
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAction.kt
 create mode 100644 app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyActionAdapter.kt
 create mode 100644 app/src/main/res/layout/widget_info_action.xml
 create mode 100644 app/src/main/res/layout/widget_info_action_main.xml
 rename app/src/main/res/layout/{widget_userinfo_group.xml => widget_info_group.xml} (95%)
 rename app/src/main/res/layout/{widget_userinfo.xml => widget_info_property.xml} (87%)
 create mode 100644 app/src/main/res/values-de/strings_properties.xml
 create mode 100644 app/src/main/res/values/strings_properties.xml
 delete mode 100644 viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoGroup.kt

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoData.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoData.kt
index 9781851c6..de024f9ec 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoData.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoData.kt
@@ -3,7 +3,6 @@ package de.kuschku.quasseldroid.ui.chat.info
 import de.kuschku.libquassel.quassel.syncables.IrcChannel
 import de.kuschku.libquassel.quassel.syncables.IrcUser
 import de.kuschku.libquassel.quassel.syncables.Network
-import de.kuschku.quasseldroid.viewmodel.data.InfoGroup
 
 data class InfoData(
   val type: InfoType,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
index 38988bc37..acb8d8c7b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoFragment.kt
@@ -7,6 +7,7 @@ import android.support.v7.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Toast
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.libquassel.util.Optional
@@ -15,8 +16,6 @@ import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.util.irc.format.ContentFormatter
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
-import de.kuschku.quasseldroid.viewmodel.data.InfoGroup
-import de.kuschku.quasseldroid.viewmodel.data.InfoProperty
 import io.reactivex.Observable
 import javax.inject.Inject
 
@@ -52,26 +51,26 @@ class InfoFragment : ServiceBoundFragment() {
                   network = network,
                   properties = listOf(
                     InfoGroup(
-                      name = "Identity",
+                      name = getString(R.string.property_group_ircuser_identity),
                       properties = listOf(
                         InfoProperty(
-                          name = "Nickname",
+                          name = getString(R.string.property_ircuser_nick),
                           value = user.nick()
                         ),
                         InfoProperty(
-                          name = "Ident",
+                          name = getString(R.string.property_ircuser_user),
                           value = user.user()
                         ),
                         InfoProperty(
-                          name = "Host",
+                          name = getString(R.string.property_ircuser_host),
                           value = user.host()
                         ),
                         InfoProperty(
-                          name = "Real Name",
+                          name = getString(R.string.property_ircuser_realname),
                           value = contentFormatter.format(requireContext(), user.realName())
                         ),
                         InfoProperty(
-                          name = "Account",
+                          name = getString(R.string.property_ircuser_account),
                           value = user.account()
                         )
                       )
@@ -89,11 +88,24 @@ class InfoFragment : ServiceBoundFragment() {
                 network = network,
                 properties = listOf(
                   InfoGroup(
-                    name = "Channel",
+                    name = getString(R.string.property_group_ircchannel_channel),
                     properties = listOf(
                       InfoProperty(
-                        name = "Topic",
-                        value = contentFormatter.format(requireContext(), channel.topic())
+                        name = getString(R.string.property_ircchannel_topic),
+                        value = contentFormatter.format(requireContext(), channel.topic()),
+                        actions = listOf(
+                          InfoPropertyAction(
+                            name = getString(R.string.property_ircchannel_topic_action_edit),
+                            featured = true,
+                            onClick = {
+                              Toast.makeText(
+                                requireContext(),
+                                "Not implemented",
+                                Toast.LENGTH_SHORT
+                              ).show()
+                            }
+                          )
+                        )
                       )
                     )
                   )
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroup.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroup.kt
new file mode 100644
index 000000000..0aa745099
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroup.kt
@@ -0,0 +1,7 @@
+package de.kuschku.quasseldroid.ui.chat.info
+
+data class InfoGroup(
+  val name: CharSequence,
+  val properties: List<InfoProperty>
+)
+
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroupAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroupAdapter.kt
index 3bf3418e3..dac37f913 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroupAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoGroupAdapter.kt
@@ -12,7 +12,6 @@ import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.quasseldroid.R
-import de.kuschku.quasseldroid.viewmodel.data.InfoGroup
 
 class InfoGroupAdapter :
   ListAdapter<InfoGroup, InfoGroupAdapter.InfoGroupViewHolder>(
@@ -26,7 +25,7 @@ class InfoGroupAdapter :
   ) {
 
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = InfoGroupViewHolder(
-    LayoutInflater.from(parent.context).inflate(R.layout.widget_userinfo_group, parent, false)
+    LayoutInflater.from(parent.context).inflate(R.layout.widget_info_group, parent, false)
   )
 
   override fun onBindViewHolder(holder: InfoGroupViewHolder, position: Int) =
@@ -39,13 +38,11 @@ class InfoGroupAdapter :
     @BindView(R.id.properties)
     lateinit var properties: RecyclerView
 
-    private val adapter: InfoPropertyAdapter
+    private val adapter = InfoPropertyAdapter()
 
     init {
       ButterKnife.bind(this, itemView)
 
-      adapter = InfoPropertyAdapter()
-
       properties.layoutManager = LinearLayoutManager(itemView.context)
       properties.adapter = adapter
       properties.addItemDecoration(
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoProperty.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoProperty.kt
similarity index 53%
rename from viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoProperty.kt
rename to app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoProperty.kt
index 92508529a..4ad5d5d70 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoProperty.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoProperty.kt
@@ -1,9 +1,10 @@
-package de.kuschku.quasseldroid.viewmodel.data
+package de.kuschku.quasseldroid.ui.chat.info
 
 import android.support.annotation.DrawableRes
 
 data class InfoProperty(
   val name: CharSequence? = null,
   @DrawableRes val icon: Int? = null,
-  val value: CharSequence
+  val value: CharSequence,
+  val actions: List<InfoPropertyAction> = emptyList()
 )
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAction.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAction.kt
new file mode 100644
index 000000000..c8608d7cc
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAction.kt
@@ -0,0 +1,7 @@
+package de.kuschku.quasseldroid.ui.chat.info
+
+data class InfoPropertyAction(
+  val name: CharSequence,
+  val featured: Boolean = false,
+  val onClick: () -> Unit
+)
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyActionAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyActionAdapter.kt
new file mode 100644
index 000000000..69fbf011a
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyActionAdapter.kt
@@ -0,0 +1,66 @@
+package de.kuschku.quasseldroid.ui.chat.info
+
+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.Button
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.quasseldroid.R
+
+class InfoPropertyActionAdapter :
+  ListAdapter<InfoPropertyAction, InfoPropertyActionAdapter.InfoPropertyActionViewHolder>(
+    object : DiffUtil.ItemCallback<InfoPropertyAction>() {
+      override fun areItemsTheSame(oldItem: InfoPropertyAction, newItem: InfoPropertyAction) =
+        oldItem.name == newItem.name
+
+      override fun areContentsTheSame(oldItem: InfoPropertyAction, newItem: InfoPropertyAction) =
+        oldItem == newItem
+    }
+  ) {
+  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = InfoPropertyActionViewHolder(
+    LayoutInflater.from(parent.context).inflate(
+      if (viewType == VIEWTYPE_FEATURED)
+        R.layout.widget_info_action_main
+      else
+        R.layout.widget_info_action,
+      parent,
+      false
+    )
+  )
+
+  override fun onBindViewHolder(holder: InfoPropertyActionViewHolder, position: Int) {
+    holder.bind(getItem(position))
+  }
+
+  override fun getItemViewType(position: Int) =
+    if (getItem(position).featured) VIEWTYPE_FEATURED else VIEWTYPE_NORMAL
+
+  class InfoPropertyActionViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+    @BindView(R.id.button)
+    lateinit var button: Button
+
+    private var onClick: (() -> Unit)? = null
+
+    init {
+      ButterKnife.bind(this, itemView)
+      button.setOnClickListener {
+        onClick?.invoke()
+      }
+    }
+
+    fun bind(item: InfoPropertyAction) {
+      this.onClick = item.onClick
+
+      button.text = item.name
+    }
+  }
+
+  companion object {
+    const val VIEWTYPE_NORMAL = 0
+    const val VIEWTYPE_FEATURED = 1
+  }
+}
\ No newline at end of file
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAdapter.kt
index 42d66b33b..a7ffa4f1a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/InfoPropertyAdapter.kt
@@ -2,6 +2,7 @@ package de.kuschku.quasseldroid.ui.chat.info
 
 import android.support.v7.recyclerview.extensions.ListAdapter
 import android.support.v7.util.DiffUtil
+import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.RecyclerView
 import android.view.LayoutInflater
 import android.view.View
@@ -12,7 +13,6 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.util.helper.visibleIf
-import de.kuschku.quasseldroid.viewmodel.data.InfoProperty
 import me.saket.bettermovementmethod.BetterLinkMovementMethod
 
 class InfoPropertyAdapter :
@@ -26,7 +26,7 @@ class InfoPropertyAdapter :
     }
   ) {
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = InfoPropertyViewHolder(
-    LayoutInflater.from(parent.context).inflate(R.layout.widget_userinfo, parent, false)
+    LayoutInflater.from(parent.context).inflate(R.layout.widget_info_property, parent, false)
   )
 
   override fun onBindViewHolder(holder: InfoPropertyViewHolder, position: Int) =
@@ -45,8 +45,17 @@ class InfoPropertyAdapter :
     @BindView(R.id.value)
     lateinit var value: TextView
 
+    @BindView(R.id.actions)
+    lateinit var actions: RecyclerView
+
+    private val adapter = InfoPropertyActionAdapter()
+
     init {
       ButterKnife.bind(this, itemView)
+
+      actions.layoutManager = LinearLayoutManager(itemView.context, RecyclerView.HORIZONTAL, false)
+      actions.adapter = adapter
+
       value.movementMethod = BetterLinkMovementMethod.getInstance()
     }
 
@@ -55,6 +64,8 @@ class InfoPropertyAdapter :
       name.text = item.name
       value.text = item.value
 
+      adapter.submitList(item.actions)
+
       iconFrame.visibleIf(item.icon != null)
     }
   }
diff --git a/app/src/main/res/layout/fragment_info.xml b/app/src/main/res/layout/fragment_info.xml
index 1425be77a..dc7eecec1 100644
--- a/app/src/main/res/layout/fragment_info.xml
+++ b/app/src/main/res/layout/fragment_info.xml
@@ -5,4 +5,4 @@
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingTop="12dp"
-  tools:listitem="@layout/widget_userinfo_group" />
\ No newline at end of file
+  tools:listitem="@layout/widget_info_group" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_info_action.xml b/app/src/main/res/layout/widget_info_action.xml
new file mode 100644
index 000000000..e856cbc5b
--- /dev/null
+++ b/app/src/main/res/layout/widget_info_action.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:id="@+id/button"
+  style="@style/Widget.Button.Borderless"
+  android:layout_width="wrap_content"
+  android:layout_height="wrap_content"
+  android:layout_marginTop="8dp"
+  tools:text="Change Topic" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_info_action_main.xml b/app/src/main/res/layout/widget_info_action_main.xml
new file mode 100644
index 000000000..7738bf5d6
--- /dev/null
+++ b/app/src/main/res/layout/widget_info_action_main.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:id="@+id/button"
+  style="@style/Widget.Button.Borderless.Colored"
+  android:layout_width="wrap_content"
+  android:layout_height="wrap_content"
+  android:layout_marginTop="8dp"
+  tools:text="Change Topic" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_userinfo_group.xml b/app/src/main/res/layout/widget_info_group.xml
similarity index 95%
rename from app/src/main/res/layout/widget_userinfo_group.xml
rename to app/src/main/res/layout/widget_info_group.xml
index cd1b58f84..f2d46a367 100644
--- a/app/src/main/res/layout/widget_userinfo_group.xml
+++ b/app/src/main/res/layout/widget_info_group.xml
@@ -27,6 +27,6 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     tools:itemCount="3"
-    tools:listitem="@layout/widget_userinfo" />
+    tools:listitem="@layout/widget_info_property" />
 
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/widget_userinfo.xml b/app/src/main/res/layout/widget_info_property.xml
similarity index 87%
rename from app/src/main/res/layout/widget_userinfo.xml
rename to app/src/main/res/layout/widget_info_property.xml
index a9846e5ea..af097757a 100644
--- a/app/src/main/res/layout/widget_userinfo.xml
+++ b/app/src/main/res/layout/widget_info_property.xml
@@ -65,5 +65,14 @@
       android:textAppearance="?android:attr/textAppearanceSmall"
       android:textColor="?colorTextSecondary"
       tools:text="@sample/userinfo_basic.json/data/value" />
+
+    <android.support.v7.widget.RecyclerView
+      android:id="@+id/actions"
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_marginLeft="-4dp"
+      android:layout_marginStart="-4dp"
+      android:orientation="horizontal"
+      tools:listitem="@layout/widget_info_action_main" />
   </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings_properties.xml b/app/src/main/res/values-de/strings_properties.xml
new file mode 100644
index 000000000..1403dac82
--- /dev/null
+++ b/app/src/main/res/values-de/strings_properties.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <string name="property_group_ircuser_identity">Identität</string>
+  <string name="property_ircuser_nick">Spitzname</string>
+  <string name="property_ircuser_user">Ident</string>
+  <string name="property_ircuser_host">Host</string>
+  <string name="property_ircuser_realname">Realname</string>
+  <string name="property_ircuser_account">Account</string>
+
+  <string name="property_group_ircchannel_channel">Channel</string>
+  <string name="property_ircchannel_topic">Thema</string>
+  <string name="property_ircchannel_topic_action_edit">Thema ändern</string>
+  <string name="property_ircchannel_topic_default">Kein Thema gesetzt</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_properties.xml b/app/src/main/res/values/strings_properties.xml
new file mode 100644
index 000000000..f83a021cb
--- /dev/null
+++ b/app/src/main/res/values/strings_properties.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+  <string name="property_group_ircuser_identity">Identity</string>
+  <string name="property_ircuser_nick">Nickname</string>
+  <string name="property_ircuser_user">Ident</string>
+  <string name="property_ircuser_host">Host</string>
+  <string name="property_ircuser_realname">Real Name</string>
+  <string name="property_ircuser_account">Account</string>
+
+  <string name="property_group_ircchannel_channel">Channel</string>
+  <string name="property_ircchannel_topic">Topic</string>
+  <string name="property_ircchannel_topic_action_edit">Edit Topic</string>
+  <string name="property_ircchannel_topic_default">No Topic Set</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles_widgets.xml b/app/src/main/res/values/styles_widgets.xml
index 831104e6f..7bcd0a570 100644
--- a/app/src/main/res/values/styles_widgets.xml
+++ b/app/src/main/res/values/styles_widgets.xml
@@ -2,6 +2,12 @@
 
   <style name="Widget" />
 
+  <style name="Widget.Button.Borderless" parent="Widget.AppCompat.Button.Borderless">
+    <item name="android:textColor">?attr/colorTextPrimary</item>
+  </style>
+
+  <style name="Widget.Button.Borderless.Colored" parent="Widget.AppCompat.Button.Borderless.Colored" />
+
   <style name="Widget.Button" parent="Widget.AppCompat.Button">
     <item name="backgroundTint">?attr/colorBackgroundCard</item>
     <item name="android:textColor">?attr/colorTextPrimary</item>
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoGroup.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoGroup.kt
deleted file mode 100644
index fad7f67b7..000000000
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/InfoGroup.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package de.kuschku.quasseldroid.viewmodel.data
-
-data class InfoGroup(
-  val name: String,
-  val properties: List<InfoProperty>
-)
\ No newline at end of file
-- 
GitLab