Skip to content

Commit c933078

Browse files
committed
Revert changes in sessions to fireperf-aqs
1 parent d75b095 commit c933078

File tree

19 files changed

+752
-688
lines changed

19 files changed

+752
-688
lines changed

firebase-sessions/CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
# Unreleased
2-
* [changed] Use multi-process DataStore instead of Preferences DataStore
2+
33

44
# 2.1.0
55
* [changed] Add warning for known issue b/328687152
66
* [changed] Use Dagger for dependency injection
77
* [changed] Updated datastore dependency to v1.1.3 to
88
fix [CVE-2024-7254](https://github.com/advisories/GHSA-735f-pc8j-v9w8).
99

10+
11+
## Kotlin
12+
The Kotlin extensions library transitively includes the updated
13+
`firebase-sessions` library. The Kotlin extensions library has no additional
14+
updates.
15+
1016
# 2.0.9
1117
* [fixed] Make AQS resilient to background init in multi-process apps.
1218

19+
20+
## Kotlin
21+
The Kotlin extensions library transitively includes the updated
22+
`firebase-sessions` library. The Kotlin extensions library has no additional
23+
updates.
24+
1325
# 2.0.7
1426
* [fixed] Removed extraneous logs that risk leaking internal identifiers.
1527

firebase-sessions/firebase-sessions.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ plugins {
2121
id("firebase-vendor")
2222
id("kotlin-android")
2323
id("kotlin-kapt")
24-
id("kotlinx-serialization")
2524
}
2625

2726
firebaseLibrary {
@@ -77,8 +76,7 @@ dependencies {
7776
implementation("com.google.android.datatransport:transport-api:3.2.0")
7877
implementation(libs.javax.inject)
7978
implementation(libs.androidx.annotation)
80-
implementation(libs.androidx.datastore)
81-
implementation(libs.kotlinx.serialization.json)
79+
implementation(libs.androidx.datastore.preferences)
8280

8381
vendor(libs.dagger.dagger) { exclude(group = "javax.inject", module = "javax.inject") }
8482

firebase-sessions/src/androidTest/kotlin/com/google/firebase/sessions/FirebaseSessionsTests.kt

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@ import androidx.test.core.app.ApplicationProvider
2020
import androidx.test.ext.junit.runners.AndroidJUnit4
2121
import com.google.common.truth.Truth.assertThat
2222
import com.google.firebase.Firebase
23+
import com.google.firebase.FirebaseApp
2324
import com.google.firebase.FirebaseOptions
2425
import com.google.firebase.initialize
2526
import com.google.firebase.sessions.settings.SessionsSettings
26-
import org.junit.BeforeClass
27+
import org.junit.After
28+
import org.junit.Before
2729
import org.junit.Test
2830
import org.junit.runner.RunWith
2931

@@ -34,6 +36,23 @@ import org.junit.runner.RunWith
3436
*/
3537
@RunWith(AndroidJUnit4::class)
3638
class FirebaseSessionsTests {
39+
@Before
40+
fun setUp() {
41+
Firebase.initialize(
42+
ApplicationProvider.getApplicationContext(),
43+
FirebaseOptions.Builder()
44+
.setApplicationId(APP_ID)
45+
.setApiKey(API_KEY)
46+
.setProjectId(PROJECT_ID)
47+
.build()
48+
)
49+
}
50+
51+
@After
52+
fun cleanUp() {
53+
FirebaseApp.clearInstancesForTest()
54+
}
55+
3756
@Test
3857
fun firebaseSessionsDoesInitialize() {
3958
assertThat(FirebaseSessions.instance).isNotNull()
@@ -50,18 +69,5 @@ class FirebaseSessionsTests {
5069
private const val APP_ID = "1:1:android:1a"
5170
private const val API_KEY = "API-KEY-API-KEY-API-KEY-API-KEY-API-KEY"
5271
private const val PROJECT_ID = "PROJECT-ID"
53-
54-
@BeforeClass
55-
@JvmStatic
56-
fun setUp() {
57-
Firebase.initialize(
58-
ApplicationProvider.getApplicationContext(),
59-
FirebaseOptions.Builder()
60-
.setApplicationId(APP_ID)
61-
.setApiKey(API_KEY)
62-
.setProjectId(PROJECT_ID)
63-
.build(),
64-
)
65-
}
6672
}
6773
}

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessionsComponent.kt

Lines changed: 26 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,37 @@ package com.google.firebase.sessions
1818

1919
import android.content.Context
2020
import android.util.Log
21-
import androidx.datastore.core.DataMigration
2221
import androidx.datastore.core.DataStore
23-
import androidx.datastore.core.DataStoreFactory
24-
import androidx.datastore.core.MultiProcessDataStoreFactory
25-
import androidx.datastore.core.Serializer
2622
import androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
27-
import androidx.datastore.dataStoreFile
23+
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
24+
import androidx.datastore.preferences.core.Preferences
25+
import androidx.datastore.preferences.core.emptyPreferences
26+
import androidx.datastore.preferences.preferencesDataStoreFile
2827
import com.google.android.datatransport.TransportFactory
2928
import com.google.firebase.FirebaseApp
3029
import com.google.firebase.annotations.concurrent.Background
3130
import com.google.firebase.annotations.concurrent.Blocking
3231
import com.google.firebase.inject.Provider
3332
import com.google.firebase.installations.FirebaseInstallationsApi
33+
import com.google.firebase.sessions.ProcessDetailsProvider.getProcessName
3434
import com.google.firebase.sessions.settings.CrashlyticsSettingsFetcher
3535
import com.google.firebase.sessions.settings.LocalOverrideSettings
3636
import com.google.firebase.sessions.settings.RemoteSettings
3737
import com.google.firebase.sessions.settings.RemoteSettingsFetcher
38-
import com.google.firebase.sessions.settings.SessionConfigs
39-
import com.google.firebase.sessions.settings.SessionConfigsSerializer
4038
import com.google.firebase.sessions.settings.SessionsSettings
41-
import com.google.firebase.sessions.settings.SettingsCache
42-
import com.google.firebase.sessions.settings.SettingsCacheImpl
4339
import com.google.firebase.sessions.settings.SettingsProvider
4440
import dagger.Binds
4541
import dagger.BindsInstance
4642
import dagger.Component
4743
import dagger.Module
4844
import dagger.Provides
49-
import java.io.File
5045
import javax.inject.Qualifier
5146
import javax.inject.Singleton
5247
import kotlin.coroutines.CoroutineContext
53-
import kotlinx.coroutines.CoroutineScope
48+
49+
@Qualifier internal annotation class SessionConfigsDataStore
50+
51+
@Qualifier internal annotation class SessionDetailsDataStore
5452

5553
@Qualifier internal annotation class LocalOverrideSettingsProvider
5654

@@ -121,8 +119,6 @@ internal interface FirebaseSessionsComponent {
121119
@RemoteSettingsProvider
122120
fun remoteSettings(impl: RemoteSettings): SettingsProvider
123121

124-
@Binds @Singleton fun settingsCache(impl: SettingsCacheImpl): SettingsCache
125-
126122
companion object {
127123
private const val TAG = "FirebaseSessions"
128124

@@ -137,67 +133,30 @@ internal interface FirebaseSessionsComponent {
137133

138134
@Provides
139135
@Singleton
140-
fun sessionConfigsDataStore(
141-
appContext: Context,
142-
@Blocking blockingDispatcher: CoroutineContext,
143-
): DataStore<SessionConfigs> =
144-
createDataStore(
145-
serializer = SessionConfigsSerializer,
136+
@SessionConfigsDataStore
137+
fun sessionConfigsDataStore(appContext: Context): DataStore<Preferences> =
138+
PreferenceDataStoreFactory.create(
146139
corruptionHandler =
147140
ReplaceFileCorruptionHandler { ex ->
148-
Log.w(TAG, "CorruptionException in session configs DataStore", ex)
149-
SessionConfigsSerializer.defaultValue
150-
},
151-
scope = CoroutineScope(blockingDispatcher),
152-
produceFile = { appContext.dataStoreFile("aqs/sessionConfigsDataStore.data") },
153-
)
141+
Log.w(TAG, "CorruptionException in settings DataStore in ${getProcessName()}.", ex)
142+
emptyPreferences()
143+
}
144+
) {
145+
appContext.preferencesDataStoreFile(SessionDataStoreConfigs.SETTINGS_CONFIG_NAME)
146+
}
154147

155148
@Provides
156149
@Singleton
157-
fun sessionDataStore(
158-
appContext: Context,
159-
@Blocking blockingDispatcher: CoroutineContext,
160-
): DataStore<SessionData> =
161-
createDataStore(
162-
serializer = SessionDataSerializer,
150+
@SessionDetailsDataStore
151+
fun sessionDetailsDataStore(appContext: Context): DataStore<Preferences> =
152+
PreferenceDataStoreFactory.create(
163153
corruptionHandler =
164154
ReplaceFileCorruptionHandler { ex ->
165-
Log.w(TAG, "CorruptionException in session data DataStore", ex)
166-
SessionDataSerializer.defaultValue
167-
},
168-
scope = CoroutineScope(blockingDispatcher),
169-
produceFile = { appContext.dataStoreFile("aqs/sessionDataStore.data") },
170-
)
171-
172-
private fun <T> createDataStore(
173-
serializer: Serializer<T>,
174-
corruptionHandler: ReplaceFileCorruptionHandler<T>,
175-
migrations: List<DataMigration<T>> = listOf(),
176-
scope: CoroutineScope,
177-
produceFile: () -> File,
178-
): DataStore<T> =
179-
if (loadDataStoreSharedCounter()) {
180-
MultiProcessDataStoreFactory.create(
181-
serializer,
182-
corruptionHandler,
183-
migrations,
184-
scope,
185-
produceFile,
186-
)
187-
} else {
188-
DataStoreFactory.create(serializer, corruptionHandler, migrations, scope, produceFile)
189-
}
190-
191-
/** This native library in unavailable in some conditions, for example, Robolectric tests */
192-
// TODO(mrober): Remove this when b/392626815 is resolved
193-
private fun loadDataStoreSharedCounter(): Boolean =
194-
try {
195-
System.loadLibrary("datastore_shared_counter")
196-
true
197-
} catch (_: UnsatisfiedLinkError) {
198-
false
199-
} catch (_: SecurityException) {
200-
false
155+
Log.w(TAG, "CorruptionException in sessions DataStore in ${getProcessName()}.", ex)
156+
emptyPreferences()
157+
}
158+
) {
159+
appContext.preferencesDataStoreFile(SessionDataStoreConfigs.SESSIONS_CONFIG_NAME)
201160
}
202161
}
203162
}

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessionsRegistrar.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.google.firebase.sessions
1919
import android.content.Context
2020
import android.util.Log
2121
import androidx.annotation.Keep
22-
import androidx.datastore.core.MultiProcessDataStoreFactory
22+
import androidx.datastore.preferences.preferencesDataStore
2323
import com.google.android.datatransport.TransportFactory
2424
import com.google.firebase.FirebaseApp
2525
import com.google.firebase.annotations.concurrent.Background
@@ -84,7 +84,7 @@ internal class FirebaseSessionsRegistrar : ComponentRegistrar {
8484

8585
init {
8686
try {
87-
MultiProcessDataStoreFactory.javaClass
87+
::preferencesDataStore.javaClass
8888
} catch (ex: NoClassDefFoundError) {
8989
Log.w(
9090
TAG,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright 2023 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.firebase.sessions
18+
19+
import android.util.Base64
20+
import com.google.firebase.sessions.settings.SessionsSettings
21+
22+
/**
23+
* Util object for handling DataStore<Preferences> configs in multi-process apps safely.
24+
*
25+
* This can be removed when datastore-preferences:1.1.0 becomes stable.
26+
*/
27+
internal object SessionDataStoreConfigs {
28+
/** Sanitized process name to use in config filenames. */
29+
private val PROCESS_NAME =
30+
Base64.encodeToString(
31+
ProcessDetailsProvider.getProcessName().encodeToByteArray(),
32+
Base64.NO_WRAP or Base64.URL_SAFE, // URL safe is also filename safe.
33+
)
34+
35+
/** Config name for [SessionDatastore] */
36+
val SESSIONS_CONFIG_NAME = "firebase_session_${PROCESS_NAME}_data"
37+
38+
/** Config name for [SessionsSettings] */
39+
val SETTINGS_CONFIG_NAME = "firebase_session_${PROCESS_NAME}_settings"
40+
}

0 commit comments

Comments
 (0)