Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 59 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,22 @@
*.iml
.gradle
/local.properties
<<<<<<< HEAD
/.idea/
=======
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
>>>>>>> pr-7-Santix1234-kotlinTodoApp
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
<<<<<<< HEAD

# Gradle files
*.gradle
Expand Down Expand Up @@ -45,4 +55,52 @@ release/

# Secrets and local configs
*.env
local.properties
local.properties
=======
local.properties

# Kotlin/Android
bin/
gen/
out/
*.class
*.log
*.dex
*.apk

# Dependency directories
node_modules/
jspm_packages/
app/libs/

# Gradle
.gradle/
build/

# Testing
app/build/
app/test/
app/androidTest/

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Virtual environment
venv/
.env

# IDE specific files
.vscode/
.idea/
*.ipr
*.iws

# Misc
*.swp
*.swo
.DS_Store
>>>>>>> pr-7-Santix1234-kotlinTodoApp
49 changes: 49 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}

android {
namespace = "com.todoapp"
compileSdk = 33

defaultConfig {
applicationId = "com.todoapp"
minSdk = 24
targetSdk = 33
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = "17"
}
}

dependencies {
implementation("androidx.core:core-ktx:1.10.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")

testImplementation("junit:junit:4.13.2")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4")
testImplementation("androidx.arch.core:core-testing:2.2.0")

androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}
111 changes: 111 additions & 0 deletions app/src/main/java/com/todoapp/ui/EditTodoActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.todoapp.ui

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Switch
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.todoapp.R
import com.todoapp.data.Todo
import com.todoapp.viewmodel.TodoViewModel
import kotlinx.coroutines.launch

class EditTodoActivity : AppCompatActivity() {

private lateinit var todoViewModel: TodoViewModel
private lateinit var titleEditText: EditText
private lateinit var descriptionEditText: EditText
private lateinit var completedSwitch: Switch
private lateinit var saveButton: Button
private lateinit var cancelButton: Button

private var todoId: Long = -1

companion object {
const val EXTRA_TODO_ID = "extra_todo_id"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit_todo)

// Initialize ViewModel
todoViewModel = ViewModelProvider(this)[TodoViewModel::class.java]

// Initialize views
titleEditText = findViewById(R.id.edit_todo_title)
descriptionEditText = findViewById(R.id.edit_todo_description)
completedSwitch = findViewById(R.id.edit_todo_completed_switch)
saveButton = findViewById(R.id.save_todo_button)
cancelButton = findViewById(R.id.cancel_todo_button)

// Get todo item ID from intent
todoId = intent.getLongExtra(EXTRA_TODO_ID, -1)

// Load existing todo item if editing
if (todoId != -1L) {
loadTodoItem()
}

// Save button click listener
saveButton.setOnClickListener {
saveTodoItem()
}

// Cancel button click listener
cancelButton.setOnClickListener {
finish()
}
}

private fun loadTodoItem() {
lifecycleScope.launch {
val todo = todoViewModel.getTodoById(todoId)
todo?.let {
titleEditText.setText(it.title)
descriptionEditText.setText(it.description)
completedSwitch.isChecked = it.isCompleted
}
}
}

private fun saveTodoItem() {
val title = titleEditText.text.toString().trim()
val description = descriptionEditText.text.toString().trim()
val isCompleted = completedSwitch.isChecked

// Validate input
if (title.isEmpty()) {
titleEditText.error = "Title cannot be empty"
return
}

lifecycleScope.launch {
try {
// Create or update todo item
val todo = Todo(
id = if (todoId == -1L) 0 else todoId,
title = title,
description = description,
isCompleted = isCompleted
)

if (todoId == -1L) {
todoViewModel.insertTodo(todo)
Toast.makeText(this@EditTodoActivity, "Todo created", Toast.LENGTH_SHORT).show()
} else {
todoViewModel.updateTodo(todo)
Toast.makeText(this@EditTodoActivity, "Todo updated", Toast.LENGTH_SHORT).show()
}

// Close the activity
finish()
} catch (e: Exception) {
Toast.makeText(this@EditTodoActivity, "Error saving todo", Toast.LENGTH_SHORT).show()
}
}
}
}
64 changes: 48 additions & 16 deletions app/src/main/res/layout/activity_edit_todo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,19 @@
android:id="@+id/titleInputLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Title"
android:hint="Todo Title"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/titleEditText"
android:id="@+id/edit_todo_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:maxLines="1"/>
android:maxLines="1"
tools:text="Buy groceries"/>
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
Expand All @@ -36,33 +38,63 @@
app:layout_constraintEnd_toEndOf="parent">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/descriptionEditText"
android:id="@+id/edit_todo_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:minLines="3"
android:maxLines="5"/>
android:maxLines="5"
tools:text="Buy milk, eggs, and bread"/>
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/completedSwitch"
android:layout_width="wrap_content"
<LinearLayout
android:id="@+id/completedSwitchLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Completed"
android:layout_marginTop="16dp"
android:orientation="horizontal"
android:gravity="center_vertical"
app:layout_constraintTop_toBottomOf="@id/descriptionInputLayout"
app:layout_constraintStart_toStartOf="parent"/>
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Completed" />

<com.google.android.material.button.MaterialButton
android:id="@+id/saveTodoButton"
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/edit_todo_completed_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

<LinearLayout
android:id="@+id/buttonLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Save Todo"
android:orientation="horizontal"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
android:layout_marginBottom="16dp"/>
android:layout_marginBottom="16dp">

<Button
android:id="@+id/cancel_todo_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:text="Cancel" />

</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/save_todo_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:text="Save Todo" />
</LinearLayout>
</androidx:constraintlayout.widget.ConstraintLayout>
Loading