Skip to content

Commit cce37e2

Browse files
authored
Merge pull request #1031 from tunjid/bugfix/2.0.2
Bugfix/2.0.2
2 parents 3356c92 + 2f0ce98 commit cce37e2

File tree

105 files changed

+2902
-1281
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+2902
-1281
lines changed

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
publish-android-app:
88
runs-on: ubuntu-latest
99
permissions:
10-
contents: 'read'
10+
contents: 'write'
1111
id-token: 'write'
1212
steps:
1313
- name: Checkout Code

composeApp/src/androidMain/kotlin/com/tunjid/heron/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class MainActivity : ComponentActivity() {
4848

4949
override fun onCreate(savedInstanceState: Bundle?) {
5050
installSplashScreen().apply {
51-
setKeepOnScreenCondition(appState::isShowingSplashScreen)
51+
setKeepOnScreenCondition(appState::showPlatformSplashScreen)
5252
setOnExitAnimationListener(SplashScreenViewProvider::remove)
5353
}
5454
enableEdgeToEdge()

data/core/src/commonMain/kotlin/com/tunjid/heron/data/network/NetworkService.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,16 @@
1616

1717
package com.tunjid.heron.data.network
1818

19+
import com.tunjid.heron.data.core.types.AtProtoException
1920
import com.tunjid.heron.data.lexicons.BlueskyApi
2021
import com.tunjid.heron.data.lexicons.XrpcBlueskyApi
21-
import com.tunjid.heron.data.utilities.AtProtoException
2222
import com.tunjid.heron.data.utilities.mapCatchingUnlessCancelled
2323
import com.tunjid.heron.data.utilities.runCatchingWithNetworkRetry
2424
import dev.zacsweers.metro.Inject
2525
import io.ktor.client.HttpClient
2626
import kotlin.time.Duration
2727
import kotlin.time.Duration.Companion.milliseconds
2828
import kotlin.time.Duration.Companion.seconds
29-
import kotlinx.coroutines.currentCoroutineContext
3029
import sh.christian.ozone.api.response.AtpResponse
3130

3231
internal interface NetworkService {

data/core/src/commonMain/kotlin/com/tunjid/heron/data/network/SessionManager.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import com.atproto.server.RefreshSessionResponse
2222
import com.tunjid.heron.data.core.models.OauthUriRequest
2323
import com.tunjid.heron.data.core.models.Server
2424
import com.tunjid.heron.data.core.models.SessionRequest
25+
import com.tunjid.heron.data.core.types.AtProtoException
26+
import com.tunjid.heron.data.core.types.InvalidTokenException
2527
import com.tunjid.heron.data.core.types.ProfileId
2628
import com.tunjid.heron.data.lexicons.XrpcBlueskyApi
2729
import com.tunjid.heron.data.lexicons.XrpcSerializersModule
@@ -33,10 +35,8 @@ import com.tunjid.heron.data.network.oauth.OAuthToken
3335
import com.tunjid.heron.data.repository.SavedState
3436
import com.tunjid.heron.data.repository.SavedStateDataSource
3537
import com.tunjid.heron.data.repository.signedInAuth
36-
import com.tunjid.heron.data.utilities.AtProtoException
3738
import com.tunjid.heron.data.utilities.Collections
3839
import com.tunjid.heron.data.utilities.DeferredMutex
39-
import com.tunjid.heron.data.utilities.InvalidTokenException
4040
import com.tunjid.heron.data.utilities.runCatchingUnlessCancelled
4141
import dev.zacsweers.metro.Inject
4242
import io.ktor.client.HttpClient
@@ -62,16 +62,13 @@ import io.ktor.http.encodedPath
6262
import io.ktor.http.isSuccess
6363
import io.ktor.http.set
6464
import io.ktor.http.takeFrom
65-
import io.ktor.util.collections.ConcurrentMap
6665
import kotlin.time.Clock
6766
import kotlin.time.Duration.Companion.seconds
68-
import kotlinx.coroutines.currentCoroutineContext
6967
import kotlinx.coroutines.flow.MutableStateFlow
7068
import kotlinx.coroutines.flow.filterIsInstance
7169
import kotlinx.coroutines.flow.first
7270
import kotlinx.coroutines.flow.map
7371
import kotlinx.coroutines.flow.update
74-
import kotlinx.coroutines.withTimeout
7572
import kotlinx.coroutines.withTimeoutOrNull
7673
import kotlinx.serialization.json.Json
7774
import sh.christian.ozone.api.Handle

data/core/src/commonMain/kotlin/com/tunjid/heron/data/repository/NotificationsRepository.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,9 @@ internal class OfflineNotificationsRepository @Inject constructor(
404404
override suspend fun resolvePushNotification(
405405
query: NotificationsQuery.Push,
406406
): Result<Notification> =
407-
savedStateDataSource.inCurrentProfileSession { signedInProfileId ->
408-
if (signedInProfileId == null) {
409-
return@inCurrentProfileSession expiredSessionResult()
410-
}
407+
// Push notifications can be received for any profile that has been signed in
408+
savedStateDataSource.inPastSession(query.recordUri.profileId()) { token ->
409+
val signedInProfileId = token.authProfileId
411410

412411
recordResolver.resolve(query.recordUri)
413412
.mapCatchingUnlessCancelled { resolvedRecord ->

data/core/src/commonMain/kotlin/com/tunjid/heron/data/repository/RecordRepository.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ import com.tunjid.heron.data.core.types.LabelerUri
4646
import com.tunjid.heron.data.core.types.ListUri
4747
import com.tunjid.heron.data.core.types.PostUri
4848
import com.tunjid.heron.data.core.types.ProfileId
49+
import com.tunjid.heron.data.core.types.RecordUri
4950
import com.tunjid.heron.data.core.types.StarterPackUri
51+
import com.tunjid.heron.data.core.utilities.Outcome
5052
import com.tunjid.heron.data.database.daos.FeedGeneratorDao
5153
import com.tunjid.heron.data.database.daos.LabelDao
5254
import com.tunjid.heron.data.database.daos.ListDao
@@ -119,6 +121,10 @@ interface RecordRepository {
119121
suspend fun updateGrazeFeed(
120122
update: GrazeFeed.Update,
121123
): Result<GrazeFeed>
124+
125+
suspend fun deleteRecord(
126+
uri: RecordUri,
127+
): Outcome
122128
}
123129

124130
internal class OfflineRecordRepository @Inject constructor(
@@ -376,6 +382,13 @@ internal class OfflineRecordRepository @Inject constructor(
376382
}
377383
}
378384
} ?: expiredSessionResult()
385+
386+
override suspend fun deleteRecord(
387+
uri: RecordUri,
388+
): Outcome = savedStateDataSource.inCurrentProfileSession { signedInProfileId ->
389+
if (signedInProfileId == null) return@inCurrentProfileSession expiredSessionOutcome()
390+
recordResolver.deleteRecord(uri)
391+
} ?: expiredSessionOutcome()
379392
}
380393

381394
private suspend fun NetworkService.updateFeedRecord(
@@ -393,7 +406,8 @@ private suspend fun NetworkService.updateFeedRecord(
393406
record = BskyFeed(
394407
did = Did(GrazeDid.id),
395408
displayName = editableFeed?.displayName ?: "Graze Feed",
396-
description = editableFeed?.description ?: "A custom feed created with \uD80C\uDD63 and \uD83D\uDC2E",
409+
description = editableFeed?.description
410+
?: "A custom feed created with \uD80C\uDD63 and \uD83D\uDC2E",
397411
createdAt = Clock.System.now(),
398412
contentMode = response.contentMode,
399413
).asJsonContent(BskyFeed.serializer()),

data/core/src/commonMain/kotlin/com/tunjid/heron/data/repository/SavedStateDataSource.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.tunjid.heron.data.core.models.NotificationPreferences
2424
import com.tunjid.heron.data.core.models.Preferences
2525
import com.tunjid.heron.data.core.models.Server
2626
import com.tunjid.heron.data.core.models.SessionSummary
27+
import com.tunjid.heron.data.core.types.ExpiredSessionException
2728
import com.tunjid.heron.data.core.types.ProfileHandle
2829
import com.tunjid.heron.data.core.types.ProfileId
2930
import com.tunjid.heron.data.core.utilities.Outcome
@@ -59,7 +60,6 @@ import kotlinx.coroutines.withContext
5960
import kotlinx.serialization.Serializable
6061
import kotlinx.serialization.protobuf.ProtoBuf
6162
import okio.FileSystem
62-
import okio.IOException
6363
import okio.Path
6464
import sh.christian.ozone.api.model.JsonContent
6565

@@ -565,5 +565,3 @@ internal suspend inline fun <T> SavedStateDataSource.inPastSession(
565565
internal fun expiredSessionOutcome() = Outcome.Failure(ExpiredSessionException())
566566

567567
internal fun <T> expiredSessionResult() = Result.failure<T>(ExpiredSessionException())
568-
569-
private class ExpiredSessionException : IOException()

0 commit comments

Comments
 (0)