diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0d98d51..f41bbe3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,26 +1,29 @@ + xmlns:tools="http://schemas.android.com/tools"> + android:allowBackup="true" + android:dataExtractionRules="@xml/data_extraction_rules" + android:fullBackupContent="@xml/backup_rules" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:theme="@style/Theme.KanbanCloneAndroid" + android:usesCleartextTraffic="true"> + android:name=".ui.ProjectDetailActivity" + android:exported="false" /> + android:name=".ui.LoginActivity" + android:exported="false" /> + diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/MainActivity.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/MainActivity.kt index bd5cf8c..a324037 100644 --- a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/MainActivity.kt +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/MainActivity.kt @@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.RecyclerView import com.campusaula.edbole.kanban_clone_android.R import com.campusaula.edbole.kanban_clone_android.kanban.Project import com.campusaula.edbole.kanban_clone_android.network.ApiService @@ -20,8 +21,9 @@ class MainActivity : AppCompatActivity() { private lateinit var api: ApiService private lateinit var projectList : List - private lateinit var loggedInAs: TextView; - private lateinit var logoutButton: Button; + private lateinit var loggedInAs: TextView + private lateinit var logoutButton: Button + private lateinit var projectsRecyclerView: RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -39,6 +41,14 @@ class MainActivity : AppCompatActivity() { /* Activity components */ loggedInAs = findViewById(R.id.loggedInAs) logoutButton = findViewById(R.id.logoutButton) + projectsRecyclerView = findViewById(R.id.projectsRecyclerView) + projectsRecyclerView.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this) + val adapter = ProjectItemAdapter(projectList) { project -> + val intent = Intent(this, ProjectDetailActivity::class.java) + intent.putExtra("project_id", project.id) + startActivity(intent) + } + projectsRecyclerView.adapter = adapter /* Getting the logged-in user info */ lifecycleScope.launch{ @@ -47,6 +57,8 @@ class MainActivity : AppCompatActivity() { if (getMe.isSuccessful){ val user = getMe.body() loggedInAs.text = "Logged in as: ${user?.name}" + projectList = api.getAllProjects().body()!! + adapter.submitList(projectList) } else { val intent = Intent(this@MainActivity, LoginActivity::class.java) startActivity(intent) diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectDetailActivity.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectDetailActivity.kt new file mode 100644 index 0000000..ebeb5c5 --- /dev/null +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectDetailActivity.kt @@ -0,0 +1,21 @@ +package com.campusaula.edbole.kanban_clone_android.ui + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.campusaula.edbole.kanban_clone_android.R + +class ProjectDetailActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_project_detail) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt new file mode 100644 index 0000000..194cdfd --- /dev/null +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt @@ -0,0 +1,44 @@ +package com.campusaula.edbole.kanban_clone_android.ui + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.campusaula.edbole.kanban_clone_android.R +import com.campusaula.edbole.kanban_clone_android.kanban.Project + +class ProjectItemAdapter( + private var items: List, + private val onItemClick: ((Project) -> Unit)? = null +) : RecyclerView.Adapter() { + + fun submitList(newList: List) { + items = newList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_project, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val project = items[position] + holder.bind(project) + holder.itemView.setOnClickListener { onItemClick?.invoke(project) } + } + + override fun getItemCount(): Int = items.size + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val nameTv: TextView = itemView.findViewById(R.id.projectName) + private val descTv: TextView = itemView.findViewById(R.id.projectDescription) + + fun bind(project: Project) { + nameTv.text = project.name + descTv.text = project.description + } + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5d909a1..15e1fb8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -37,6 +37,7 @@ android:layout_height="wrap_content" tools:layout_editor_absoluteX="1dp" app:layout_constraintTop_toBottomOf="@+id/logoutButton" - android:layout_marginTop="8dp" /> + android:layout_marginTop="8dp" + android:id="@+id/projectsRecyclerView" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_project_detail.xml b/app/src/main/res/layout/activity_project_detail.xml new file mode 100644 index 0000000..a136292 --- /dev/null +++ b/app/src/main/res/layout/activity_project_detail.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_project.xml b/app/src/main/res/layout/item_project.xml new file mode 100644 index 0000000..7a6f251 --- /dev/null +++ b/app/src/main/res/layout/item_project.xml @@ -0,0 +1,32 @@ + + + + + + + +