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