Skip to content
Draft
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
4 changes: 4 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ plugins {
alias(libs.plugins.room)

kotlin("plugin.serialization") version "2.0.21"
id("kotlin-parcelize")
}

val versionMajor = 1
Expand Down Expand Up @@ -101,6 +102,9 @@ dependencies {
implementation(libs.work.runtime)
implementation(libs.work.runtime.ktx)
implementation(libs.kotlinx.coroutines.guava)
implementation(libs.androidx.adaptive)
implementation(libs.androidx.adaptive.layout)
implementation(libs.androidx.adaptive.navigation)
implementation(libs.logging.interceptor)
implementation(libs.androidx.browser)

Expand Down
266 changes: 128 additions & 138 deletions app/src/main/java/dev/itsvic/parceltracker/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
Expand All @@ -43,27 +40,15 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.toRoute
import dev.itsvic.parceltracker.api.ParcelHistoryItem
import dev.itsvic.parceltracker.api.ParcelNonExistentException
import dev.itsvic.parceltracker.api.Status
import dev.itsvic.parceltracker.api.getParcel
import dev.itsvic.parceltracker.db.Parcel
import dev.itsvic.parceltracker.db.ParcelStatus
import dev.itsvic.parceltracker.db.ParcelWithStatus
import dev.itsvic.parceltracker.api.Parcel as APIParcel
import dev.itsvic.parceltracker.db.demoModeParcels
import dev.itsvic.parceltracker.ui.theme.ParcelTrackerTheme
import dev.itsvic.parceltracker.ui.views.AddEditParcelView
import dev.itsvic.parceltracker.ui.views.HomeView
import dev.itsvic.parceltracker.ui.views.ParcelView
import dev.itsvic.parceltracker.ui.views.SettingsView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import okio.IOException
import java.time.LocalDateTime
import java.time.ZoneId

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -131,8 +116,8 @@ object HomePage
@Serializable
object SettingsPage

@Serializable
data class ParcelPage(val parcelDbId: Int)
//@Serializable
//data class ParcelPage(val parcelDbId: Int)

@Serializable
object AddParcelPage
Expand All @@ -149,11 +134,11 @@ fun ParcelAppNavigation(parcelToOpen: Int) {
val demoMode by context.dataStore.data.map { it[DEMO_MODE] == true }.collectAsState(false)

LaunchedEffect(parcelToOpen) {
if (parcelToOpen != -1) {
navController.navigate(route = ParcelPage(parcelToOpen)) {
popUpTo(HomePage)
}
}
// if (parcelToOpen != -1) {
// navController.navigate(route = ParcelPage(parcelToOpen)) {
// popUpTo(HomePage)
// }
// }
}

val animDuration = 300
Expand Down Expand Up @@ -183,16 +168,21 @@ fun ParcelAppNavigation(parcelToOpen: Int) {
},
) {
composable<HomePage> {
val parcels = if (demoMode)
derivedStateOf { demoModeParcels }
else
db.parcelDao().getAllWithStatus().collectAsState(initial = emptyList())

HomeView(
parcels = parcels.value,
onNavigateToAddParcel = { navController.navigate(route = AddParcelPage) },
onNavigateToParcel = { navController.navigate(route = ParcelPage(it.id)) },
// val parcels = if (demoMode)
// derivedStateOf { demoModeParcels }
// else
// db.parcelDao().getAllWithStatus().collectAsState(initial = emptyList())
//
// HomeView(
// parcels = parcels.value,
// onNavigateToAddParcel = { navController.navigate(route = AddParcelPage) },
// onNavigateToParcel = { navController.navigate(route = ParcelPage(it.id)) },
// onNavigateToSettings = { navController.navigate(route = SettingsPage) },
// )
ParcelListDetailRoute(
demoMode = demoMode,
onNavigateToSettings = { navController.navigate(route = SettingsPage) },
onNavigateToAddParcel = { navController.navigate(route = AddParcelPage) },
)
}

Expand All @@ -202,107 +192,107 @@ fun ParcelAppNavigation(parcelToOpen: Int) {
)
}

composable<ParcelPage> { backStackEntry ->
val route: ParcelPage = backStackEntry.toRoute()
val parcelWithStatus: ParcelWithStatus? by if (demoMode)
derivedStateOf { demoModeParcels[route.parcelDbId] }
else
db.parcelDao().getWithStatusById(route.parcelDbId).collectAsState(null)
var apiParcel: APIParcel? by remember { mutableStateOf(null) }

val dbParcel = parcelWithStatus?.parcel

LaunchedEffect(parcelWithStatus) {
if (dbParcel != null) {
launch(Dispatchers.IO) {
try {
apiParcel = getParcel(
dbParcel.parcelId,
dbParcel.postalCode,
dbParcel.service
)

if (!demoMode) {
// update parcel status
val zone = ZoneId.systemDefault()
val lastChange =
apiParcel!!.history.first().time.atZone(zone).toInstant()
val status = ParcelStatus(
dbParcel.id,
apiParcel!!.currentStatus,
lastChange,
)
if (parcelWithStatus?.status == null) {
db.parcelStatusDao().insert(status)
} else {
db.parcelStatusDao().update(status)
}
}
} catch (e: IOException) {
Log.w("MainActivity", "Failed fetch: $e")
apiParcel = APIParcel(
dbParcel.parcelId,
listOf(
ParcelHistoryItem(
context.getString(R.string.network_failure_detail),
LocalDateTime.now(),
""
)
),
Status.NetworkFailure
)
} catch (_: ParcelNonExistentException) {
apiParcel = APIParcel(
dbParcel.parcelId,
listOf(
ParcelHistoryItem(
context.getString(R.string.parcel_doesnt_exist_detail),
LocalDateTime.now(),
""
)
),
Status.NoData
)
}
}
}
}

if (apiParcel == null || dbParcel == null)
Box(
modifier = Modifier
.background(color = MaterialTheme.colorScheme.background)
.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator()
}
else
ParcelView(
apiParcel!!,
dbParcel.humanName,
dbParcel.service,
onBackPressed = { navController.popBackStack() },
onEdit = { navController.navigate(EditParcelPage(dbParcel.id)) },
onDelete = {
if (demoMode) {
Toast.makeText(
context,
context.getString(R.string.demo_mode_action_block),
Toast.LENGTH_SHORT
).show()
return@ParcelView
}

scope.launch(Dispatchers.IO) {
db.parcelDao().delete(dbParcel)
scope.launch {
navController.popBackStack(HomePage, false)
}
}
},
)
}
// composable<ParcelPage> { backStackEntry ->
// val route: ParcelPage = backStackEntry.toRoute()
// val parcelWithStatus: ParcelWithStatus? by if (demoMode)
// derivedStateOf { demoModeParcels[route.parcelDbId] }
// else
// db.parcelDao().getWithStatusById(route.parcelDbId).collectAsState(null)
// var apiParcel: APIParcel? by remember { mutableStateOf(null) }
//
// val dbParcel = parcelWithStatus?.parcel
//
// LaunchedEffect(parcelWithStatus) {
// if (dbParcel != null) {
// launch(Dispatchers.IO) {
// try {
// apiParcel = getParcel(
// dbParcel.parcelId,
// dbParcel.postalCode,
// dbParcel.service
// )
//
// if (!demoMode) {
// // update parcel status
// val zone = ZoneId.systemDefault()
// val lastChange =
// apiParcel!!.history.first().time.atZone(zone).toInstant()
// val status = ParcelStatus(
// dbParcel.id,
// apiParcel!!.currentStatus,
// lastChange,
// )
// if (parcelWithStatus?.status == null) {
// db.parcelStatusDao().insert(status)
// } else {
// db.parcelStatusDao().update(status)
// }
// }
// } catch (e: IOException) {
// Log.w("MainActivity", "Failed fetch: $e")
// apiParcel = APIParcel(
// dbParcel.parcelId,
// listOf(
// ParcelHistoryItem(
// context.getString(R.string.network_failure_detail),
// LocalDateTime.now(),
// ""
// )
// ),
// Status.NetworkFailure
// )
// } catch (e: ParcelNonExistentException) {
// apiParcel = APIParcel(
// dbParcel.parcelId,
// listOf(
// ParcelHistoryItem(
// context.getString(R.string.parcel_doesnt_exist_detail),
// LocalDateTime.now(),
// ""
// )
// ),
// Status.NoData
// )
// }
// }
// }
// }
//
// if (apiParcel == null || dbParcel == null)
// Box(
// modifier = Modifier
// .background(color = MaterialTheme.colorScheme.background)
// .fillMaxSize(),
// contentAlignment = Alignment.Center
// ) {
// CircularProgressIndicator()
// }
// else
// ParcelView(
// apiParcel!!,
// dbParcel.humanName,
// dbParcel.service,
// onBackPressed = { navController.popBackStack() },
// onEdit = { navController.navigate(EditParcelPage(dbParcel.id)) },
// onDelete = {
// if (demoMode) {
// Toast.makeText(
// context,
// context.getString(R.string.demo_mode_action_block),
// Toast.LENGTH_SHORT
// ).show()
// return@ParcelView
// }
//
// scope.launch(Dispatchers.IO) {
// db.parcelDao().delete(dbParcel)
// scope.launch {
// navController.popBackStack(HomePage, false)
// }
// }
// },
// )
// }

composable<AddParcelPage> {
AddEditParcelView(
Expand All @@ -319,12 +309,12 @@ fun ParcelAppNavigation(parcelToOpen: Int) {
}

scope.launch(Dispatchers.IO) {
val id = db.parcelDao().insert(it)
scope.launch {
navController.navigate(route = ParcelPage(id.toInt())) {
popUpTo(HomePage)
}
}
// val id = db.parcelDao().insert(it)
// scope.launch {
// navController.navigate(route = ParcelPage(id.toInt())) {
// popUpTo(HomePage)
// }
// }
}
},
)
Expand Down
Loading