diff --git a/app/build.gradle b/app/build.gradle
index a74f69c..e8b871c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -86,6 +86,10 @@ dependencies {
// Circle Image View
implementation 'de.hdodenhof:circleimageview:3.1.0'
+
+ // Navigation Components
+ implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
+ implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
}
kapt {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index bfeeae6..0113d72 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,13 +15,7 @@
android:theme="@style/Theme.GitTrackr"
tools:targetApi="31">
-
-
@@ -30,8 +24,19 @@
+ android:name=".fragments.HomeFragment"
+ android:exported="false" />
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/activity/MainActivity.kt b/app/src/main/java/com/sahsisunny/gittrackr/activity/MainActivity.kt
new file mode 100644
index 0000000..df36d8a
--- /dev/null
+++ b/app/src/main/java/com/sahsisunny/gittrackr/activity/MainActivity.kt
@@ -0,0 +1,15 @@
+package com.sahsisunny.gittrackr.activity
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.sahsisunny.gittrackr.R
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+
+class MainActivity : AppCompatActivity(), CoroutineScope by CoroutineScope(Dispatchers.Main) {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ }
+
+}
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/adapter/UserAdapter.kt b/app/src/main/java/com/sahsisunny/gittrackr/adapter/UserAdapter.kt
index b349c15..daa40e0 100644
--- a/app/src/main/java/com/sahsisunny/gittrackr/adapter/UserAdapter.kt
+++ b/app/src/main/java/com/sahsisunny/gittrackr/adapter/UserAdapter.kt
@@ -5,12 +5,13 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
+import androidx.core.os.bundleOf
+import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.material.button.MaterialButton
import com.sahsisunny.gittrackr.R
import com.sahsisunny.gittrackr.model.UsersItem
-import com.sahsisunny.gittrackr.screens.UserDetailsActivity
import de.hdodenhof.circleimageview.CircleImageView
class UserAdapter(private var con: Context, private var list: List) :
@@ -34,9 +35,11 @@ class UserAdapter(private var con: Context, private var list: List) :
Glide.with(con).load(user.avatar_url).into(holder.userImage)
holder.viewButton.setOnClickListener {
- val intent = android.content.Intent(con, UserDetailsActivity::class.java)
- intent.putExtra("login", user.login)
- con.startActivity(intent)
+// open user details fragment
+ val bundle =
+ bundleOf("userName" to user.login) // for recieving data in UserDetailsFragment use arguments?.getString("userName")
+ it.findNavController()
+ .navigate(R.id.action_userListFragment_to_userDetailsFragment, bundle)
}
}
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/fragments/HomeFragment.kt b/app/src/main/java/com/sahsisunny/gittrackr/fragments/HomeFragment.kt
new file mode 100644
index 0000000..e0d68d2
--- /dev/null
+++ b/app/src/main/java/com/sahsisunny/gittrackr/fragments/HomeFragment.kt
@@ -0,0 +1,55 @@
+package com.sahsisunny.gittrackr.fragments
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.EditText
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import com.sahsisunny.gittrackr.R
+
+class HomeFragment : Fragment() {
+ private lateinit var orgNameInput: EditText
+ private lateinit var exitButton: Button
+ private lateinit var loginButton: Button
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_home, container, false)
+ orgNameInput = view.findViewById(R.id.org_name_input)
+ exitButton = view.findViewById(R.id.exit_button)
+ loginButton = view.findViewById(R.id.login_button)
+
+ loginButton.setOnClickListener {
+ handleLoginButtonClick()
+ }
+ exitButton.setOnClickListener {
+ requireActivity().finish()
+ }
+ return view
+ }
+
+ // For handling the login button click
+ private fun handleLoginButtonClick() {
+ val orgName = orgNameInput.text.toString()
+ val orgNameWithoutSpaces = orgName.replace("\\s".toRegex(), "")
+ if (orgNameWithoutSpaces.isNotEmpty()) {
+ findNavController().navigate(R.id.action_homeFragment_to_userListFragment,
+ Bundle().apply {
+ putString("orgName", orgNameWithoutSpaces)
+ })
+ } else {
+ orgNameInput.error = "Please enter an organization name"
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/fragments/SplashFragment.kt b/app/src/main/java/com/sahsisunny/gittrackr/fragments/SplashFragment.kt
new file mode 100644
index 0000000..4b0018b
--- /dev/null
+++ b/app/src/main/java/com/sahsisunny/gittrackr/fragments/SplashFragment.kt
@@ -0,0 +1,27 @@
+package com.sahsisunny.gittrackr.fragments
+
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import com.sahsisunny.gittrackr.R
+
+class SplashFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_splash, container, false)
+
+ Handler(Looper.getMainLooper()).postDelayed({
+ findNavController().navigate(R.id.action_splashFragment_to_homeFragment)
+ }, 2000)
+ return view
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/screens/UserDetailsActivity.kt b/app/src/main/java/com/sahsisunny/gittrackr/fragments/UserDetailsFragment.kt
similarity index 51%
rename from app/src/main/java/com/sahsisunny/gittrackr/screens/UserDetailsActivity.kt
rename to app/src/main/java/com/sahsisunny/gittrackr/fragments/UserDetailsFragment.kt
index 1ac22f7..1c6ad61 100644
--- a/app/src/main/java/com/sahsisunny/gittrackr/screens/UserDetailsActivity.kt
+++ b/app/src/main/java/com/sahsisunny/gittrackr/fragments/UserDetailsFragment.kt
@@ -1,8 +1,12 @@
-package com.sahsisunny.gittrackr.screens
+package com.sahsisunny.gittrackr.fragments
import android.os.Bundle
import android.util.Log
-import androidx.appcompat.app.AppCompatActivity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.sahsisunny.gittrackr.R
import com.sahsisunny.gittrackr.adapter.UserDetailsAdapter
@@ -11,19 +15,28 @@ import com.sahsisunny.gittrackr.utils.UserDetailsAPIUtils
import retrofit2.Callback
import retrofit2.Response
-class UserDetailsActivity : AppCompatActivity() {
+class UserDetailsFragment : Fragment() {
+
+ // Declare the RecyclerView and the adapter
private lateinit var rvUserDetails: RecyclerView
private lateinit var userAdapter: UserDetailsAdapter
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_user_details)
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View? {
+
+ val view = inflater.inflate(R.layout.fragment_user_details, container, false)
+
+ // Find the RecyclerView and set its layout manager
+ rvUserDetails = view.findViewById(R.id.user_details_rv)
+ rvUserDetails.layoutManager = LinearLayoutManager(requireContext())
- rvUserDetails = findViewById(R.id.user_details_rv)
- rvUserDetails.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this)
- val username = intent.getStringExtra("login")
+ // Get the username from the arguments
+ val username = arguments?.getString("userName")
+ // If the username is not null, fetch the user details
if (username != null) {
UserDetailsAPIUtils.getUserDetailsData(username, object : Callback {
override fun onResponse(
@@ -31,7 +44,7 @@ class UserDetailsActivity : AppCompatActivity() {
response: Response,
) {
val responseBody = response.body()!!
- userAdapter = UserDetailsAdapter(this@UserDetailsActivity, responseBody)
+ userAdapter = UserDetailsAdapter(requireContext(), responseBody)
rvUserDetails.adapter = userAdapter
}
@@ -40,5 +53,9 @@ class UserDetailsActivity : AppCompatActivity() {
}
})
}
+
+ return view
}
-}
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/screens/UserListActivity.kt b/app/src/main/java/com/sahsisunny/gittrackr/fragments/UserListFragment.kt
similarity index 70%
rename from app/src/main/java/com/sahsisunny/gittrackr/screens/UserListActivity.kt
rename to app/src/main/java/com/sahsisunny/gittrackr/fragments/UserListFragment.kt
index 7c918dd..834a445 100644
--- a/app/src/main/java/com/sahsisunny/gittrackr/screens/UserListActivity.kt
+++ b/app/src/main/java/com/sahsisunny/gittrackr/fragments/UserListFragment.kt
@@ -1,8 +1,11 @@
-package com.sahsisunny.gittrackr.screens
+package com.sahsisunny.gittrackr.fragments
import android.os.Bundle
import android.util.Log
-import androidx.appcompat.app.AppCompatActivity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.sahsisunny.gittrackr.R
@@ -16,23 +19,33 @@ import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
-class UserListActivity : AppCompatActivity() {
+class UserListFragment : Fragment() {
companion object {
const val BASE_API = Constants.BASE_API
}
private lateinit var rvUser: RecyclerView
lateinit var userAdapter: UserAdapter
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_user_list)
- rvUser = findViewById(R.id.user_rv)
- val orgName = intent.getStringExtra("orgName")
- rvUser.layoutManager = LinearLayoutManager(this)
+
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View? {
+ val view = inflater.inflate(R.layout.fragment_user_list, container, false)
+
+ rvUser = view.findViewById(R.id.user_rv)
+ val orgName = arguments?.getString("orgName")
+ rvUser.layoutManager = LinearLayoutManager(requireContext())
if (orgName != null) {
getUserData(orgName)
}
+ return view
}
private fun getUserData(orgName: String?) {
@@ -40,7 +53,6 @@ class UserListActivity : AppCompatActivity() {
.baseUrl(BASE_API)
.addConverterFactory(GsonConverterFactory.create())
.build()
-
.create(UserAPIInterface::class.java)
val call = retrofit.getUsersData(orgName)
@@ -51,7 +63,7 @@ class UserListActivity : AppCompatActivity() {
response: Response>,
) {
val responseBody = response.body()!!
- userAdapter = UserAdapter(this@UserListActivity, responseBody)
+ userAdapter = UserAdapter(requireContext(), responseBody)
rvUser.adapter = userAdapter
}
@@ -60,6 +72,4 @@ class UserListActivity : AppCompatActivity() {
}
})
}
-}
-
-
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/screens/MainActivity.kt b/app/src/main/java/com/sahsisunny/gittrackr/screens/MainActivity.kt
deleted file mode 100644
index b73e1b9..0000000
--- a/app/src/main/java/com/sahsisunny/gittrackr/screens/MainActivity.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.sahsisunny.gittrackr.screens
-
-import android.content.Intent
-import android.os.Bundle
-import android.widget.Button
-import android.widget.EditText
-import androidx.appcompat.app.AppCompatActivity
-import com.sahsisunny.gittrackr.R
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-
-class MainActivity : AppCompatActivity(), CoroutineScope by CoroutineScope(Dispatchers.Main) {
- // Declare the following variables for the views:
- private lateinit var orgNameInput: EditText
- private lateinit var exitButton: Button
- private lateinit var loginButton: Button
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
-
-// Initialize the views by calling findViewById() and assigning them to the variables:
- orgNameInput = findViewById(R.id.org_name_input)
- exitButton = findViewById(R.id.exit_button)
- loginButton = findViewById(R.id.login_button)
-
-// Set an OnClickListener on the loginButton:
- loginButton.setOnClickListener {
- launch {
- handleLoginButtonClick()
- }
- }
-
-// Set an OnClickListener on the exitButton:
- exitButton.setOnClickListener {
- finish()
- }
- }
-
- // Create a private function called handleLoginButtonClick() that takes no parameters and returns Unit:
- private fun handleLoginButtonClick() {
- val intent = Intent(this@MainActivity, UserListActivity::class.java)
- val orgName = orgNameInput.text.toString()
- val orgNameWithoutSpaces = orgName.replace("\\s".toRegex(), "")
- if (orgNameWithoutSpaces.isNotEmpty()) {
- intent.putExtra("orgName", orgNameWithoutSpaces)
- startActivity(intent)
- } else {
- orgNameInput.error = "Please enter an organization name"
- }
- }
-
- // Override the onDestroy() method and call cancel() on the CoroutineScope:
- override fun onDestroy() {
- super.onDestroy()
- cancel()
- }
-}
diff --git a/app/src/main/java/com/sahsisunny/gittrackr/screens/SplashScreen.kt b/app/src/main/java/com/sahsisunny/gittrackr/screens/SplashScreen.kt
deleted file mode 100644
index 8028e85..0000000
--- a/app/src/main/java/com/sahsisunny/gittrackr/screens/SplashScreen.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.sahsisunny.gittrackr.screens
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.WindowCompat
-import com.sahsisunny.gittrackr.R
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-
-@SuppressLint("CustomSplashScreen")
-class SplashScreen : AppCompatActivity(), CoroutineScope by CoroutineScope(Dispatchers.Main) {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_splash_screen)
-
- // Make the splash screen full screen
- WindowCompat.setDecorFitsSystemWindows(window, false)
-
- // Launch the main activity after 2 seconds
- launch {
- delay(2000L)
- val intent = Intent(this@SplashScreen, MainActivity::class.java)
- startActivity(intent)
- finish()
- }
- }
-
- // Cancel the coroutine scope when the activity is destroyed to avoid memory leaks
- override fun onDestroy() {
- super.onDestroy()
- cancel()
- }
-}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index adde3b7..0122d26 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,55 +1,18 @@
-
+ tools:context=".activity.MainActivity">
-
-
+ android:layout_height="match_parent"
+ app:defaultNavHost="true"
+ app:navGraph="@navigation/nav_graph" />
-
-
-
-
-
-
-
+
diff --git a/app/src/main/res/layout/activity_splash_screen.xml b/app/src/main/res/layout/activity_splash_screen.xml
deleted file mode 100644
index 515c57c..0000000
--- a/app/src/main/res/layout/activity_splash_screen.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..b6d5ee5
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_splash.xml b/app/src/main/res/layout/fragment_splash.xml
new file mode 100644
index 0000000..e33d1be
--- /dev/null
+++ b/app/src/main/res/layout/fragment_splash.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_user_details.xml b/app/src/main/res/layout/fragment_user_details.xml
similarity index 93%
rename from app/src/main/res/layout/activity_user_details.xml
rename to app/src/main/res/layout/fragment_user_details.xml
index dc7b01a..71f806a 100644
--- a/app/src/main/res/layout/activity_user_details.xml
+++ b/app/src/main/res/layout/fragment_user_details.xml
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".screens.UserDetailsActivity">
+ tools:context=".fragments.UserDetailsFragment">
+ tools:context=".fragments.UserListFragment">
+ app:layout_constraintTop_toTopOf="parent"
+ tools:listitem="@layout/user_list_item" />
\ No newline at end of file
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 0000000..dcca9c1
--- /dev/null
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 94b4d52..25f7b98 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,4 +14,5 @@
View List
Exit
Loading Animation
+
\ No newline at end of file