diff --git a/.gitignore b/.gitignore index 1f8751e..c770223 100644 --- a/.gitignore +++ b/.gitignore @@ -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 @@ -45,4 +55,52 @@ release/ # Secrets and local configs *.env -local.properties \ No newline at end of file +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 diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..be24f47 --- /dev/null +++ b/app/build.gradle.kts @@ -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") +} \ No newline at end of file diff --git a/app/src/main/java/com/todoapp/ui/EditTodoActivity.kt b/app/src/main/java/com/todoapp/ui/EditTodoActivity.kt new file mode 100644 index 0000000..47301f5 --- /dev/null +++ b/app/src/main/java/com/todoapp/ui/EditTodoActivity.kt @@ -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() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_todo.xml b/app/src/main/res/layout/activity_edit_todo.xml index 9ab416b..37993d6 100644 --- a/app/src/main/res/layout/activity_edit_todo.xml +++ b/app/src/main/res/layout/activity_edit_todo.xml @@ -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"> + android:maxLines="1" + tools:text="Buy groceries"/> + android:maxLines="5" + tools:text="Buy milk, eggs, and bread"/> - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"> + + - + + + + android:layout_marginBottom="16dp"> + +