messenger-android

Android graphical user interfaces for GNUnet Messenger
Log | Files | Refs | README | LICENSE

commit 7bb9bb3382d45606713f649fb17e0090e3f2198b
parent 8ad1879ac3655f448d9db95a1d5fbc4c9563e75f
Author: t3serakt <t3ss@posteo.de>
Date:   Thu, 10 Apr 2025 20:25:41 +0200

Fixed Layout. Added account details and attribute list.

Diffstat:
MGNUnetMessenger/.idea/misc.xml | 2+-
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/MainActivity.kt | 8+++++++-
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/GnunetChat.kt | 2++
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/boundimpl/GnunetChatBoundService.kt | 8++++++++
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt | 16++++++++++++++++
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountDetailsFragment.kt | 21++++++++++++++++-----
MGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountOverviewFragment.kt | 2--
AGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AttributeListFragment.kt | 50++++++++++++++++++++++++++++++++++++++++++++++++++
AGNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/adapters/AttributeAdapter.kt | 31+++++++++++++++++++++++++++++++
AGNUnetMessenger/app/src/main/res/layout/attribute_item.xml | 27+++++++++++++++++++++++++++
MGNUnetMessenger/app/src/main/res/layout/fragment_account_details.xml | 35+++++++++++++++++++++--------------
MGNUnetMessenger/app/src/main/res/layout/fragment_account_list.xml | 3++-
MGNUnetMessenger/app/src/main/res/layout/fragment_account_overview.xml | 3++-
AGNUnetMessenger/app/src/main/res/layout/fragment_attribute_list.xml | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MGNUnetMessenger/app/src/main/res/layout/fragment_create_account.xml | 4++--
MGNUnetMessenger/app/src/main/res/navigation/nav_graph.xml | 13++++++++++++-
MGNUnetMessenger/app/src/main/res/values/strings.xml | 3+++
17 files changed, 266 insertions(+), 28 deletions(-)

diff --git a/GNUnetMessenger/.idea/misc.xml b/GNUnetMessenger/.idea/misc.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> - <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/MainActivity.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/MainActivity.kt @@ -60,10 +60,16 @@ class MainActivity : AppCompatActivity() { override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_menu, menu) val current = currentAccount - menu?.findItem(R.id.menu_current_account)?.title = "Account: ${current?.name ?: "?"}" + menu?.findItem(R.id.menu_current_account)?.title = "Account: ${current?.name ?: "No active account!"}" return true } + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + val current = currentAccount + menu?.findItem(R.id.menu_current_account)?.title = "Account: ${current?.name ?: "No active account!"}" + return super.onPrepareOptionsMenu(menu) + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_current_account -> { diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/GnunetChat.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/GnunetChat.kt @@ -17,4 +17,6 @@ interface GnunetChat { fun setProfileName(handle: ChatHandle, name: String) fun getProfileKey(handle: ChatHandle): String fun setContactBlock(isBlocked: Boolean) + fun setAttribute(handle: ChatHandle,key: String, value: String) + fun getAttributes(handle: ChatHandle, callback: (String, String) -> Unit) } \ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/boundimpl/GnunetChatBoundService.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/boundimpl/GnunetChatBoundService.kt @@ -44,4 +44,12 @@ class GnunetChatBoundService : GnunetChat { override fun setContactBlock(isBlocked: Boolean) { TODO("Not yet implemented") } + + override fun setAttribute(handle: ChatHandle, key: String, value: String) { + TODO("Not yet implemented") + } + + override fun getAttributes(handle: ChatHandle, callback: (String, String) -> Unit) { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/service/mock/GnunetChatMock.kt @@ -54,4 +54,20 @@ class GnunetChatMock : GnunetChat { override fun setContactBlock(isBlocked: Boolean) { println("isblocked:" + isBlocked) } + + override fun setAttribute(handle: ChatHandle, key: String, value: String) { + TODO("Not yet implemented") + } + + override fun getAttributes(handle: ChatHandle, callback: (String, String) -> Unit) { + val mockAttributes = listOf( + "nickname" to "Alice", + "location" to "Berlin", + "status" to "Online" + ) + + for ((key, value) in mockAttributes) { + callback(key, value) + } + } } \ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountDetailsFragment.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountDetailsFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import org.gnunet.gnunetmessenger.MainActivity import org.gnunet.gnunetmessenger.R import org.gnunet.gnunetmessenger.databinding.FragmentAccountDetailsBinding @@ -18,14 +19,24 @@ class AccountDetailsFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - _binding = FragmentAccountDetailsBinding.inflate(inflater, container, false) + val activity = activity as MainActivity + val gnunetChat = activity.getGnunetChatInstance() + val handle = activity.getChatHandle() + val currentAccount = activity.currentAccount - val currentAccount = (activity as MainActivity).currentAccount + _binding = FragmentAccountDetailsBinding.inflate(inflater, container, false) - // Set up the account details (dummy data for now) - // This could be loaded from a ViewModel or passed through arguments - binding.accountName.text = "Account Name: John Doe" + // Setze aktuellen Namen + binding.accountName.setText(gnunetChat.getProfileName(handle)) + binding.btnSaveName.setOnClickListener { + val newName = binding.accountName.text.toString() + gnunetChat.setProfileName(handle, newName) + } binding.accountAvatar.setImageResource(R.drawable.ic_account_circle) // Beispiel für Avatar + binding.btnListAttributes.setOnClickListener { + val navController = activity.supportFragmentManager.findFragmentById(R.id.nav_host_fragment)?.findNavController() + navController?.navigate(R.id.action_accountDetailsFragment_to_attributeListFragment) + } return binding.root } diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountOverviewFragment.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountOverviewFragment.kt @@ -8,8 +8,6 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import org.gnunet.gnunetmessenger.MainActivity import org.gnunet.gnunetmessenger.databinding.FragmentAccountOverviewBinding -import org.gnunet.gnunetmessenger.R -import org.gnunet.gnunetmessenger.model.ChatAccount import org.gnunet.gnunetmessenger.ui.adapters.ChatListAdapter class AccountOverviewFragment : Fragment() { diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AttributeListFragment.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AttributeListFragment.kt @@ -0,0 +1,50 @@ +package org.gnunet.gnunetmessenger.ui.account + +import android.os.Bundle +import androidx.fragment.app.Fragment +import org.gnunet.gnunetmessenger.ui.adapters.AttributeAdapter +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import org.gnunet.gnunetmessenger.MainActivity +import org.gnunet.gnunetmessenger.databinding.FragmentAttributeListBinding + + +class AttributeListFragment : Fragment() { + + private lateinit var binding: FragmentAttributeListBinding + private val attributes = mutableListOf<Pair<String, String>>() + private lateinit var adapter: AttributeAdapter + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + val activity = activity as MainActivity + val gnunetChat = activity.getGnunetChatInstance() + val handle = activity.getChatHandle() + + binding = FragmentAttributeListBinding.inflate(inflater, container, false) + + + adapter = AttributeAdapter(attributes) + gnunetChat.getAttributes(handle) { key, value -> + attributes.add(key to value) + adapter.notifyItemInserted(attributes.size - 1) + } + binding.attributeList.layoutManager = LinearLayoutManager(requireContext()) + binding.attributeList.adapter = adapter + + binding.btnAddAttribute.setOnClickListener { + val key = binding.editKey.text.toString() + val value = binding.editValue.text.toString() + if (key.isNotBlank()) { + attributes.add(Pair(key, value)) + adapter.notifyItemInserted(attributes.size - 1) + gnunetChat.setAttribute(handle,key, value) + binding.editKey.text.clear() + binding.editValue.text.clear() + } + } + + return binding.root + } +} diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/adapters/AttributeAdapter.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/adapters/AttributeAdapter.kt @@ -0,0 +1,31 @@ +package org.gnunet.gnunetmessenger.ui.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import org.gnunet.gnunetmessenger.R +import org.gnunet.gnunetmessenger.databinding.AttributeItemBinding + +class AttributeAdapter(private val attributes: MutableList<Pair<String, String>>) : RecyclerView.Adapter<AttributeAdapter.AttributeViewHolder>() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AttributeViewHolder { + val binding = AttributeItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return AttributeViewHolder(binding) + } + + override fun onBindViewHolder(holder: AttributeViewHolder, position: Int) { + val attribute = attributes[position] + holder.bind(attribute) + } + + override fun getItemCount(): Int = attributes.size + + inner class AttributeViewHolder(private val binding: AttributeItemBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(attribute: Pair<String, String>) { + binding.keyName.text = attribute.first + binding.valueName.text = attribute.second + } + } +} diff --git a/GNUnetMessenger/app/src/main/res/layout/attribute_item.xml b/GNUnetMessenger/app/src/main/res/layout/attribute_item.xml @@ -0,0 +1,26 @@ +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="8dp" + android:gravity="center_vertical"> + + <!-- Name Spalte - linksbündig --> + <TextView + android:id="@+id/key_name" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="start" + android:text="Name"/> + + <!-- Value Spalte - zentriert --> + <TextView + android:id="@+id/value_name" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:text="Value"/> +</LinearLayout> +\ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_account_details.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_account_details.xml @@ -1,7 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" + android:padding="16dp" + android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.account.AccountDetailsFragment"> @@ -10,19 +11,25 @@ android:id="@+id/accountAvatar" android:layout_width="100dp" android:layout_height="100dp" - android:src="@drawable/ic_account_circle" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:src="@drawable/ic_account_circle"/> - <TextView + <EditText android:id="@+id/accountName" + android:hint="Account Name" + android:layout_width="match_parent" + android:layout_height="48dp" /> + + <Button + android:id="@+id/btn_save_name" + android:text="Save Name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp"/> + + <Button + android:id="@+id/btn_list_attributes" + android:text="List Attributes" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Account Name" - android:textSize="18sp" - app:layout_constraintTop_toBottomOf="@id/accountAvatar" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> -</androidx.constraintlayout.widget.ConstraintLayout> + android:layout_marginTop="16dp"/> +</LinearLayout> diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_account_list.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_account_list.xml @@ -20,6 +20,7 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" - tools:listitem="@layout/item_account" /> + tools:listitem="@layout/item_account" + android:contentDescription="@string/account_list_description" /> </LinearLayout> \ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_account_overview.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_account_overview.xml @@ -18,6 +18,7 @@ android:id="@+id/chatListRecyclerView" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" /> + android:layout_weight="1" + android:contentDescription="@string/chat_list_description" /> </LinearLayout> </androidx.drawerlayout.widget.DrawerLayout> diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_attribute_list.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_attribute_list.xml @@ -0,0 +1,66 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + android:padding="16dp" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center"> + + <!-- Name Überschrift - linksbündig --> + <TextView + android:text="Name" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="start"/> + + <!-- Value Überschrift - zentriert --> + <TextView + android:text="Value" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center"/> + + </LinearLayout> + + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:layout_marginTop="16dp" + card_view:cardElevation="4dp" + android:radius="8dp"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/attribute_list" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:contentDescription="@string/attribute_list_description"/> + </androidx.cardview.widget.CardView> + + <EditText + android:id="@+id/edit_key" + android:hint="Key" + android:layout_width="match_parent" + android:layout_height="48dp" /> + + <EditText + android:id="@+id/edit_value" + android:hint="Value" + android:layout_width="match_parent" + android:layout_height="48dp" /> + + <Button + android:id="@+id/btn_add_attribute" + android:text="+" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_marginTop="8dp" /> +</LinearLayout> diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_create_account.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_create_account.xml @@ -19,8 +19,8 @@ android:id="@+id/account_name_input" android:hint="@string/account_name" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="textPersonName"/> + android:inputType="textPersonName" + android:layout_height="48dp"/> <Button android:id="@+id/select_avatar_button" diff --git a/GNUnetMessenger/app/src/main/res/navigation/nav_graph.xml b/GNUnetMessenger/app/src/main/res/navigation/nav_graph.xml @@ -55,11 +55,22 @@ android:name="org.gnunet.gnunetmessenger.ui.chat.ChatFragment" android:label="Chat" /> + <fragment + android:id="@+id/attributeListFragment" + android:name="org.gnunet.gnunetmessenger.ui.account.AttributeListFragment" + android:label="Attributes" + tools:layout="@layout/fragment_attribute_list" /> + <!-- Account Details --> <fragment android:id="@+id/accountDetailsFragment" android:name="org.gnunet.gnunetmessenger.ui.account.AccountDetailsFragment" - android:label="Account Details" /> + android:label="Account Details"> + + <action + android:id="@+id/action_accountDetailsFragment_to_attributeListFragment" + app:destination="@id/attributeListFragment" /> + </fragment> <!-- Lobby Create --> <fragment diff --git a/GNUnetMessenger/app/src/main/res/values/strings.xml b/GNUnetMessenger/app/src/main/res/values/strings.xml @@ -9,6 +9,9 @@ <string name="about">About</string> <string name="create_lobby">Create Lobby</string> <string name="lobby_warning">Please notice that everyone with access to the lobby\'s code can enter it</string> + <string name="attribute_list_description">Liste der Attribute</string> + <string name="account_list_description">Account List</string> + <string name="chat_list_description">Chat List</string> <string-array name="lobby_lifetimes"> <item>Off</item> <item>4 weeks</item>