commit 7e17da6c3763e842aaaa77638648b92e4c79460b parent 3e90af4f970f7fe4c3c63255c9e26d807d784dee Author: t3serakt <t3ss@posteo.de> Date: Mon, 7 Apr 2025 20:03:03 +0200 Added Account UI Diffstat:
14 files changed, 257 insertions(+), 2 deletions(-)
diff --git a/GNUnetMessenger/.idea/compiler.xml b/GNUnetMessenger/.idea/compiler.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> - <bytecodeTargetLevel target="21" /> + <bytecodeTargetLevel target="17" /> </component> </project> \ No newline at end of file diff --git a/GNUnetMessenger/.idea/misc.xml b/GNUnetMessenger/.idea/misc.xml @@ -1,6 +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/build.gradle.kts b/GNUnetMessenger/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) id("com.google.gms.google-services") kotlin("android") + id("androidx.navigation.safeargs.kotlin") } android { @@ -42,6 +43,8 @@ dependencies { implementation(libs.androidx.cardview) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) + implementation(libs.androidx.navigation.fragment) + implementation(libs.androidx.navigation.ui) implementation(libs.material) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountAdapter.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountAdapter.kt @@ -0,0 +1,37 @@ +package org.gnunet.gnunetmessenger.ui.account + +class AccountAdapter( + private val onClick: (ChatAccount) -> Unit +) : ListAdapter<ChatAccount, AccountAdapter.AccountViewHolder>(DIFF) { + + companion object { + val DIFF = object : DiffUtil.ItemCallback<ChatAccount>() { + override fun areItemsTheSame(oldItem: ChatAccount, newItem: ChatAccount) = + oldItem.name == newItem.name + + override fun areContentsTheSame(oldItem: ChatAccount, newItem: ChatAccount) = + oldItem == newItem + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AccountViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_account, parent, false) + return AccountViewHolder(view) + } + + override fun onBindViewHolder(holder: AccountViewHolder, position: Int) { + holder.bind(getItem(position)) + } + + inner class AccountViewHolder(view: View) : RecyclerView.ViewHolder(view) { + private val nameView: TextView = view.findViewById(R.id.account_name) + private val avatarView: ImageView = view.findViewById(R.id.account_avatar) + + fun bind(account: ChatAccount) { + nameView.text = account.name + avatarView.setImageResource(R.drawable.ic_account_circle) + itemView.setOnClickListener { onClick(account) } + } + } +} diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountListFragment.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/AccountListFragment.kt @@ -0,0 +1,36 @@ +package org.gnunet.gnunetmessenger.ui.account + +class AccountListFragment : Fragment() { + + private lateinit var recycler: RecyclerView + private lateinit var createButton: Button + private lateinit var adapter: AccountAdapter + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view = inflater.inflate(R.layout.fragment_account_list, container, false) + recycler = view.findViewById(R.id.account_recycler) + createButton = view.findViewById(R.id.btn_create_account) + + adapter = AccountAdapter { selectedAccount -> + // Navigation zu Chats dieses Accounts (wird später implementiert) + } + + recycler.layoutManager = LinearLayoutManager(context) + recycler.adapter = adapter + + createButton.setOnClickListener { + // Navigation zu CreateAccountFragment (wird später gemacht) + } + + // Demo-Daten + adapter.submitList(listOf( + ChatAccount("Alice"), + ChatAccount("Bob") + )) + + return view + } +} diff --git a/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/CreateAccountFragment.kt b/GNUnetMessenger/app/src/main/java/org/gnunet/gnunetmessenger/ui/account/CreateAccountFragment.kt @@ -0,0 +1,41 @@ +package org.gnunet.gnunetmessenger + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.activity.result.contract.ActivityResultContracts +import org.gnunet.gnunetmessenger.databinding.FragmentCreateAccountBinding +import org.gnunet.gnunetmessenger.service.GnunetChat +import org.gnunet.gnunetmessenger.model.GnunetReturnValue +import java.io.File + +class CreateAccountFragment : Fragment() { + + private lateinit var binding: FragmentCreateAccountBinding + private lateinit var gnunetChat: GnunetChat + + // Request code for selecting avatar image + private val avatarImageRequest = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + // Handle the selected avatar image URI here (e.g., upload to server or local storage) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentCreateAccountBinding.inflate(inflater, container, false) + + // Initialize GnunetChat (or get it from the ServiceFactory) + gnunetChat = (activity as MainActivity).gnunetChat + + // Set up listeners + binding.btnSelectAvatar.setOnClickListener { + avatarImageRequest.launch("image/*") // Start the image picker + } + + binding.btnConfirmAccount.setOnClickListener { + val accountName = binding.editTextAccountName diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_account_list.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_account_list.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/account_list_root" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:padding="16dp" + tools:context=".ui.account.AccountListFragment"> + + <Button + android:id="@+id/btn_create_account" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/create_account" + android:layout_marginBottom="16dp" /> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/account_recycler" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + tools:listitem="@layout/item_account" /> + +</LinearLayout> +\ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/res/layout/fragment_create_account.xml b/GNUnetMessenger/app/src/main/res/layout/fragment_create_account.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:orientation="vertical" + android:padding="16dp" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <TextView + android:text="@string/create_account" + android:textSize="24sp" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + <EditText + android:id="@+id/account_name_input" + android:hint="@string/account_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:inputType="textPersonName"/> + + <Button + android:id="@+id/select_avatar_button" + android:text="@string/select_avatar" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + <ImageView + android:id="@+id/avatar_preview" + android:layout_width="100dp" + android:layout_height="100dp" + android:layout_marginTop="8dp" + android:src="@drawable/ic_avatar_placeholder" + android:scaleType="centerCrop"/> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp"> + + <Button + android:id="@+id/cancel_button" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/cancel"/> + + <Button + android:id="@+id/confirm_button" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/confirm"/> + </LinearLayout> + </LinearLayout> +</ScrollView> diff --git a/GNUnetMessenger/app/src/main/res/layout/item_account.xml b/GNUnetMessenger/app/src/main/res/layout/item_account.xml @@ -0,0 +1,32 @@ +<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:radius="8dp" + android:elevation="4dp"> + + <LinearLayout + android:orientation="horizontal" + android:padding="12dp" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <ImageView + android:id="@+id/account_avatar" + android:layout_width="48dp" + android:layout_height="48dp" + android:src="@drawable/ic_account_circle" + android:scaleType="centerCrop" + android:layout_marginEnd="12dp" /> + + <TextView + android:id="@+id/account_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Account Name" + android:textSize="18sp" + android:textStyle="bold" + android:gravity="center_vertical" /> + + </LinearLayout> +</androidx.cardview.widget.CardView> diff --git a/GNUnetMessenger/app/src/main/res/navigation/nav_graph.xml b/GNUnetMessenger/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<navigation xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/nav_graph.xml"> + +</navigation> +\ No newline at end of file diff --git a/GNUnetMessenger/app/src/main/res/values/strings.xml b/GNUnetMessenger/app/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ <resources> <string name="app_name">GNUnetMessenger</string> + <string name="create_account">Create Account</string> + <string name="account_name">Account Name</string> + <string name="select_avatar">Select Avatar</string> + <string name="cancel">Cancel</string> + <string name="confirm">Confirm</string> </resources> \ No newline at end of file diff --git a/GNUnetMessenger/build.gradle.kts b/GNUnetMessenger/build.gradle.kts @@ -2,5 +2,6 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false + id("androidx.navigation.safeargs") version "2.7.7" apply false id("com.google.gms.google-services") version "4.4.2" apply false } \ No newline at end of file diff --git a/GNUnetMessenger/gradle/libs.versions.toml b/GNUnetMessenger/gradle/libs.versions.toml @@ -9,8 +9,11 @@ junitVersion = "1.1.5" espressoCore = "3.5.1" appcompat = "1.6.1" material = "1.10.0" +navigation = "2.7.7" [libraries] +androidx-navigation-fragment = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "navigation" } +androidx-navigation-ui = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "navigation" } androidx-cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } diff --git a/GNUnetMessenger/settings.gradle.kts b/GNUnetMessenger/settings.gradle.kts @@ -10,6 +10,9 @@ pluginManagement { mavenCentral() gradlePluginPortal() } + plugins { + id("androidx.navigation.safeargs.kotlin") version "2.7.7" + } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)