From 0a828ef8a0be8b04ca83e683c000526a765b3343 Mon Sep 17 00:00:00 2001 From: clfreville2 Date: Fri, 31 Mar 2023 14:36:53 +0200 Subject: [PATCH] Add a preferences screen --- app/build.gradle | 4 ++- .../iut/clfreville2/teaiswarm/MainActivity.kt | 31 ++++++++++++++----- .../teaiswarm/fragment/PreferencesFragment.kt | 11 +++++++ .../teaiswarm/fragment/SetupConfigFragment.kt | 30 ++++++++++++++++++ app/src/main/res/layout/setup_config.xml | 23 ++++++++++++++ app/src/main/res/navigation/nav_graph.xml | 14 +++++++-- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/preferences.xml | 9 ++++++ 8 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/PreferencesFragment.kt create mode 100644 app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/SetupConfigFragment.kt create mode 100644 app/src/main/res/layout/setup_config.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/app/build.gradle b/app/build.gradle index aec6586..e6fc80d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,13 +39,14 @@ dependencies { def nav_version = "2.5.3" def paging_version = "3.1.1" def fragment_version = "1.5.6" + def preference_version = "1.2.0" implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' - implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' + implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation 'com.squareup.moshi:moshi:1.14.0' implementation 'com.squareup.moshi:moshi-kotlin:1.14.0' implementation 'com.squareup.moshi:moshi-adapters:1.14.0' @@ -55,6 +56,7 @@ dependencies { implementation "androidx.navigation:navigation-ui-ktx:$nav_version" implementation "androidx.paging:paging-runtime:$paging_version" implementation "androidx.fragment:fragment-ktx:$fragment_version" + implementation "androidx.preference:preference-ktx:$preference_version" //implementation 'androidx.core:core-ktx:+' testImplementation 'junit:junit:4.13.2' diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt index f76e321..7f36ef4 100644 --- a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/MainActivity.kt @@ -1,5 +1,7 @@ package fr.uca.iut.clfreville2.teaiswarm +import android.content.Context +import android.content.SharedPreferences import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.core.os.bundleOf @@ -7,19 +9,26 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentFactory import androidx.navigation.fragment.NavHostFragment import fr.uca.iut.clfreville2.teaiswarm.fragment.RepositoryListFragment +import fr.uca.iut.clfreville2.teaiswarm.fragment.SetupConfigFragment import fr.uca.iut.clfreville2.teaiswarm.model.Repository const val REPOSITORY_OWNER = "repository_owner" const val REPOSITORY_NAME = "repository_name" +const val USERNAME = "username" class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { - supportFragmentManager.fragmentFactory = RepositoryListFragmentFactory { repo -> + val preferences = getPreferences(Context.MODE_PRIVATE) + supportFragmentManager.fragmentFactory = RepositoryListFragmentFactory(preferences) { repo -> adapterOnClick(repo) } super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + preferences.contains(USERNAME) || return + setContentView(R.layout.activity_main) + val nav = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment + nav.navController.navigate(R.id.repository_list_fragment) } private fun adapterOnClick(repository: Repository) { @@ -32,12 +41,20 @@ class MainActivity : AppCompatActivity() { nav.navController.navigate(R.id.activity_list_fragment, bundle) } - class RepositoryListFragmentFactory(private val onClick: (Repository) -> Unit) : FragmentFactory() { - override fun instantiate(classLoader: ClassLoader, className: String): Fragment { - if (className == RepositoryListFragment::class.java.name) { - return RepositoryListFragment("clement.freville2", onClick); + class RepositoryListFragmentFactory( + private val preferences: SharedPreferences, + private val onClick: (Repository) -> Unit + ) : FragmentFactory() { + override fun instantiate(classLoader: ClassLoader, className: String): Fragment = + when (className) { + RepositoryListFragment::class.java.name -> RepositoryListFragment( + preferences.getString( + USERNAME, + null + )!!, onClick + ) + SetupConfigFragment::class.java.name -> SetupConfigFragment(preferences) + else -> super.instantiate(classLoader, className) } - return super.instantiate(classLoader, className) - } } } \ No newline at end of file diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/PreferencesFragment.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/PreferencesFragment.kt new file mode 100644 index 0000000..b2ed20e --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/PreferencesFragment.kt @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.teaiswarm.fragment + +import android.os.Bundle +import androidx.preference.PreferenceFragmentCompat +import fr.uca.iut.clfreville2.teaiswarm.R + +class PreferencesFragment : PreferenceFragmentCompat() { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) = + setPreferencesFromResource(R.xml.preferences, rootKey) +} diff --git a/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/SetupConfigFragment.kt b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/SetupConfigFragment.kt new file mode 100644 index 0000000..530b0ee --- /dev/null +++ b/app/src/main/java/fr/uca/iut/clfreville2/teaiswarm/fragment/SetupConfigFragment.kt @@ -0,0 +1,30 @@ +package fr.uca.iut.clfreville2.teaiswarm.fragment + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import android.widget.Button +import android.widget.EditText +import androidx.core.content.edit +import androidx.fragment.app.Fragment +import androidx.navigation.findNavController +import fr.uca.iut.clfreville2.teaiswarm.R +import fr.uca.iut.clfreville2.teaiswarm.USERNAME + +class SetupConfigFragment(private val preferences: SharedPreferences) : Fragment(R.layout.setup_config) { + + private lateinit var usernameInput: EditText + private lateinit var confirmButton: Button + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + usernameInput = view.findViewById(R.id.username_input) + confirmButton = view.findViewById(R.id.configure_button) + confirmButton.setOnClickListener { + preferences.edit { + putString(USERNAME, usernameInput.text.toString()) + } + view.findNavController().navigate(R.id.repository_list_fragment) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/setup_config.xml b/app/src/main/res/layout/setup_config.xml new file mode 100644 index 0000000..6334e1f --- /dev/null +++ b/app/src/main/res/layout/setup_config.xml @@ -0,0 +1,23 @@ + + + + + +