From 4ab5a4fb6676997d4ba3f7f635a1c4d9ccbef88e Mon Sep 17 00:00:00 2001 From: SahsiSunny Date: Mon, 1 May 2023 16:03:56 +0530 Subject: [PATCH] add fragment instead of activity --- app/build.gradle | 4 ++ app/src/main/AndroidManifest.xml | 23 ++++--- .../gittrackr/activity/MainActivity.kt | 15 +++++ .../gittrackr/adapter/UserAdapter.kt | 11 ++-- .../gittrackr/fragments/HomeFragment.kt | 55 +++++++++++++++++ .../gittrackr/fragments/SplashFragment.kt | 27 +++++++++ .../UserDetailsFragment.kt} | 39 ++++++++---- .../UserListFragment.kt} | 34 +++++++---- .../gittrackr/screens/MainActivity.kt | 60 ------------------- .../gittrackr/screens/SplashScreen.kt | 39 ------------ app/src/main/res/layout/activity_main.xml | 57 ++++-------------- .../res/layout/activity_splash_screen.xml | 28 --------- app/src/main/res/layout/fragment_home.xml | 58 ++++++++++++++++++ app/src/main/res/layout/fragment_splash.xml | 22 +++++++ ..._details.xml => fragment_user_details.xml} | 2 +- ...y_user_list.xml => fragment_user_list.xml} | 5 +- app/src/main/res/navigation/nav_graph.xml | 39 ++++++++++++ app/src/main/res/values/strings.xml | 1 + 18 files changed, 306 insertions(+), 213 deletions(-) create mode 100644 app/src/main/java/com/sahsisunny/gittrackr/activity/MainActivity.kt create mode 100644 app/src/main/java/com/sahsisunny/gittrackr/fragments/HomeFragment.kt create mode 100644 app/src/main/java/com/sahsisunny/gittrackr/fragments/SplashFragment.kt rename app/src/main/java/com/sahsisunny/gittrackr/{screens/UserDetailsActivity.kt => fragments/UserDetailsFragment.kt} (51%) rename app/src/main/java/com/sahsisunny/gittrackr/{screens/UserListActivity.kt => fragments/UserListFragment.kt} (70%) delete mode 100644 app/src/main/java/com/sahsisunny/gittrackr/screens/MainActivity.kt delete mode 100644 app/src/main/java/com/sahsisunny/gittrackr/screens/SplashScreen.kt delete mode 100644 app/src/main/res/layout/activity_splash_screen.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_splash.xml rename app/src/main/res/layout/{activity_user_details.xml => fragment_user_details.xml} (93%) rename app/src/main/res/layout/{activity_user_list.xml => fragment_user_list.xml} (82%) create mode 100644 app/src/main/res/navigation/nav_graph.xml 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