Skip to content

Commit fd90e60

Browse files
committed
Merge branch 'main' into snowy-season-easter-egg
# Conflicts: # app/src/main/java/at/bitfire/icsdroid/ui/nav/MainApp.kt # gradle/libs.versions.toml
2 parents d39b404 + a1aa5b2 commit fd90e60

12 files changed

Lines changed: 55 additions & 53 deletions

File tree

.github/workflows/codeql.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,25 @@ jobs:
2525

2626
steps:
2727
- name: Checkout repository
28-
uses: actions/checkout@v5
28+
uses: actions/checkout@v6
2929
with:
3030
submodules: recursive
3131
- uses: actions/setup-java@v5
3232
with:
3333
distribution: 'temurin'
3434
java-version: 21
35-
- uses: gradle/actions/setup-gradle@v4
35+
- uses: gradle/actions/setup-gradle@v5
3636

3737
# Initializes the CodeQL tools for scanning.
3838
- name: Initialize CodeQL
39-
uses: github/codeql-action/init@v3
39+
uses: github/codeql-action/init@v4
4040
with:
4141
languages: ${{ matrix.language }}
4242

4343
- name: Build
4444
run: ./gradlew --no-daemon app:assembleStandardDebug
4545

4646
- name: Perform CodeQL Analysis
47-
uses: github/codeql-action/analyze@v3
47+
uses: github/codeql-action/analyze@v4
4848
with:
4949
category: "/language:${{matrix.language}}"

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ jobs:
1010
contents: write
1111
runs-on: ubuntu-latest
1212
steps:
13-
- uses: actions/checkout@v5
13+
- uses: actions/checkout@v6
1414
with:
1515
submodules: true
1616
- uses: actions/setup-java@v5
1717
with:
1818
distribution: 'temurin'
1919
java-version: 21
20-
- uses: gradle/actions/setup-gradle@v4
20+
- uses: gradle/actions/setup-gradle@v5
2121

2222
- name: Prepare keystore
2323
run: echo ${{ secrets.android_keystore_base64 }} | base64 -d >$GITHUB_WORKSPACE/keystore.jks

.github/workflows/test-dev.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@ jobs:
55
name: Tests without emulator
66
runs-on: ubuntu-latest
77
steps:
8-
- uses: actions/checkout@v5
8+
- uses: actions/checkout@v6
99
with:
1010
submodules: true
1111
- uses: actions/setup-java@v5
1212
with:
1313
distribution: 'temurin'
1414
java-version: 21
15-
- uses: gradle/actions/setup-gradle@v4
15+
- uses: gradle/actions/setup-gradle@v5
1616

1717
- name: Check
1818
run: ./gradlew app:lintStandardDebug app:testStandardDebugUnitTest
1919

2020
- name: Archive results
2121
if: always()
22-
uses: actions/upload-artifact@v4
22+
uses: actions/upload-artifact@v5
2323
with:
2424
name: test-results-unit
2525
path: |
@@ -33,14 +33,14 @@ jobs:
3333
matrix:
3434
api-level: [31]
3535
steps:
36-
- uses: actions/checkout@v5
36+
- uses: actions/checkout@v6
3737
with:
3838
submodules: true
3939
- uses: actions/setup-java@v5
4040
with:
4141
distribution: 'temurin'
4242
java-version: 21
43-
- uses: gradle/actions/setup-gradle@v4
43+
- uses: gradle/actions/setup-gradle@v5
4444

4545
- name: Enable KVM group perms
4646
run: |
@@ -80,7 +80,7 @@ jobs:
8080

8181
- name: Archive results
8282
if: always()
83-
uses: actions/upload-artifact@v4
83+
uses: actions/upload-artifact@v5
8484
with:
8585
name: test-results-instrumented-${{ matrix.api-level }}
8686
path: |

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,9 @@ dependencies {
154154
implementation(libs.compose.ui.toolingPreview)
155155
implementation(libs.compose.runtime.livedata)
156156

157+
implementation(libs.aboutLibs.core)
157158
implementation(libs.aboutLibs.compose)
159+
implementation(libs.aboutLibs.compose.core)
158160
implementation(libs.jodaTime)
159161

160162
implementation(libs.ktor.core)

app/src/main/java/at/bitfire/icsdroid/AppHttpClient.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package at.bitfire.icsdroid
66

77
import android.content.Context
88
import at.bitfire.cert4android.CustomCertManager
9+
import at.bitfire.cert4android.CustomCertStore
910
import at.bitfire.icsdroid.ui.ForegroundTracker
1011
import dagger.assisted.Assisted
1112
import dagger.assisted.AssistedFactory
@@ -16,6 +17,7 @@ import io.ktor.client.engine.HttpClientEngine
1617
import io.ktor.client.engine.okhttp.OkHttp
1718
import io.ktor.client.plugins.HttpTimeout
1819
import io.ktor.client.plugins.UserAgent
20+
import io.ktor.client.plugins.cookies.HttpCookies
1921
import okhttp3.brotli.BrotliInterceptor
2022
import okhttp3.internal.tls.OkHostnameVerifier
2123
import javax.net.ssl.SSLContext
@@ -57,7 +59,8 @@ class AppHttpClient @AssistedInject constructor(
5759
// CustomCertManager is Closeable, but HttpClient will live as long as the application is in memory,
5860
// so we don't need to close it
5961
private val certManager = CustomCertManager(
60-
context = context,
62+
certStore = CustomCertStore.getInstance(context),
63+
trustSystemCerts = true,
6164
appInForeground = ForegroundTracker.inForeground
6265
)
6366

@@ -79,6 +82,9 @@ class AppHttpClient @AssistedInject constructor(
7982
socketTimeoutMillis = 60_000
8083
}
8184

85+
// Enable cookie storage - in memory, will be lost on app restart
86+
install(HttpCookies)
87+
8288
// Disable redirect following, it's handled by CalendarFetcher
8389
followRedirects = false
8490
}

app/src/main/java/at/bitfire/icsdroid/db/dao/SubscriptionsDao.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.room.Embedded
1111
import androidx.room.Insert
1212
import androidx.room.Query
1313
import androidx.room.Relation
14+
import androidx.room.Transaction
1415
import androidx.room.Update
1516
import at.bitfire.icsdroid.db.entity.Credential
1617
import at.bitfire.icsdroid.db.entity.Subscription
@@ -46,6 +47,7 @@ interface SubscriptionsDao {
4647
@Query("SELECT * FROM subscriptions WHERE url=:url")
4748
suspend fun getByUrl(url: String): Subscription?
4849

50+
@Transaction
4951
@Query("SELECT * FROM subscriptions WHERE id=:id")
5052
suspend fun getWithCredentialsById(id: Long): SubscriptionWithCredential?
5153

app/src/main/java/at/bitfire/icsdroid/model/SubscriptionSettingsUseCase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import at.bitfire.icsdroid.HttpUtils
88
import at.bitfire.icsdroid.db.entity.Credential
99
import at.bitfire.icsdroid.db.entity.Subscription
1010
import javax.inject.Inject
11-
import javax.inject.Singleton
1211

13-
@Singleton
1412
class SubscriptionSettingsUseCase @Inject constructor() {
1513
data class UiState(
1614
val url: String? = null,
@@ -35,6 +33,8 @@ class SubscriptionSettingsUseCase @Inject constructor() {
3533
val validUrlInput: Boolean = url?.let { url ->
3634
HttpUtils.acceptedProtocol(url.toUri())
3735
} ?: false
36+
37+
fun isInitialized() = url != null || title != null || color != null
3838
}
3939

4040
var uiState by mutableStateOf(UiState())

app/src/main/java/at/bitfire/icsdroid/ui/nav/MainApp.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,16 @@ import androidx.compose.runtime.getValue
1616
import androidx.compose.runtime.mutableStateOf
1717
import androidx.compose.runtime.remember
1818
import androidx.compose.runtime.setValue
19-
import androidx.compose.ui.Modifier
20-
import androidx.compose.ui.graphics.vector.rememberVectorPainter
2119
import androidx.compose.ui.platform.LocalContext
2220
import androidx.compose.ui.zIndex
2321
import androidx.core.app.ShareCompat
2422
import androidx.core.content.IntentCompat
2523
import androidx.core.os.BundleCompat
2624
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
27-
import androidx.navigation3.runtime.entry
2825
import androidx.navigation3.runtime.entryProvider
2926
import androidx.navigation3.runtime.rememberNavBackStack
30-
import androidx.navigation3.runtime.rememberSavedStateNavEntryDecorator
27+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
3128
import androidx.navigation3.ui.NavDisplay
32-
import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator
3329
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_ERROR_MESSAGE
3430
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_REQUEST_CALENDAR_PERMISSION
3531
import at.bitfire.icsdroid.MainActivity.Companion.EXTRA_THROWABLE
@@ -143,8 +139,7 @@ fun MainApp(
143139

144140
NavDisplay(
145141
entryDecorators = listOf(
146-
rememberSceneSetupNavEntryDecorator(),
147-
rememberSavedStateNavEntryDecorator(),
142+
rememberSaveableStateHolderNavEntryDecorator(),
148143
rememberViewModelStoreNavEntryDecorator()
149144
),
150145
backStack = backStack,

app/src/main/java/at/bitfire/icsdroid/ui/screen/AddSubscriptionScreen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ fun AddSubscriptionScreen(
6969
LaunchedEffect(uiState) {
7070
if (uiState.success) {
7171
// on success, show notification and close activity
72-
Toast.makeText(context, context.getString(R.string.add_calendar_created), Toast.LENGTH_LONG).show()
72+
Toast.makeText(context, R.string.add_calendar_created, Toast.LENGTH_LONG).show()
7373
onBackRequested()
7474
}
7575
uiState.errorMessage?.let {
@@ -79,6 +79,8 @@ fun AddSubscriptionScreen(
7979
}
8080

8181
LaunchedEffect(title, color, url) {
82+
if (model.subscriptionSettingsUseCase.uiState.isInitialized())
83+
return@LaunchedEffect
8284
model.subscriptionSettingsUseCase.setInitialValues(title, color, url)
8385

8486
if (url != null) {

app/src/main/java/at/bitfire/icsdroid/ui/screen/InfoScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import at.bitfire.icsdroid.service.ComposableStartupService.Companion.FLAG_DONAT
4848
import at.bitfire.icsdroid.ui.partials.ExtendedTopAppBar
4949
import at.bitfire.icsdroid.ui.partials.GenericAlertDialog
5050
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer
51-
import com.mikepenz.aboutlibraries.ui.compose.rememberLibraries
51+
import com.mikepenz.aboutlibraries.ui.compose.produceLibraries
5252
import kotlinx.coroutines.runBlocking
5353
import java.util.ServiceLoader
5454

@@ -104,7 +104,7 @@ fun InfoScreen(
104104
)
105105
}
106106
) { contentPadding ->
107-
val libraries by rememberLibraries {
107+
val libraries by produceLibraries {
108108
resources.openRawResource(R.raw.aboutlibraries).bufferedReader().use { input ->
109109
input.readText()
110110
}

0 commit comments

Comments
 (0)