diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9bd5106..d5f2638 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,18 @@ + + + + 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 fe71980..363fccb 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 @@ -15,6 +15,7 @@ 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 import com.campusaula.edbole.kanban_clone_android.network.RetrofitInstance +import com.campusaula.edbole.kanban_clone_android.ui.adapters.ProjectItemAdapter import com.google.android.material.floatingactionbutton.FloatingActionButton import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/TaskAddActivity.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/TaskAddActivity.kt new file mode 100644 index 0000000..37d764c --- /dev/null +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/TaskAddActivity.kt @@ -0,0 +1,136 @@ +package com.campusaula.edbole.kanban_clone_android.ui + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.Button +import android.widget.EditText +import android.widget.Spinner +import android.widget.Toast +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.lifecycleScope +import com.campusaula.edbole.kanban_clone_android.R +import com.campusaula.edbole.kanban_clone_android.kanban.TaskBase +import com.campusaula.edbole.kanban_clone_android.kanban.TaskStatus +import com.campusaula.edbole.kanban_clone_android.network.ApiService +import com.campusaula.edbole.kanban_clone_android.network.RetrofitInstance +import com.google.android.material.floatingactionbutton.FloatingActionButton +import kotlinx.coroutines.launch + +class TaskAddActivity : AppCompatActivity() { + + private lateinit var api: ApiService + + private lateinit var returnActionButton: FloatingActionButton + private lateinit var taskTitleInput: EditText + private lateinit var taskDescriptionInput: EditText + private lateinit var taskStatusSpinner: Spinner + private lateinit var createTaskButton: Button + + private var projectId: Int = -1 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_task_add) + 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 + } + + api = RetrofitInstance.getRetrofit(applicationContext).create(ApiService::class.java) + + // Get project ID from intent + projectId = intent.getIntExtra("project_id", -1) + + if (projectId == -1) { + Toast.makeText(this, "Error: Invalid project ID", Toast.LENGTH_SHORT).show() + finish() + return + } + + // Initialize views + returnActionButton = findViewById(R.id.returnActionButton) + taskTitleInput = findViewById(R.id.taskTitleInput) + taskDescriptionInput = findViewById(R.id.taskDescriptionInput) + taskStatusSpinner = findViewById(R.id.taskStatusSpinner) + createTaskButton = findViewById(R.id.createTaskButton) + + // Set default status to PENDING (index 0) + taskStatusSpinner.setSelection(0) + + // Set up button listeners + returnActionButton.setOnClickListener { + finish() + + val intent = Intent(this@TaskAddActivity, ProjectDetailActivity::class.java) + intent.putExtra("project_id", projectId) + startActivity(intent) + } + + createTaskButton.setOnClickListener { + createTask() + } + } + + private fun createTask() { + val title = taskTitleInput.text.toString().trim() + val description = taskDescriptionInput.text.toString().trim() + val status = TaskStatus.entries[taskStatusSpinner.selectedItemPosition] + + if (title.isEmpty()) { + Toast.makeText(this, "Title cannot be empty", Toast.LENGTH_SHORT).show() + return + } + + lifecycleScope.launch { + try { + Log.d("TaskAddActivity", "Creating task: $title") + val taskBase = TaskBase( + id = 0, // ID will be assigned by the server + title = title, + description = description, + status = status + ) + + val response = api.createTask(projectId, taskBase) + + if (response.isSuccessful) { + Log.d("TaskAddActivity", "Task created successfully") + Toast.makeText( + this@TaskAddActivity, + "Task created successfully", + Toast.LENGTH_SHORT + ).show() + setResult(RESULT_OK) + finish() + + // Reopen ProjectDetailActivity to show the new task + val intent = Intent(this@TaskAddActivity, ProjectDetailActivity::class.java) + intent.putExtra("project_id", projectId) + startActivity(intent) + } else { + val errorBody = response.errorBody()?.string() + Log.e("TaskAddActivity", "Error creating task: $errorBody") + Toast.makeText( + this@TaskAddActivity, + "Error creating task: ${response.code()}", + Toast.LENGTH_SHORT + ).show() + } + } catch (e: Exception) { + Log.e("TaskAddActivity", "Exception creating task: ${e.message}") + Toast.makeText( + this@TaskAddActivity, + "Failed to create task: ${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } +} + diff --git a/app/src/main/res/layout/activity_task_add.xml b/app/src/main/res/layout/activity_task_add.xml new file mode 100644 index 0000000..3ceeffe --- /dev/null +++ b/app/src/main/res/layout/activity_task_add.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + +