feat: refresh views on notebook update
This commit is contained in:
parent
2d665ab631
commit
89decbe819
6 changed files with 78 additions and 69 deletions
|
@ -1,10 +1,12 @@
|
||||||
package net.mbess.popequer
|
package net.mbess.popequer
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
|
|
||||||
class AppContext(
|
class AppContext(
|
||||||
val androidContext: Context,
|
val androidContext: Context,
|
||||||
) {
|
) {
|
||||||
|
val onNotebookUpdateCallbacks: MutableList<() -> Unit> = CopyOnWriteArrayList()
|
||||||
val gitActions = GitActions(androidContext)
|
val gitActions = GitActions(androidContext)
|
||||||
val popequer = Popequer(PopequerAdapter(gitActions.cloneFolder.absolutePath))
|
val popequer = Popequer(PopequerAdapter(gitActions.cloneFolder.absolutePath))
|
||||||
val backgroundActions = BackgroundActions(this)
|
val backgroundActions = BackgroundActions(this)
|
||||||
|
|
|
@ -1,18 +1,34 @@
|
||||||
package net.mbess.popequer
|
package net.mbess.popequer
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import net.mbess.popequer.ui.MainActivity
|
||||||
|
|
||||||
class BackgroundActions(val context: AppContext) {
|
class BackgroundActions(val context: AppContext) {
|
||||||
fun refresh() {
|
fun refresh() {
|
||||||
runCatching {
|
runCatching {
|
||||||
context.gitActions.sync()
|
context.gitActions.sync()
|
||||||
context.popequer.index()
|
context.popequer.index()
|
||||||
|
context.onNotebookUpdateCallbacks.forEach { it() }
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
Log.e("BackgroundActions", "Failed to refresh the Notebook");
|
Log.e("BackgroundActions", "Failed to refresh the Notebook", it);
|
||||||
|
context.androidContext.mainExecutor.execute {
|
||||||
|
Toast.makeText(
|
||||||
|
context.androidContext,
|
||||||
|
"Failed to refresh the notebook",
|
||||||
|
Toast.LENGTH_LONG
|
||||||
|
)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
}.onSuccess {
|
}.onSuccess {
|
||||||
Log.i("BackgroundActions", "Notebook refresh successfully");
|
Log.i("BackgroundActions", "Notebook refresh successfully");
|
||||||
|
context.androidContext.mainExecutor.execute {
|
||||||
|
Toast.makeText(context.androidContext, "Refresh success", Toast.LENGTH_SHORT)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@ package net.mbess.popequer
|
||||||
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
|
||||||
class EventItem(
|
data class EventItem(
|
||||||
val name: String,
|
val name: String,
|
||||||
val startTime: Instant,
|
val startTime: Instant,
|
||||||
val endTime: Instant?
|
val endTime: Instant?
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
package net.mbess.popequer
|
package net.mbess.popequer
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
class PopequerException(message:String): Exception(message)
|
||||||
class Popequer(
|
class Popequer(
|
||||||
val adapter: PopequerAdapter
|
val adapter: PopequerAdapter
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun index(): String {
|
fun index() {
|
||||||
return adapter.index()
|
val res = adapter.index()
|
||||||
|
if (res.contains("ERR")) {
|
||||||
|
throw PopequerException(res)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fun upcomingEvents(): List<EventItem> {
|
fun upcomingEvents(): List<EventItem> {
|
||||||
val events_str = adapter.upcomingEvents()
|
val events_str = adapter.upcomingEvents()
|
||||||
|
|
|
@ -32,7 +32,6 @@ fun AppContainer(
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
val androidContext = LocalContext.current
|
val androidContext = LocalContext.current
|
||||||
|
|
||||||
|
|
||||||
val navController = rememberNavController()
|
val navController = rememberNavController()
|
||||||
val navigationActions = remember(navController) {
|
val navigationActions = remember(navController) {
|
||||||
AppNavigationActions(navController)
|
AppNavigationActions(navController)
|
||||||
|
@ -124,57 +123,9 @@ fun AppContainer(
|
||||||
) {
|
) {
|
||||||
AppNavGraph(
|
AppNavGraph(
|
||||||
appContext = context,
|
appContext = context,
|
||||||
navController = navController,
|
navController = navController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// val old_home = Surface(
|
|
||||||
// modifier = Modifier.padding(padding)
|
|
||||||
// ) {
|
|
||||||
// FlowColumn {
|
|
||||||
// FlowRow(
|
|
||||||
// modifier = Modifier.fillMaxWidth(),
|
|
||||||
// horizontalArrangement = Arrangement.SpaceAround
|
|
||||||
// ) {
|
|
||||||
// Button(
|
|
||||||
// onClick = {
|
|
||||||
// Toast.makeText(
|
|
||||||
// context.androidContext,
|
|
||||||
// "Will pull repo changes",
|
|
||||||
// Toast.LENGTH_SHORT
|
|
||||||
// ).show()
|
|
||||||
// scope.launch(Dispatchers.IO) {
|
|
||||||
// runCatching {
|
|
||||||
// context.gitActions.sync()
|
|
||||||
// Toast.makeText(
|
|
||||||
// context.androidContext,
|
|
||||||
// "Repo changes are sync",
|
|
||||||
// Toast.LENGTH_LONG
|
|
||||||
// ).show()
|
|
||||||
// }.onFailure {
|
|
||||||
// Log.e("MainActivity", "Failed to trigger git actions", it)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// ) {
|
|
||||||
// Text("Pull")
|
|
||||||
// }
|
|
||||||
// Button(
|
|
||||||
// onClick = {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// ) {
|
|
||||||
// Text("New quick note")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// LazyColumn {
|
|
||||||
// // Add 5 items
|
|
||||||
// items(30) { index ->
|
|
||||||
// Text(text = "Item: $index")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
|
@ -1,20 +1,30 @@
|
||||||
package net.mbess.popequer.ui
|
package net.mbess.popequer.ui
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.width
|
import androidx.compose.foundation.layout.width
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.itemsIndexed
|
import androidx.compose.foundation.lazy.itemsIndexed
|
||||||
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.Card
|
import androidx.compose.material3.Card
|
||||||
import androidx.compose.material3.CardDefaults
|
import androidx.compose.material3.CardDefaults
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.DisposableEffect
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import net.mbess.popequer.AppContext
|
import net.mbess.popequer.AppContext
|
||||||
|
import net.mbess.popequer.EventItem
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.ZoneOffset.UTC
|
import java.time.ZoneOffset.UTC
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
@ -23,21 +33,48 @@ import java.time.format.DateTimeFormatter
|
||||||
fun UpcomingEventsRoute(
|
fun UpcomingEventsRoute(
|
||||||
appContext: AppContext
|
appContext: AppContext
|
||||||
) {
|
) {
|
||||||
|
val eventsList = remember {
|
||||||
|
mutableStateListOf<EventItem>()
|
||||||
|
}
|
||||||
|
val refresh: () -> Unit = remember {
|
||||||
|
{
|
||||||
|
eventsList.clear()
|
||||||
|
eventsList.addAll(appContext.popequer.upcomingEvents())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val formatter = remember {
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
}
|
||||||
Surface(modifier = Modifier.padding(10.dp)) {
|
Surface(modifier = Modifier.padding(10.dp)) {
|
||||||
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
LaunchedEffect(Unit) {
|
||||||
|
refresh()
|
||||||
|
appContext.onNotebookUpdateCallbacks.add(refresh)
|
||||||
|
}
|
||||||
|
DisposableEffect(Unit) {
|
||||||
|
onDispose {
|
||||||
|
appContext.onNotebookUpdateCallbacks.remove(refresh)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Box() {
|
||||||
LazyColumn {
|
LazyColumn {
|
||||||
itemsIndexed(appContext.popequer.upcomingEvents()) { index, item ->
|
itemsIndexed(eventsList) { index, item ->
|
||||||
Card(
|
Card(
|
||||||
elevation = CardDefaults.cardElevation(
|
elevation = CardDefaults.cardElevation(
|
||||||
defaultElevation = 6.dp
|
defaultElevation = 6.dp
|
||||||
),
|
),
|
||||||
shape = MaterialTheme.shapes.medium,
|
shape = MaterialTheme.shapes.medium,
|
||||||
modifier = Modifier.fillMaxWidth().padding(bottom = 10.dp)
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(bottom = 10.dp)
|
||||||
) {
|
) {
|
||||||
Column(modifier = Modifier.padding(15.dp)) {
|
Column(modifier = Modifier.padding(15.dp)) {
|
||||||
Text(item.name, style = MaterialTheme.typography.headlineSmall)
|
Text(item.name, style = MaterialTheme.typography.headlineSmall)
|
||||||
Text("Start: ${LocalDateTime.ofInstant(item.startTime, UTC).format(formatter)}")
|
Text(
|
||||||
|
"Start: ${
|
||||||
|
LocalDateTime.ofInstant(item.startTime, UTC).format(formatter)
|
||||||
|
}"
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue