diff --git a/src/androidTest/java/com/bignerdranch/android/pomodo/ExampleInstrumentedTest.kt b/src/androidTest/java/com/bignerdranch/android/pomodo/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..b170ba9
--- /dev/null
+++ b/src/androidTest/java/com/bignerdranch/android/pomodo/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.bignerdranch.android.pomodo
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.bignerdranch.android.pomodo", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8012eea
--- /dev/null
+++ b/src/main/AndroidManifest.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/ic_launcher-playstore.png b/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000..1641f52
Binary files /dev/null and b/src/main/ic_launcher-playstore.png differ
diff --git a/src/main/java/com/bignerdranch/android/pomodo/Adapters/ToDoAdapter.kt b/src/main/java/com/bignerdranch/android/pomodo/Adapters/ToDoAdapter.kt
new file mode 100644
index 0000000..eefddd4
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/Adapters/ToDoAdapter.kt
@@ -0,0 +1,76 @@
+package com.bignerdranch.android.pomodo.Adapters
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.CheckBox
+import androidx.recyclerview.widget.RecyclerView
+import com.bignerdranch.android.pomodo.AddNewTask
+import com.bignerdranch.android.pomodo.DatabaseHandler
+import com.bignerdranch.android.pomodo.MainActivity
+import com.bignerdranch.android.pomodo.Model.ToDoModel
+import com.bignerdranch.android.pomodo.R
+
+class ToDoAdapter(private val db: DatabaseHandler, private val activity: MainActivity) :
+ RecyclerView.Adapter() {
+
+ private var todoList: MutableList = mutableListOf() // Change to MutableList
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val itemView = LayoutInflater.from(parent.context)
+ .inflate(R.layout.task_layout, parent, false) // Ensure task_layout exists in res/layout
+ return ViewHolder(itemView)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ db.openDatabase()
+
+ val item = todoList[position]
+ holder.task.text = item.task
+ holder.task.isChecked = toBoolean(item.status)
+ holder.task.setOnCheckedChangeListener { _, isChecked ->
+ db.updateStatus(item.id, if (isChecked) 1 else 0)
+ }
+ }
+
+ private fun toBoolean(n: Int): Boolean {
+ return n != 0
+ }
+
+ override fun getItemCount(): Int {
+ return todoList.size
+ }
+
+ fun getContext(): Context {
+ return activity
+ }
+
+ fun setTasks(todoList: List) {
+ this.todoList = todoList.toMutableList() // Ensure it's a MutableList
+ notifyDataSetChanged()
+ }
+
+ fun deleteItem(position: Int) {
+ val item = todoList[position]
+ db.deleteTask(item.id)
+ todoList.removeAt(position) // Now you can modify todoList directly
+ notifyItemRemoved(position)
+ }
+
+ fun editItem(position: Int) {
+ val item = todoList[position]
+ val bundle = Bundle().apply {
+ putInt("id", item.id)
+ putString("task", item.task)
+ }
+ val fragment = AddNewTask().apply { arguments = bundle }
+ // Ensure MainActivity extends FragmentActivity to use supportFragmentManager
+ fragment.show(activity.supportFragmentManager, AddNewTask.TAG)
+ }
+
+ class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ val task: CheckBox = view.findViewById(R.id.todoCheckBox) // Ensure todoCheckBox exists in task_layout.xml
+ }
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/AddNewTask.kt b/src/main/java/com/bignerdranch/android/pomodo/AddNewTask.kt
new file mode 100644
index 0000000..5a28fdd
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/AddNewTask.kt
@@ -0,0 +1,102 @@
+package com.bignerdranch.android.pomodo
+
+
+import android.content.DialogInterface
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.WindowManager
+import android.widget.Button
+import android.widget.EditText
+import androidx.core.content.ContextCompat
+import androidx.core.widget.addTextChangedListener
+import com.bignerdranch.android.pomodo.Model.ToDoModel
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+
+
+class AddNewTask : BottomSheetDialogFragment() {
+
+ private lateinit var newTaskText: EditText
+ private lateinit var newTaskSaveButton: Button
+ private lateinit var db: DatabaseHandler
+
+ companion object {
+ const val TAG = "ActionBottomDialog"
+
+ fun newInstance(): AddNewTask {
+ return AddNewTask()
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setStyle(STYLE_NORMAL, R.style.DialogStyle) // Ensuring DialogStyle is referenced correctly
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.new_task, container, false)
+ dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+ return view
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ newTaskText = view.findViewById(R.id.newTaskText)
+ newTaskSaveButton = view.findViewById(R.id.newTaskButton)
+
+ var isUpdate = false
+ val bundle = arguments
+ if (bundle != null) {
+ isUpdate = true
+ val task = bundle.getString("task")
+ newTaskText.setText(task)
+ task?.let {
+ if (it.isNotEmpty()) {
+ newTaskSaveButton.setTextColor(
+ ContextCompat.getColor(requireContext(), R.color.colorPrimaryDark)
+ )
+ }
+ }
+ }
+
+ db = DatabaseHandler(requireActivity())
+ db.openDatabase()
+
+ // Enable or disable the save button based on text input
+ newTaskText.addTextChangedListener { text ->
+ if (text.isNullOrEmpty()) {
+ newTaskSaveButton.isEnabled = false
+ newTaskSaveButton.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
+ } else {
+ newTaskSaveButton.isEnabled = true
+ newTaskSaveButton.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimaryDark))
+ }
+ }
+
+ newTaskSaveButton.setOnClickListener {
+ val text = newTaskText.text.toString()
+ if (isUpdate) {
+ db.updateTask(bundle?.getInt("id") ?: 0, text)
+ } else {
+ val task = ToDoModel().apply {
+ this.task = text // Correctly setting task value
+ this.status = 0 // Correctly setting the status
+ }
+ db.insertTask(task)
+ }
+ dismiss()
+ }
+ }
+
+ override fun onDismiss(dialog: DialogInterface) {
+ val activity = activity
+ if (activity is DialogCloseListener) {
+ activity.handleDialogClose(dialog)
+ }
+ }
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/DialogCloseListener.kt b/src/main/java/com/bignerdranch/android/pomodo/DialogCloseListener.kt
new file mode 100644
index 0000000..c5581de
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/DialogCloseListener.kt
@@ -0,0 +1,8 @@
+package com.bignerdranch.android.pomodo
+
+import android.content.DialogInterface
+
+interface DialogCloseListener {
+ fun handleDialogClose(dialog: DialogInterface)
+}
+
diff --git a/src/main/java/com/bignerdranch/android/pomodo/MainActivity.kt b/src/main/java/com/bignerdranch/android/pomodo/MainActivity.kt
new file mode 100644
index 0000000..c298ea0
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/MainActivity.kt
@@ -0,0 +1,152 @@
+package com.bignerdranch.android.pomodo
+
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.appcompat.app.AppCompatActivity
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.material3.*
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import com.bignerdranch.android.pomodo.Model.ToDoModel
+import com.bignerdranch.android.pomodo.ui.theme.PomoDoTheme
+
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var db: DatabaseHandler
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ db = DatabaseHandler(this) // Pass context here
+ db.openDatabase()
+
+ setContent {
+ PomoDoTheme {
+ MainScreen(db = db) // Pass db to MainScreen composable
+ }
+ }
+ }
+
+ @Composable
+ fun MainScreen(db: DatabaseHandler) {
+ var taskList by remember { mutableStateOf(listOf()) }
+ var showDialog by remember { mutableStateOf(false) }
+
+ // Load tasks once
+ LaunchedEffect(Unit) {
+ taskList = db.getAllTasks().reversed() // Load tasks initially
+ }
+
+ // Update task list after adding a task
+ val updateTasks = {
+ taskList = db.getAllTasks().reversed()
+ }
+
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ) {
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.SpaceBetween
+ ) {
+ TaskList(tasks = taskList)
+
+ FloatingActionButton(
+ onClick = { showDialog = true },
+ modifier = Modifier.padding(16.dp)
+ ) {
+ Text("+")
+ }
+
+ if (showDialog) {
+ AddTaskDialog(
+ onDismiss = { showDialog = false },
+ onTaskAdded = updateTasks,
+ db = db
+ )
+ }
+ }
+ }
+ }
+
+ @Composable
+ fun TaskList(tasks: List) {
+ LazyColumn {
+ items(tasks) { task ->
+ Text(task.task) // Display task
+ }
+ }
+ }
+
+ @OptIn(ExperimentalMaterial3Api::class)
+ @Composable
+ fun AddTaskDialog(onDismiss: () -> Unit, onTaskAdded: () -> Unit, db: DatabaseHandler) {
+ var newTaskText by remember { mutableStateOf("") }
+
+ AlertDialog(
+ onDismissRequest = onDismiss,
+ confirmButton = {
+ Button(
+ onClick = {
+ if (newTaskText.isNotBlank()) {
+ val newTask = ToDoModel(task = newTaskText)
+ db.insertTask(newTask) // Insert new task
+ onTaskAdded() // Refresh task list
+ onDismiss() // Close dialog
+ }
+ }
+ ) {
+ Text("Add Task")
+ }
+ },
+ dismissButton = {
+ Button(onClick = onDismiss) {
+ Text("Cancel")
+ }
+ },
+ title = { Text("Add New Task") },
+ text = {
+ TextField(
+ value = newTaskText,
+ onValueChange = { newTaskText = it },
+ label = { Text("Task description") }
+ )
+ }
+ )
+ }
+}
+
+// Mock DatabaseHandler for Preview (without Context)
+class MockDatabaseHandler : DatabaseHandler(null) {
+ override fun getAllTasks(): List {
+ return listOf(ToDoModel(task = "Sample Task"))
+ }
+
+ override fun insertTask(task: ToDoModel) {
+ // Mock inserting task, no database action needed for preview
+ }
+
+ override fun openDatabase() {
+ // No need to mock openDatabase
+ }
+}
+
+@Preview(showBackground = true)
+@Composable
+fun MainScreenPreview() {
+ PomoDoTheme {
+ // Use the mocked database
+ MainScreen(db = MockDatabaseHandler())
+ }
+}
+
+@Composable
+fun MainScreen(db: MockDatabaseHandler) {
+
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/Model/ToDoModel.kt b/src/main/java/com/bignerdranch/android/pomodo/Model/ToDoModel.kt
new file mode 100644
index 0000000..22f34bd
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/Model/ToDoModel.kt
@@ -0,0 +1,7 @@
+package com.bignerdranch.android.pomodo.Model
+
+data class ToDoModel(
+ var id: Int = 0, // Change id to Int
+ var task: String = "", // This matches the property you're trying to access in task.task
+ var status: Int = 0
+)
diff --git a/src/main/java/com/bignerdranch/android/pomodo/RecyclerItemTouchHelper.kt b/src/main/java/com/bignerdranch/android/pomodo/RecyclerItemTouchHelper.kt
new file mode 100644
index 0000000..c1e1163
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/RecyclerItemTouchHelper.kt
@@ -0,0 +1,90 @@
+package com.bignerdranch.android.pomodo
+
+import android.app.AlertDialog
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.ItemTouchHelper
+import androidx.recyclerview.widget.RecyclerView
+import com.bignerdranch.android.pomodo.Adapters.ToDoAdapter
+
+class RecyclerItemTouchHelper(private val adapter: ToDoAdapter) :
+ ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
+
+ override fun onMove(
+ recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder,
+ target: RecyclerView.ViewHolder
+ ): Boolean {
+ return false
+ }
+
+ override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
+ val position = viewHolder.adapterPosition
+ if (direction == ItemTouchHelper.LEFT) {
+ val builder = AlertDialog.Builder(adapter.getContext())
+ builder.setTitle("Delete Task")
+ builder.setMessage("Are you sure you want to delete this Task?")
+ builder.setPositiveButton("Confirm") { _, _ ->
+ adapter.deleteItem(position)
+ }
+ builder.setNegativeButton(android.R.string.cancel) { dialog, _ ->
+ adapter.notifyItemChanged(viewHolder.adapterPosition)
+ dialog.dismiss()
+ }
+ val dialog = builder.create()
+ dialog.show()
+ } else {
+ adapter.editItem(position)
+ }
+ }
+
+ override fun onChildDraw(
+ c: Canvas,
+ recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder,
+ dX: Float,
+ dY: Float,
+ actionState: Int,
+ isCurrentlyActive: Boolean
+ ) {
+ super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
+
+ val itemView = viewHolder.itemView
+ val backgroundCornerOffset = 20
+ val icon: Drawable?
+ val background: ColorDrawable
+
+ if (dX > 0) { // Swiping to the right
+ icon = ContextCompat.getDrawable(adapter.getContext(), R.drawable.ic_baseline_edit)
+ background = ColorDrawable(ContextCompat.getColor(adapter.getContext(), R.color.colorPrimaryDark))
+ icon?.let {
+ val iconMargin = (itemView.height - it.intrinsicHeight) / 2
+ val iconTop = itemView.top + (itemView.height - it.intrinsicHeight) / 2
+ val iconBottom = iconTop + it.intrinsicHeight
+ val iconLeft = itemView.left + iconMargin
+ val iconRight = itemView.left + iconMargin + it.intrinsicWidth
+ it.setBounds(iconLeft, iconTop, iconRight, iconBottom)
+ }
+ background.setBounds(itemView.left, itemView.top, itemView.left + dX.toInt() + backgroundCornerOffset, itemView.bottom)
+ } else { // Swiping to the left
+ icon = ContextCompat.getDrawable(adapter.getContext(), R.drawable.ic_baseline_delete)
+ background = ColorDrawable(Color.RED)
+ icon?.let {
+ val iconMargin = (itemView.height - it.intrinsicHeight) / 2
+ val iconTop = itemView.top + (itemView.height - it.intrinsicHeight) / 2
+ val iconBottom = iconTop + it.intrinsicHeight
+ val iconLeft = itemView.right - iconMargin - it.intrinsicWidth
+ val iconRight = itemView.right - iconMargin
+ it.setBounds(iconLeft, iconTop, iconRight, iconBottom)
+ }
+ background.setBounds(itemView.right + dX.toInt() - backgroundCornerOffset, itemView.top, itemView.right, itemView.bottom)
+ }
+
+ background.draw(c)
+ icon?.draw(c)
+ }
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/SplashActivity.kt b/src/main/java/com/bignerdranch/android/pomodo/SplashActivity.kt
new file mode 100644
index 0000000..68117a2
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/SplashActivity.kt
@@ -0,0 +1,23 @@
+package com.bignerdranch.android.pomodo
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.Handler
+import android.os.Looper
+import androidx.appcompat.app.AppCompatActivity
+
+
+class SplashActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_splash)
+ supportActionBar?.hide()
+
+ val intent = Intent(this, MainActivity::class.java)
+ Handler(Looper.getMainLooper()).postDelayed({
+ startActivity(intent)
+ finish()
+ }, 2000)
+ }
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/Utils/DatabaseHandler.kt b/src/main/java/com/bignerdranch/android/pomodo/Utils/DatabaseHandler.kt
new file mode 100644
index 0000000..b9a9579
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/Utils/DatabaseHandler.kt
@@ -0,0 +1,87 @@
+package com.bignerdranch.android.pomodo
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+import com.bignerdranch.android.pomodo.Model.ToDoModel
+
+open class DatabaseHandler(context: Context?) : SQLiteOpenHelper(context, NAME, null, VERSION) {
+
+ private var db: SQLiteDatabase? = null
+
+ override fun onCreate(db: SQLiteDatabase) {
+ db.execSQL(CREATE_TODO_TABLE)
+ }
+
+ override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+ db.execSQL("DROP TABLE IF EXISTS $TODO_TABLE")
+ onCreate(db)
+ }
+
+ open fun openDatabase() {
+ db = writableDatabase
+ }
+
+ open fun insertTask(task: ToDoModel) {
+ val cv = ContentValues().apply {
+ put(TASK, task.task)
+ put(STATUS, task.status)
+ }
+ db?.insert(TODO_TABLE, null, cv)
+ }
+
+ open fun getAllTasks(): List {
+ val taskList = mutableListOf()
+ var cursor: Cursor? = null
+ db?.beginTransaction()
+ try {
+ cursor = db?.query(TODO_TABLE, null, null, null, null, null, null)
+ if (cursor != null && cursor.moveToFirst()) {
+ do {
+ val task = ToDoModel().apply {
+ // Use getInt to properly fetch the integer id
+ id = cursor.getInt(cursor.getColumnIndexOrThrow(ID)) // id as Int
+ task = cursor.getString(cursor.getColumnIndexOrThrow(TASK))
+ status = cursor.getInt(cursor.getColumnIndexOrThrow(STATUS))
+ }
+ taskList.add(task)
+ } while (cursor.moveToNext())
+ }
+ db?.setTransactionSuccessful()
+ } finally {
+ db?.endTransaction()
+ cursor?.close()
+ }
+ return taskList
+ }
+
+ fun updateStatus(id: Int, status: Int) {
+ val cv = ContentValues().apply {
+ put(STATUS, status)
+ }
+ db?.update(TODO_TABLE, cv, "$ID=?", arrayOf(id.toString()))
+ }
+
+ fun updateTask(id: Int, task: String) {
+ val cv = ContentValues().apply {
+ put(TASK, task)
+ }
+ db?.update(TODO_TABLE, cv, "$ID=?", arrayOf(id.toString()))
+ }
+
+ fun deleteTask(id: Int) {
+ db?.delete(TODO_TABLE, "$ID=?", arrayOf(id.toString()))
+ }
+
+ companion object {
+ private const val VERSION = 1
+ private const val NAME = "toDoListDatabase"
+ private const val TODO_TABLE = "todo"
+ private const val ID = "id"
+ private const val TASK = "task"
+ private const val STATUS = "status"
+ private const val CREATE_TODO_TABLE = "CREATE TABLE $TODO_TABLE ($ID INTEGER PRIMARY KEY AUTOINCREMENT, $TASK TEXT, $STATUS INTEGER)"
+ }
+}
diff --git a/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Color.kt b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Color.kt
new file mode 100644
index 0000000..5f0a952
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Color.kt
@@ -0,0 +1,11 @@
+package com.bignerdranch.android.pomodo.ui.theme
+
+import androidx.compose.ui.graphics.Color
+
+val Purple80 = Color(0xFFD0BCFF)
+val PurpleGrey80 = Color(0xFFCCC2DC)
+val Pink80 = Color(0xFFEFB8C8)
+
+val Purple40 = Color(0xFF6650a4)
+val PurpleGrey40 = Color(0xFF625b71)
+val Pink40 = Color(0xFF7D5260)
\ No newline at end of file
diff --git a/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Theme.kt b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Theme.kt
new file mode 100644
index 0000000..3cc8d5e
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Theme.kt
@@ -0,0 +1,70 @@
+package com.bignerdranch.android.pomodo.ui.theme
+
+import android.app.Activity
+import android.os.Build
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.dynamicDarkColorScheme
+import androidx.compose.material3.dynamicLightColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.view.WindowCompat
+
+private val DarkColorScheme = darkColorScheme(
+ primary = Purple80,
+ secondary = PurpleGrey80,
+ tertiary = Pink80
+)
+
+private val LightColorScheme = lightColorScheme(
+ primary = Purple40,
+ secondary = PurpleGrey40,
+ tertiary = Pink40
+
+ /* Other default colors to override
+ background = Color(0xFFFFFBFE),
+ surface = Color(0xFFFFFBFE),
+ onPrimary = Color.White,
+ onSecondary = Color.White,
+ onTertiary = Color.White,
+ onBackground = Color(0xFF1C1B1F),
+ onSurface = Color(0xFF1C1B1F),
+ */
+)
+
+@Composable
+fun PomoDoTheme(
+ darkTheme: Boolean = isSystemInDarkTheme(),
+ // Dynamic color is available on Android 12+
+ dynamicColor: Boolean = true,
+ content: @Composable () -> Unit
+) {
+ val colorScheme = when {
+ dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+ val context = LocalContext.current
+ if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
+ }
+
+ darkTheme -> DarkColorScheme
+ else -> LightColorScheme
+ }
+ val view = LocalView.current
+ if (!view.isInEditMode) {
+ SideEffect {
+ val window = (view.context as Activity).window
+ window.statusBarColor = colorScheme.primary.toArgb()
+ WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
+ }
+ }
+
+ MaterialTheme(
+ colorScheme = colorScheme,
+ typography = Typography,
+ content = content
+ )
+}
\ No newline at end of file
diff --git a/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Type.kt b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Type.kt
new file mode 100644
index 0000000..085c0b4
--- /dev/null
+++ b/src/main/java/com/bignerdranch/android/pomodo/ui/theme/Type.kt
@@ -0,0 +1,34 @@
+package com.bignerdranch.android.pomodo.ui.theme
+
+import androidx.compose.material3.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+// Set of Material typography styles to start with
+val Typography = Typography(
+ bodyLarge = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.5.sp
+ )
+ /* Other default text styles to override
+ titleLarge = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 22.sp,
+ lineHeight = 28.sp,
+ letterSpacing = 0.sp
+ ),
+ labelSmall = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Medium,
+ fontSize = 11.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp
+ )
+ */
+)
\ No newline at end of file
diff --git a/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..7de5a29
--- /dev/null
+++ b/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/drawable/gradient_ic_launcher_foreground.xml b/src/main/res/drawable/gradient_ic_launcher_foreground.xml
new file mode 100644
index 0000000..9278fe5
--- /dev/null
+++ b/src/main/res/drawable/gradient_ic_launcher_foreground.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/src/main/res/drawable/ic_baseline_add_24.xml b/src/main/res/drawable/ic_baseline_add_24.xml
new file mode 100644
index 0000000..c60b4f8
--- /dev/null
+++ b/src/main/res/drawable/ic_baseline_add_24.xml
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable/ic_baseline_delete.xml b/src/main/res/drawable/ic_baseline_delete.xml
new file mode 100644
index 0000000..3b74ec2
--- /dev/null
+++ b/src/main/res/drawable/ic_baseline_delete.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/src/main/res/drawable/ic_baseline_edit.xml b/src/main/res/drawable/ic_baseline_edit.xml
new file mode 100644
index 0000000..2e9cf19
--- /dev/null
+++ b/src/main/res/drawable/ic_baseline_edit.xml
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable/ic_launcher_background.xml b/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..e93e11a
--- /dev/null
+++ b/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/drawable/logo.png b/src/main/res/drawable/logo.png
new file mode 100644
index 0000000..14b06c8
Binary files /dev/null and b/src/main/res/drawable/logo.png differ
diff --git a/src/main/res/drawable/logo_old.png b/src/main/res/drawable/logo_old.png
new file mode 100644
index 0000000..95a24a4
Binary files /dev/null and b/src/main/res/drawable/logo_old.png differ
diff --git a/src/main/res/layout/activity_main.xml b/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..24148c2
--- /dev/null
+++ b/src/main/res/layout/activity_main.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/activity_splash.xml b/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..320373a
--- /dev/null
+++ b/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/layout/new_task.xml b/src/main/res/layout/new_task.xml
new file mode 100644
index 0000000..4d3aabf
--- /dev/null
+++ b/src/main/res/layout/new_task.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/src/main/res/layout/task_layout.xml b/src/main/res/layout/task_layout.xml
new file mode 100644
index 0000000..7afae4a
--- /dev/null
+++ b/src/main/res/layout/task_layout.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/mipmap-hdpi/ic_launcher.webp b/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..f557dbe
Binary files /dev/null and b/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-mdpi/ic_launcher.webp b/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xhdpi/ic_launcher.webp b/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml
new file mode 100644
index 0000000..5b28531
--- /dev/null
+++ b/src/main/res/values/colors.xml
@@ -0,0 +1,23 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+
+
+ #FF03DAC5
+ #FF018786
+
+
+ #FF000000
+ #808080
+ #FFFFFFFF
+
+
+ #FFFFFF
+
+
+ #6200EE
+ #3700B3
+ #03DAC5
+
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
new file mode 100644
index 0000000..c0ce57a
--- /dev/null
+++ b/src/main/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ PomoDo
+ Tasks
+ Enter a new task
+ Save
+
diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml
new file mode 100644
index 0000000..4e21362
--- /dev/null
+++ b/src/main/res/values/styles.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml
new file mode 100644
index 0000000..ee71a6d
--- /dev/null
+++ b/src/main/res/values/themes.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/main/res/xml/backup_rules.xml b/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/xml/data_extraction_rules.xml b/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/com/bignerdranch/android/pomodo/ExampleUnitTest.kt b/src/test/java/com/bignerdranch/android/pomodo/ExampleUnitTest.kt
new file mode 100644
index 0000000..9638da2
--- /dev/null
+++ b/src/test/java/com/bignerdranch/android/pomodo/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.bignerdranch.android.pomodo
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file