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 @@ + + + + +