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
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizard.settings.xml
.DS_Store
/build
/app/build
/captures
.externalNativeBuild
.cxx
local.properties
96 changes: 96 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
id("com.google.dagger.hilt.android")
}

android {
namespace = "com.birthday.planner"
compileSdk = 34

defaultConfig {
applicationId = "com.birthday.planner"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}

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"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.8"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}

dependencies {
val composeBom = platform("androidx.compose:compose-bom:2024.01.00")
implementation(composeBom)
androidTestImplementation(composeBom)

implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")

// Navigation
implementation("androidx.navigation:navigation-compose:2.7.6")
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")

// Room
val roomVersion = "2.6.1"
implementation("androidx.room:room-runtime:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
ksp("androidx.room:room-compiler:$roomVersion")

// Hilt
implementation("com.google.dagger:hilt-android:2.50")
ksp("com.google.dagger:hilt-compiler:2.50")

// Coil
implementation("io.coil-kt:coil-compose:2.5.0")

// Lottie
implementation("com.airbnb.android:lottie-compose:6.1.0")

// WorkManager
implementation("androidx.work:work-runtime-ktx:2.9.0")

testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
}
File renamed without changes.
23 changes: 23 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application
android:name=".BirthdayPlannerApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher_background"
android:label="@string/app_name"
android:roundIcon="@drawable/ic_launcher_background"
android:supportsRtl="true"
android:theme="@style/Theme.BirthdayPlanner">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.BirthdayPlanner">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.birthday.planner

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class BirthdayPlannerApplication : Application()
29 changes: 29 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.birthday.planner

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import com.birthday.planner.ui.navigation.BirthdayPlannerNavHost
import com.birthday.planner.ui.theme.BirthdayPlannerTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
BirthdayPlannerTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
BirthdayPlannerNavHost()
}
}
}
}
}
28 changes: 28 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/AppDatabase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.birthday.planner.data

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.birthday.planner.data.converter.Converters
import com.birthday.planner.data.dao.*
import com.birthday.planner.data.model.*

@Database(
entities = [
Party::class,
Board::class,
Pin::class,
ChecklistItem::class,
BudgetItem::class
],
version = 1,
exportSchema = false
)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun partyDao(): PartyDao
abstract fun boardDao(): BoardDao
abstract fun pinDao(): PinDao
abstract fun checklistDao(): ChecklistDao
abstract fun budgetDao(): BudgetDao
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.birthday.planner.data.converter

import androidx.room.TypeConverter
import java.util.Date

class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}

@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time
}
}
17 changes: 17 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/dao/BoardDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.birthday.planner.data.dao

import androidx.room.*
import com.birthday.planner.data.model.Board
import kotlinx.coroutines.flow.Flow

@Dao
interface BoardDao {
@Query("SELECT * FROM boards WHERE partyId = :partyId")
fun getBoardsForParty(partyId: Long): Flow<List<Board>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertBoard(board: Board): Long

@Delete
suspend fun deleteBoard(board: Board)
}
20 changes: 20 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/dao/BudgetDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.birthday.planner.data.dao

import androidx.room.*
import com.birthday.planner.data.model.BudgetItem
import kotlinx.coroutines.flow.Flow

@Dao
interface BudgetDao {
@Query("SELECT * FROM budget_items WHERE partyId = :partyId")
fun getBudgetForParty(partyId: Long): Flow<List<BudgetItem>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertBudgetItem(item: BudgetItem): Long

@Update
suspend fun updateBudgetItem(item: BudgetItem)

@Delete
suspend fun deleteBudgetItem(item: BudgetItem)
}
20 changes: 20 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/dao/ChecklistDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.birthday.planner.data.dao

import androidx.room.*
import com.birthday.planner.data.model.ChecklistItem
import kotlinx.coroutines.flow.Flow

@Dao
interface ChecklistDao {
@Query("SELECT * FROM checklist_items WHERE partyId = :partyId ORDER BY priority ASC")
fun getChecklistForParty(partyId: Long): Flow<List<ChecklistItem>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertChecklistItem(item: ChecklistItem): Long

@Update
suspend fun updateChecklistItem(item: ChecklistItem)

@Delete
suspend fun deleteChecklistItem(item: ChecklistItem)
}
23 changes: 23 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/dao/PartyDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.birthday.planner.data.dao

import androidx.room.*
import com.birthday.planner.data.model.Party
import kotlinx.coroutines.flow.Flow

@Dao
interface PartyDao {
@Query("SELECT * FROM parties")
fun getAllParties(): Flow<List<Party>>

@Query("SELECT * FROM parties WHERE id = :id")
suspend fun getPartyById(id: Long): Party?

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertParty(party: Party): Long

@Update
suspend fun updateParty(party: Party)

@Delete
suspend fun deleteParty(party: Party)
}
20 changes: 20 additions & 0 deletions app/src/main/kotlin/com/birthday/planner/data/dao/PinDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.birthday.planner.data.dao

import androidx.room.*
import com.birthday.planner.data.model.Pin
import kotlinx.coroutines.flow.Flow

@Dao
interface PinDao {
@Query("SELECT * FROM pins WHERE boardId = :boardId")
fun getPinsForBoard(boardId: Long): Flow<List<Pin>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertPin(pin: Pin): Long

@Update
suspend fun updatePin(pin: Pin)

@Delete
suspend fun deletePin(pin: Pin)
}
Loading