Skip to content

Commit 21af370

Browse files
committed
Merge branch 'dev' into 388-do-not-require-internet-connection-for-worker-if-only-local-subscriptions-are-used
2 parents c946d92 + 9747f19 commit 21af370

File tree

10 files changed

+41
-108
lines changed

10 files changed

+41
-108
lines changed

app/build.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ android {
1919
minSdk = 23
2020
targetSdk = 35
2121

22-
versionCode = 82
23-
versionName = "2.2.6"
22+
versionCode = 83
23+
versionName = "2.2.7"
2424

2525
setProperty("archivesBaseName", "icsx5-$versionCode-$versionName")
2626

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

-21
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,4 @@ object UriUtils {
3232

3333
return false
3434
}
35-
36-
/**
37-
* Strips the URL from a string. For example, the following string:
38-
* ```
39-
* "This is a URL: https://example.com"
40-
* ```
41-
* will return:
42-
* ```
43-
* "https://example.com"
44-
* ```
45-
* _Quotes are not included_
46-
* @return The URL found in the string
47-
* @throws IllegalArgumentException if no URL is found in the string
48-
*/
49-
fun String.stripUrl(): String? {
50-
// schema host port path query
51-
return ("([a-zA-Z]+://)" + "([\\w.]+)" + "(:\\d+)?" + "([\\w/]+)?" + "(\\?[\\w.&=*]*)?")
52-
.toRegex()
53-
.find(this)
54-
?.value
55-
}
5635
}

app/src/main/java/at/bitfire/icsdroid/ui/theme/Theme.kt

+4-45
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,15 @@
11
package at.bitfire.icsdroid.ui.theme
22

3-
import android.util.Log
43
import androidx.activity.ComponentActivity
5-
import androidx.activity.SystemBarStyle
64
import androidx.activity.compose.setContent
7-
import androidx.activity.enableEdgeToEdge
8-
import androidx.appcompat.app.AppCompatActivity
95
import androidx.compose.foundation.isSystemInDarkTheme
10-
import androidx.compose.foundation.layout.Box
11-
import androidx.compose.foundation.layout.fillMaxSize
12-
import androidx.compose.foundation.layout.systemBarsPadding
136
import androidx.compose.material3.MaterialTheme
147
import androidx.compose.material3.darkColorScheme
158
import androidx.compose.material3.lightColorScheme
169
import androidx.compose.runtime.Composable
1710
import androidx.compose.runtime.CompositionContext
18-
import androidx.compose.runtime.LaunchedEffect
1911
import androidx.compose.runtime.collectAsState
2012
import androidx.compose.runtime.getValue
21-
import androidx.compose.ui.Modifier
22-
import androidx.compose.ui.graphics.toArgb
23-
import androidx.compose.ui.platform.LocalContext
2413
import androidx.lifecycle.viewmodel.compose.viewModel
2514
import at.bitfire.icsdroid.model.ThemeModel
2615

@@ -67,40 +56,10 @@ fun AppTheme(
6756
darkTheme: Boolean = isSystemInDarkTheme(),
6857
content: @Composable () -> Unit
6958
) {
70-
val context = LocalContext.current
71-
72-
val colorScheme = if (darkTheme)
73-
DarkColors
74-
else
75-
LightColors
76-
77-
MaterialTheme(colorScheme = colorScheme) {
78-
LaunchedEffect(darkTheme) {
79-
(context as? AppCompatActivity)?.let { activity ->
80-
val style = if (darkTheme)
81-
SystemBarStyle.dark(
82-
nearlyBlack.toArgb()
83-
)
84-
else
85-
SystemBarStyle.dark(
86-
darkblue.toArgb()
87-
)
88-
activity.enableEdgeToEdge(
89-
statusBarStyle = style,
90-
navigationBarStyle = style
91-
)
92-
} ?: Log.e("AppTheme", "Context is not activity!")
93-
}
94-
95-
Box(
96-
modifier = Modifier
97-
// Required to make sure all paddings are correctly set
98-
.systemBarsPadding()
99-
.fillMaxSize()
100-
) {
101-
content()
102-
}
103-
}
59+
MaterialTheme(
60+
colorScheme = if (darkTheme) DarkColors else LightColors,
61+
content = content
62+
)
10463
}
10564

10665
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package at.bitfire.icsdroid.ui.views
2+
3+
import androidx.activity.ComponentActivity
4+
import androidx.activity.enableEdgeToEdge
5+
import androidx.core.view.WindowCompat
6+
7+
fun ComponentActivity.configureEdgeToEdge() {
8+
enableEdgeToEdge()
9+
WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = false
10+
}

app/src/main/java/at/bitfire/icsdroid/ui/views/AddCalendarActivity.kt

+2-10
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,25 @@ import android.net.Uri
99
import android.os.Bundle
1010
import android.os.Parcelable
1111
import android.provider.OpenableColumns
12-
import android.util.Log
1312
import android.widget.Toast
1413
import androidx.activity.result.contract.ActivityResultContracts
1514
import androidx.activity.viewModels
1615
import androidx.appcompat.app.AppCompatActivity
17-
import androidx.compose.foundation.ExperimentalFoundationApi
1816
import androidx.compose.foundation.layout.Box
1917
import androidx.compose.foundation.layout.imePadding
2018
import androidx.compose.runtime.LaunchedEffect
2119
import androidx.compose.ui.Modifier
22-
import androidx.compose.ui.graphics.toArgb
2320
import androidx.compose.ui.platform.LocalContext
2421
import androidx.core.view.WindowCompat
25-
import at.bitfire.icsdroid.Constants
2622
import at.bitfire.icsdroid.HttpClient
2723
import at.bitfire.icsdroid.R
28-
import at.bitfire.icsdroid.UriUtils.stripUrl
2924
import at.bitfire.icsdroid.calendar.LocalCalendar
3025
import at.bitfire.icsdroid.model.CreateSubscriptionModel
3126
import at.bitfire.icsdroid.model.CredentialsModel
3227
import at.bitfire.icsdroid.model.SubscriptionSettingsModel
3328
import at.bitfire.icsdroid.model.ValidationModel
3429
import at.bitfire.icsdroid.ui.screen.AddCalendarScreen
35-
import at.bitfire.icsdroid.ui.theme.lightblue
3630
import at.bitfire.icsdroid.ui.theme.setContentThemed
37-
import okhttp3.HttpUrl.Companion.toHttpUrl
38-
import java.net.URI
39-
import java.net.URISyntaxException
4031

4132
class AddCalendarActivity : AppCompatActivity() {
4233

@@ -71,6 +62,7 @@ class AddCalendarActivity : AppCompatActivity() {
7162
}
7263

7364
override fun onCreate(savedInstanceState: Bundle?) {
65+
configureEdgeToEdge()
7466
super.onCreate(savedInstanceState)
7567

7668
WindowCompat.setDecorFitsSystemWindows(window, false)
@@ -95,7 +87,7 @@ class AddCalendarActivity : AppCompatActivity() {
9587
try {
9688
(data ?: getStringExtra(Intent.EXTRA_TEXT))
9789
?.toString()
98-
?.stripUrl()
90+
?.trim()
9991
?.let(subscriptionSettingsModel::setUrl)
10092
?.also {
10193
createSubscriptionModel.checkUrlIntroductionPage(

app/src/main/java/at/bitfire/icsdroid/ui/views/CalendarListActivity.kt

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class CalendarListActivity: AppCompatActivity() {
5555

5656

5757
override fun onCreate(savedInstanceState: Bundle?) {
58+
configureEdgeToEdge()
5859
super.onCreate(savedInstanceState)
5960

6061
// Register the calendar permission request

app/src/main/java/at/bitfire/icsdroid/ui/views/EditCalendarActivity.kt

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class EditCalendarActivity: AppCompatActivity() {
2020
}
2121

2222
override fun onCreate(savedInstanceState: Bundle?) {
23+
configureEdgeToEdge()
2324
super.onCreate(savedInstanceState)
2425
setContentThemed {
2526
EditCalendarScreen(

app/src/main/java/at/bitfire/icsdroid/worker/BaseSyncWorker.kt

+14-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package at.bitfire.icsdroid.worker
33
import android.content.ContentProviderClient
44
import android.content.ContentUris
55
import android.content.Context
6+
import android.os.DeadObjectException
67
import android.util.Log
78
import androidx.work.CoroutineWorker
89
import androidx.work.NetworkType
@@ -112,13 +113,12 @@ open class BaseSyncWorker(
112113
val onlyMigrate = inputData.getBoolean(ONLY_MIGRATE, false)
113114
Log.i(Constants.TAG, "Synchronizing (forceReSync=$forceReSync,onlyMigrate=$onlyMigrate)")
114115

115-
provider =
116-
try {
117-
LocalCalendar.getCalendarProvider(applicationContext)
118-
} catch (e: SecurityException) {
119-
NotificationUtils.showCalendarPermissionNotification(applicationContext)
120-
return Result.failure()
121-
}
116+
provider = try {
117+
LocalCalendar.getCalendarProvider(applicationContext)
118+
} catch (_: SecurityException) {
119+
NotificationUtils.showCalendarPermissionNotification(applicationContext)
120+
return Result.failure()
121+
}
122122

123123
var syncFailed = false
124124

@@ -154,6 +154,12 @@ open class BaseSyncWorker(
154154
syncFailed = true
155155
}
156156
}
157+
} catch (e: DeadObjectException) {
158+
/* May happen when the remote process dies or (since Android 14) when IPC (for instance
159+
with the calendar provider) is suddenly forbidden because our sync process was demoted
160+
from a "service process" to a "cached process". */
161+
Log.e(Constants.TAG, "Received DeadObjectException, retrying.", e)
162+
return Result.retry()
157163
} catch (e: InterruptedException) {
158164
Log.e(Constants.TAG, "Thread interrupted", e)
159165
return Result.retry()
@@ -249,8 +255,7 @@ open class BaseSyncWorker(
249255
"Creating local calendar from subscription #${subscription.id}"
250256
)
251257
// create local calendar
252-
val uri =
253-
AndroidCalendar.create(account, provider, subscription.toCalendarProperties())
258+
val uri = AndroidCalendar.create(account, provider, subscription.toCalendarProperties())
254259
// update calendar ID in DB
255260
val newCalendarId = ContentUris.parseId(uri)
256261
subscriptionsDao.updateCalendarId(subscription.id, newCalendarId)

app/src/test/kotlin/at/bitfire/icsdroid/UrlUtilsTest.kt

-14
This file was deleted.

gradle/libs.versions.toml

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ androidx-test-rules = "1.6.1"
1111
androidx-test-runner = "1.6.2"
1212
androidx-work = "2.10.0"
1313
bitfire-cert4android = "f0964cb"
14-
bitfire-ical4android = "12df9bf"
14+
bitfire-ical4android = "883954c"
1515
compose-dialogs = "1.3.0"
16-
compose-material = "1.7.6"
16+
compose-material = "1.7.7"
1717
compose-material3 = "1.3.1"
18-
compose-runtime = "1.7.6"
19-
compose-ui = "1.7.6"
18+
compose-runtime = "1.7.7"
19+
compose-ui = "1.7.7"
2020
datastore = "1.1.2"
2121
desugaring = "2.1.4"
22-
joda-time = "2.13.0"
22+
joda-time = "2.13.1"
2323
junit = "4.13.2"
24-
kotlin = "2.1.0"
24+
kotlin = "2.1.10"
2525
kotlinx-coroutines = "1.10.1"
26-
ksp = "2.1.0-1.0.29"
26+
ksp = "2.1.10-1.0.29"
2727
okhttp = "4.12.0"
2828
room = "2.6.1"
2929

0 commit comments

Comments
 (0)