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
32 changes: 32 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Android Studio
*.iml
.gradle/
build/
.idea/
local.properties

# Gradle files
*.gradle
**/build/

# Compiled class files
*.class

# Log files
*.log

# Virtual machine crash logs
hs_err_pid*

# Mac system files
.DS_Store

# Sensitive or local configuration
*.env

# External libraries
app/libs/

# Test results
test-results/
reports/
13 changes: 13 additions & 0 deletions app/src/main/java/com/example/todoapp/data/TodoItem.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.todoapp.data

data class TodoItem(
val id: Long = 0, // Default 0 for new items
val title: String,
val description: String = "",
val isCompleted: Boolean = false
) {
// Validation method
fun validate(): Boolean {
return title.isNotBlank()
}
}
52 changes: 52 additions & 0 deletions app/src/main/java/com/example/todoapp/ui/AddTodoActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.example.todoapp.ui

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.textfield.TextInputEditText
import com.example.todoapp.R
import com.example.todoapp.data.TodoItem

class AddTodoActivity : AppCompatActivity() {
private lateinit var titleEditText: TextInputEditText
private lateinit var descriptionEditText: TextInputEditText
private lateinit var saveButton: Button

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

// Initialize views
titleEditText = findViewById(R.id.titleEditText)
descriptionEditText = findViewById(R.id.descriptionEditText)
saveButton = findViewById(R.id.saveButton)

// Set up save button click listener
saveButton.setOnClickListener {
saveTodoItem()
}
}

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

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

// Create TodoItem (assuming TodoItem class exists)
val todoItem = TodoItem(
title = title,
description = description,
isCompleted = false
)

// TODO: Save to repository or database
Toast.makeText(this, "Todo saved!", Toast.LENGTH_SHORT).show()
finish() // Close the activity after saving
}
}
42 changes: 42 additions & 0 deletions app/src/main/res/layout/activity_add_todo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/titleInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Todo Title">

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

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/descriptionInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Todo Description"
android:layout_marginTop="16dp">

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/descriptionEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:minLines="3" />
</com.google.android.material.textfield.TextInputLayout>

<Button
android:id="@+id/saveButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Save Todo" />
</LinearLayout>
37 changes: 37 additions & 0 deletions app/src/test/java/com/example/todoapp/data/TodoItemTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.example.todoapp.data

import org.junit.Assert.*
import org.junit.Test

class TodoItemTest {
@Test
fun `todo item creation with valid data`() {
val todoItem = TodoItem(
title = "Test Todo",
description = "Test Description"
)

assertEquals("Test Todo", todoItem.title)
assertEquals("Test Description", todoItem.description)
assertFalse(todoItem.isCompleted)
}

@Test
fun `todo item validation should pass with non-empty title`() {
val todoItem = TodoItem(title = "Valid Title")
assertTrue(todoItem.validate())
}

@Test
fun `todo item validation should fail with empty title`() {
val todoItem = TodoItem(title = "")
assertFalse(todoItem.validate())
}

@Test
fun `todo item can have optional description`() {
val todoItem = TodoItem(title = "Test", description = "")
assertEquals("", todoItem.description)
assertTrue(todoItem.validate())
}
}