diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt index 62c354c8f7544f6af83be1a59e81c5fb8cca9b58..9c973f4741757791cce0f3d39348c736b6cfa3ca 100644 --- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt +++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/MainActivity.kt @@ -16,6 +16,7 @@ import space.rethelyi.mosogepsch.model.data.MosogepSchDatabase import space.rethelyi.mosogepsch.network.Api import space.rethelyi.mosogepsch.notification.createNotificationChannel import space.rethelyi.mosogepsch.view.* +import java.util.* class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -40,6 +41,7 @@ class MainActivity : ComponentActivity() { fun MosogepSCH() { var rooms by remember { mutableStateOf(listOf<LaundryRoom>()) } var error by remember { mutableStateOf(false) } + var lastRequestTime by remember { mutableStateOf<Date?>(null) } val coroutineScope = rememberCoroutineScope() val ctx = LocalContext.current @@ -48,11 +50,13 @@ fun MosogepSCH() { suspend fun reload() { try { val tmprooms = Api.getLaundryRooms() + lastRequestTime = Date() for (room in tmprooms) { room.machines.forEach { it.last_query_time = room.last_query_time it.floorId = room.id.toString() } + room.machines = room.machines.sortedBy { it.kind_of } room.toDb(ctx) } rooms = tmprooms @@ -62,7 +66,9 @@ fun MosogepSCH() { val list = db.dao.getAllLaundryRoom() val oldRooms: MutableList<LaundryRoom> = mutableListOf() list.forEach { element -> - oldRooms.add(element.toLaundryRoom(ctx)) + val floor = element.toLaundryRoom(ctx) + floor.machines = floor.machines.sortedBy { it.kind_of } + oldRooms.add(floor) } rooms = oldRooms } @@ -71,8 +77,12 @@ fun MosogepSCH() { if (rooms.isEmpty()) { LoadingScreen() } else { - MainScreen(rooms, error) { - coroutineScope.launch { reload() } + MainScreen(rooms, error, lastRequestTime) { + coroutineScope.launch { + it.isRefreshing = true + reload() + it.isRefreshing = false + } } } diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt index 8bf8ffd2dbbc99fbac5056d0df532fbb6431447f..b346ae3f832a0c6fa80e73e22d234c462c2bc7a2 100644 --- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt +++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/AppBar.kt @@ -34,7 +34,7 @@ fun AppBar(internet: Boolean) { if (!internet) { Icon( painter = painterResource(R.drawable.cloud_off), - contentDescription = "no internet connection" + contentDescription = stringResource(R.string.no_internet) ) } }, diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt index 21afcb4feafed5dc58c9a4cb1fa1149c538f1074..298521d144c679435d87344672cfc7077b4a54f5 100644 --- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt +++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/Floor.kt @@ -13,9 +13,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import space.rethelyi.mosogepsch.R import space.rethelyi.mosogepsch.model.Machine +import java.util.* @Composable -fun FloorListItem(floor: Floor) { +fun FloorListItem(floor: Floor, lastRequestTime: Date?) { val modifier = Modifier.fillMaxWidth() Card( modifier = modifier, @@ -41,7 +42,8 @@ fun FloorListItem(floor: Floor) { for(machine in floor.machines) { MachineOnFloorView( machine = machine, - modifier = Modifier.weight(1f) + modifier = Modifier.weight(1f), + lastRequestTime = lastRequestTime ) } } diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt index 2df1dc8caf93e8772f16122b262329224e27e8cb..d94574a79fdd22b664576565b8b7ef6094a862f4 100644 --- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt +++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MachineOnFloor.kt @@ -12,9 +12,12 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import space.rethelyi.mosogepsch.R import space.rethelyi.mosogepsch.model.Machine +import java.time.Instant +import java.time.LocalDateTime +import java.util.* @Composable -fun MachineOnFloorView(machine: Machine, modifier: Modifier) { +fun MachineOnFloorView(machine: Machine, modifier: Modifier, lastRequestTime: Date?) { val context = LocalContext.current Card( modifier = modifier @@ -25,7 +28,15 @@ fun MachineOnFloorView(machine: Machine, modifier: Modifier) { intent.putExtra("machine", machine) context.startActivity(intent) }), - color = if (machine.status == 1) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primary, + color = when { + machine.last_query_time.isLostInSpace(lastRequestTime) -> { + MaterialTheme.colorScheme.background + } + machine.status == 1 -> { + MaterialTheme.colorScheme.error + } + else -> MaterialTheme.colorScheme.primary + }, ) { Column( modifier = Modifier @@ -56,3 +67,11 @@ fun MachineOnFloorView(machine: Machine, modifier: Modifier) { } } } + +const val spaceThreshold = 10*60*1000 // 10 minutes + +fun Date.isLostInSpace(lastRequestTime: Date?) : Boolean { + if (lastRequestTime == null) return false + val diff = lastRequestTime.time - this.time + return diff > spaceThreshold +} \ No newline at end of file diff --git a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt index b6a51465c0fa3cff4321050f443130b880467afc..619da5329da73d7c27febd4f9c5af695456a8569 100644 --- a/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt +++ b/frontend/app/src/main/java/space/rethelyi/mosogepsch/view/MainScreen.kt @@ -16,10 +16,11 @@ import androidx.compose.ui.unit.dp import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.SwipeRefreshState import space.rethelyi.mosogepsch.model.LaundryRoom +import java.util.* @Composable @OptIn(ExperimentalMaterial3Api::class) -fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, reload: (swipe: SwipeRefreshState) -> Unit) { +fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, lastRequestTime: Date?, reload: (swipe: SwipeRefreshState) -> Unit) { val isRefreshing by remember { mutableStateOf(SwipeRefreshState(!error)) } Scaffold( topBar = { AppBar(!error) } @@ -42,7 +43,8 @@ fun MainScreen(rooms: List<LaundryRoom>, error: Boolean, reload: (swipe: SwipeRe floor = Floor( id = it.id, machines = it.machines - ) + ), + lastRequestTime = lastRequestTime ) } ) diff --git a/frontend/app/src/main/res/values-hu/strings.xml b/frontend/app/src/main/res/values-hu/strings.xml index bb1a7b9b10c665640cc2df2ad8da65ae97515d2c..38d650730861f87538f3b5528c5b9f63c82969fa 100644 --- a/frontend/app/src/main/res/values-hu/strings.xml +++ b/frontend/app/src/main/res/values-hu/strings.xml @@ -16,4 +16,5 @@ <string name="unsub_fail">Sikertelen leiratkozás</string> <string name="title">%1$s. emeleti %2$s</string> <string name="notification_msg">A %1$s. emeleti %2$s %3$s lett.</string> + <string name="no_internet">nincs internet kapcsolat</string> </resources> \ No newline at end of file diff --git a/frontend/app/src/main/res/values/strings.xml b/frontend/app/src/main/res/values/strings.xml index d81072b3c10cbaa5be0aef32e4bd19139a20f0ef..b9e3cab918072257bbe8e29c09d765bda8bea7f6 100644 --- a/frontend/app/src/main/res/values/strings.xml +++ b/frontend/app/src/main/res/values/strings.xml @@ -18,4 +18,5 @@ <string name="unsub_fail">Failed to unsubscribe</string> <string name="title">%2$s on floor %1$s</string> <string name="notification_msg">The %2$s on floor %1$s became %3$s</string> + <string name="no_internet">no internet connection</string> </resources> \ No newline at end of file