Skip to content

Commit 269963d

Browse files
committed
fix timer
1 parent c691ca3 commit 269963d

16 files changed

Lines changed: 163 additions & 68 deletions

File tree

composeApp/src/androidMain/kotlin/neth/iecal/trease/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class MainActivity : ComponentActivity() {
1313
override fun onCreate(savedInstanceState: Bundle?) {
1414
enableEdgeToEdge()
1515
super.onCreate(savedInstanceState)
16-
TreaseContext.init(this)
16+
TreaseContext.init(applicationContext)
1717

1818
val prefs = getSharedPreferences("trease_prefs", Context.MODE_PRIVATE)
1919

composeApp/src/androidMain/kotlin/neth/iecal/trease/Platform.android.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.github.kdroidfilter.composemediaplayer.VideoPlayerSurface
1111
import io.ktor.client.HttpClient
1212
import io.ktor.client.engine.okhttp.OkHttp
1313
import neth.iecal.trease.interfaces.CacheManager
14+
import neth.iecal.trease.services.ServiceState
1415
import neth.iecal.trease.ui.dialogs.AppSelectionDialog
1516
import neth.iecal.trease.utils.AppBlockerManager
1617
import neth.iecal.trease.utils.DefaultCacheManager
@@ -82,4 +83,8 @@ actual fun onForceStopFocus() {
8283

8384
actual fun getCacheManager(): CacheManager {
8485
return DefaultCacheManager()
86+
}
87+
88+
actual fun isBlockerRunning(): Boolean {
89+
return ServiceState.isRunning
8590
}

composeApp/src/androidMain/kotlin/neth/iecal/trease/services/AppBlockerService.kt

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import kotlinx.coroutines.*
1616
import neth.iecal.trease.MainActivity
1717
import neth.iecal.trease.R
1818
import neth.iecal.trease.data.DeepFocus
19+
import neth.iecal.trease.utils.FocusStateManager
20+
import neth.iecal.trease.utils.TreeStatsLodger
1921
import neth.iecal.trease.utils.getKeyboards
2022
import neth.iecal.trease.utils.reloadApps
2123
import java.util.TreeMap
@@ -49,7 +51,7 @@ class AppBlockerService : Service() {
4951
startForegroundServiceCompat()
5052
registerBroadcastReceiver()
5153

52-
if(ServiceState.isRunning) {
54+
if (ServiceState.isRunning) {
5355
startDeepFocus(ServiceState.duration, ServiceState.lockedPackages.toList())
5456
}
5557
// Start the main blocking loop
@@ -65,7 +67,10 @@ class AppBlockerService : Service() {
6567
ServiceState.isRunning = false
6668
ServiceState.currentLockedPackage = null
6769
serviceScope.cancel() // Kills all monitoring and timers
68-
try { unregisterReceiver(controlReceiver) } catch (_: Exception) {}
70+
try {
71+
unregisterReceiver(controlReceiver)
72+
} catch (_: Exception) {
73+
}
6974
stopForeground(STOP_FOREGROUND_REMOVE)
7075
}
7176

@@ -108,9 +113,11 @@ class AppBlockerService : Service() {
108113

109114
// Bring our activity to front
110115
val intent = Intent(this, MainActivity::class.java).apply {
111-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
112-
Intent.FLAG_ACTIVITY_CLEAR_TOP or
113-
Intent.FLAG_ACTIVITY_SINGLE_TOP)
116+
addFlags(
117+
Intent.FLAG_ACTIVITY_NEW_TASK or
118+
Intent.FLAG_ACTIVITY_CLEAR_TOP or
119+
Intent.FLAG_ACTIVITY_SINGLE_TOP
120+
)
114121
putExtra("locked_package", packageName)
115122
}
116123
startActivity(intent)
@@ -168,11 +175,17 @@ class AppBlockerService : Service() {
168175
ServiceState.lockedPackages.addAll(toLock)
169176
}
170177

171-
private fun stopDeepFocus() {
178+
private suspend fun stopDeepFocus() {
172179
ServiceState.lockedPackages.clear()
173180
ServiceState.isRunning = false
174181

175-
Toast.makeText(this, "Focus Session Complete", Toast.LENGTH_LONG).show()
182+
val focusStatsManager = TreeStatsLodger()
183+
val focusStateManager = FocusStateManager()
184+
val runningTree = focusStateManager.getRunningTree()
185+
if (runningTree != null) {
186+
focusStatsManager.injectStats(runningTree.copy(isFailed = false))
187+
focusStateManager.setRunning(-1)
188+
}
176189

177190
// Kill service completely
178191
stopSelf()
@@ -205,8 +218,14 @@ class AppBlockerService : Service() {
205218
val duration = intent.getLongExtra("duration", 0L)
206219
startDeepFocus(duration, exceptions)
207220
}
208-
ACTION_STOP_DEEP_FOCUS -> stopDeepFocus()
221+
222+
ACTION_STOP_DEEP_FOCUS -> {
223+
CoroutineScope(Dispatchers.Main).launch {
224+
stopDeepFocus()
225+
}
226+
}
209227
}
228+
210229
}
211230
}
212231

composeApp/src/androidMain/kotlin/neth/iecal/trease/ui/dialogs/AppSelectionDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ fun AppSelectionDialog(
213213
coroutineScope.launch {
214214
val appBlockManager = AppBlockerManager(context)
215215
appBlockManager.saveAllowedPackages(currentSelection)
216-
appBlockManager.startAppBlockerService(currentSelection,viewModel.selectedMinutes.value * 60000)
216+
appBlockManager.startAppBlockerService(currentSelection,viewModel.remainingSeconds.value * 1_000)
217217
}
218218
onDismiss()
219219
onConfirm()

composeApp/src/androidMain/kotlin/neth/iecal/trease/utils/AppBlockerManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,6 @@ class AppBlockerManager(private val context: Context) {
6464
context.stopService(serviceIntent)
6565
}
6666

67+
68+
6769
}

composeApp/src/commonMain/kotlin/neth/iecal/trease/Platform.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ expect fun FocusStarterDialog(viewModel: HomeScreenViewModel, onConfirm: () -> U
2929

3030
expect fun onForceStopFocus()
3131

32-
expect fun getCacheManager(): CacheManager
32+
expect fun getCacheManager(): CacheManager
33+
34+
expect fun isBlockerRunning():Boolean

composeApp/src/commonMain/kotlin/neth/iecal/trease/interfaces/CacheManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ interface CacheManager {
66
content: String
77
)
88
suspend fun readFile(fileName: String): String?
9+
suspend fun doesFileExist(): Boolean
910
}

composeApp/src/commonMain/kotlin/neth/iecal/trease/models/FocusStats.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package neth.iecal.trease.models
22

33
import kotlinx.serialization.Serializable
4-
import kotlinx.serialization.Serializer
54
import kotlin.uuid.ExperimentalUuidApi
65
import kotlin.uuid.Uuid
76

@@ -14,5 +13,4 @@ data class FocusStats @OptIn(ExperimentalUuidApi::class) constructor(
1413
val id:String = Uuid.generateV7().toString(),
1514
val completedOn: Long = kotlin.time.Clock.System.now().toEpochMilliseconds(),
1615
val treeSeed: Int = 0,
17-
1816
)

composeApp/src/commonMain/kotlin/neth/iecal/trease/ui/bottomsheet/SelectTreeBottomSheet.kt

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package neth.iecal.trease.ui.bottomsheet
22

33
import androidx.compose.animation.*
44
import androidx.compose.foundation.ExperimentalFoundationApi
5+
import androidx.compose.foundation.Image
56
import androidx.compose.foundation.background
67
import androidx.compose.foundation.combinedClickable
78
import androidx.compose.foundation.layout.*
@@ -15,28 +16,27 @@ import androidx.compose.ui.ExperimentalComposeUiApi
1516
import androidx.compose.ui.Modifier
1617
import androidx.compose.ui.draw.alpha
1718
import androidx.compose.ui.draw.clip
18-
import androidx.compose.ui.graphics.Outline
1919
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
2020
import androidx.compose.ui.layout.ContentScale
2121
import androidx.compose.ui.platform.LocalHapticFeedback
2222
import androidx.compose.ui.platform.LocalUriHandler
23-
import androidx.compose.ui.platform.UriHandler
2423
import androidx.compose.ui.text.font.FontWeight
2524
import androidx.compose.ui.text.style.TextAlign
2625
import androidx.compose.ui.text.style.TextOverflow
2726
import androidx.compose.ui.unit.dp
2827
import androidx.compose.ui.window.Dialog
2928
import coil3.compose.AsyncImage
3029
import kotlinx.coroutines.launch
31-
import kotlinx.serialization.encodeToString
3230
import kotlinx.serialization.json.Json
3331
import neth.iecal.trease.Constants
34-
import neth.iecal.trease.api.TreeRepository
3532
import neth.iecal.trease.getCacheManager
3633
import neth.iecal.trease.models.TreeData
3734
import neth.iecal.trease.models.TreeUiState
3835
import neth.iecal.trease.utils.TreePurchaseManager
3936
import neth.iecal.trease.viewmodels.HomeScreenViewModel
37+
import org.jetbrains.compose.resources.painterResource
38+
import trease.composeapp.generated.resources.Res
39+
import trease.composeapp.generated.resources.grid
4040

4141
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
4242
@Composable
@@ -62,10 +62,9 @@ fun GrowTreeBottomSheet(
6262
uiState = TreeUiState.Success(Json.decodeFromString(it))
6363
}
6464

65+
// also refresh the cache
6566
try {
66-
val trees = TreeRepository.fetchTrees().filter { it.id != "weathered" }
67-
uiState = TreeUiState.Success(trees)
68-
cacheManager.saveFile("tree.json", Json.encodeToString(trees))
67+
uiState = TreeUiState.Success(viewModel.fetchTreesFromCdn())
6968
} catch (e: Exception) {
7069
if (uiState !is TreeUiState.Success) {
7170
uiState = TreeUiState.Error("Unable to load forest: ${e.message}")
@@ -178,6 +177,8 @@ private fun TreeGridView(
178177
onShowWitheredTrees: () -> Unit,
179178
purchasedTrees: List<String>
180179
) {
180+
181+
val uriHandler = LocalUriHandler.current
181182
Column(
182183
modifier = Modifier
183184
.fillMaxWidth()
@@ -225,6 +226,44 @@ private fun TreeGridView(
225226
) { tree ->
226227
TreeGridItem(tree, onTreeSelected, onTreeLongPress,purchasedTrees.contains(tree.id))
227228
}
229+
item {
230+
Column(
231+
horizontalAlignment = Alignment.CenterHorizontally,
232+
modifier = Modifier
233+
.clip(RoundedCornerShape(16.dp))
234+
.combinedClickable(
235+
onClick = {
236+
uriHandler.openUri("https://github.com/Trease-Focus/trease-artwork")
237+
},
238+
)
239+
.padding(8.dp)
240+
) {
241+
Box(
242+
modifier = Modifier
243+
.size(90.dp)
244+
.padding(8.dp),
245+
contentAlignment = Alignment.Center
246+
) {
247+
Image(
248+
painter = painterResource(Res.drawable.grid),
249+
contentDescription = "Add Tree",
250+
modifier = Modifier.size(50.dp),
251+
contentScale = ContentScale.Fit
252+
)
253+
}
254+
255+
Spacer(Modifier.height(8.dp))
256+
257+
Text(
258+
text = "Add Tree",
259+
style = MaterialTheme.typography.labelMedium,
260+
textAlign = TextAlign.Center,
261+
minLines = 2,
262+
maxLines = 2,
263+
overflow = TextOverflow.Ellipsis
264+
)
265+
}
266+
}
228267
}
229268
}
230269
}

composeApp/src/commonMain/kotlin/neth/iecal/trease/ui/bottomsheet/WitheredTreeBottomSheet.kt

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import androidx.compose.foundation.combinedClickable
77
import androidx.compose.foundation.layout.*
88
import androidx.compose.foundation.lazy.grid.*
99
import androidx.compose.foundation.shape.RoundedCornerShape
10-
import androidx.compose.material.icons.Icons
11-
import androidx.compose.material.icons.filled.Add
1210
import androidx.compose.material3.*
1311
import androidx.compose.runtime.*
1412
import androidx.compose.ui.Alignment
@@ -28,8 +26,6 @@ import neth.iecal.trease.Constants
2826
import neth.iecal.trease.models.FocusStats
2927
import neth.iecal.trease.utils.TreeStatsLodger
3028
import neth.iecal.trease.utils.getDate
31-
import neth.iecal.trease.viewmodels.HomeScreenViewModel
32-
import org.jetbrains.compose.resources.imageResource
3329
import org.jetbrains.compose.resources.painterResource
3430
import trease.composeapp.generated.resources.Res
3531
import trease.composeapp.generated.resources.baseline_info_outline_24
@@ -93,7 +89,6 @@ private fun WitheredTreeGridView(
9389
onTreeSelected: (FocusStats) -> Unit,
9490
onTreeLongPress: (FocusStats) -> Unit
9591
) {
96-
val uriHandler = LocalUriHandler.current
9792

9893
Column(
9994
modifier = Modifier
@@ -126,13 +121,7 @@ private fun WitheredTreeGridView(
126121
) { tree ->
127122
WitheredTreeGridItem(tree, onTreeSelected, onTreeLongPress)
128123
}
129-
item {
130-
Icon(
131-
painterResource(Res.drawable.baseline_info_outline_24), contentDescription = "Add new art",
132-
modifier = Modifier.size(200.dp).combinedClickable(true, onClick = {
133-
uriHandler.openUri("https://github.com/Trease-Focus/trease-artwork")
134-
}))
135-
}
124+
136125
}
137126
}
138127
}

0 commit comments

Comments
 (0)