diff --git a/.github/workflows/post_release_cleanup.yml b/.github/workflows/post_release_cleanup.yml index ef101c1c96c..0458f758b63 100644 --- a/.github/workflows/post_release_cleanup.yml +++ b/.github/workflows/post_release_cleanup.yml @@ -31,5 +31,8 @@ jobs: **/*.gradle **/*.gradle.kts title: '${{ inputs.name}} mergeback' - body: 'Auto-generated PR for cleaning up release ${{ inputs.name}}' + body: | + Auto-generated PR for cleaning up release ${{ inputs.name}} + + NO_RELEASE_CHANGE commit-message: 'Post release cleanup for ${{ inputs.name }}' diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/EventGDTLogger.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/EventGDTLogger.kt index 42135f2cd1f..7faf4e17b54 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/EventGDTLogger.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/EventGDTLogger.kt @@ -21,6 +21,7 @@ import com.google.android.datatransport.Encoding import com.google.android.datatransport.Event import com.google.android.datatransport.TransportFactory import com.google.firebase.inject.Provider +import com.google.firebase.sessions.leader.SessionEvent /** * The [EventGDTLoggerInterface] is for testing purposes so that we can mock EventGDTLogger in other diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt index 69dd76d5c31..57821d6b282 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt @@ -25,6 +25,8 @@ import com.google.firebase.ktx.Firebase import com.google.firebase.ktx.app import com.google.firebase.sessions.api.FirebaseSessionsDependencies import com.google.firebase.sessions.api.SessionSubscriber +import com.google.firebase.sessions.follower.SessionMaintainerFollower +import com.google.firebase.sessions.follower.SessionsDataRepository import com.google.firebase.sessions.leader.SessionMaintainerLeader import kotlinx.coroutines.CoroutineDispatcher @@ -40,20 +42,33 @@ internal constructor( blockingDispatcher: CoroutineDispatcher, transportFactoryProvider: Provider, ) { - + private val processDetails: ProcessDetails = AndroidProcessDetails(firebaseApp.applicationContext) private val sessionMaintainer: SessionMaintainer private val tag = "FirebaseSessions" - + private val sessionsDataRepository: SessionsDataRepository init { - // TODO(rothbutter): create a different maintainer based on the characteristics of this process + Log.d(tag, "Initializing data repository") + sessionsDataRepository = SessionsDataRepository(firebaseApp.applicationContext) + + Log.d( + tag, + "Initializing data maintainer. Default process is: ${processDetails.defaultProcessName}" + ) sessionMaintainer = - SessionMaintainerLeader( - firebaseApp, - firebaseInstallations, - backgroundDispatcher, - blockingDispatcher, - transportFactoryProvider - ) + if (AndroidProcessDetails.shouldProcessGenerateNewSession(processDetails)) { + Log.d(tag, "Initializing leader maintainer on process: ${processDetails.processName}") + SessionMaintainerLeader( + firebaseApp, + firebaseInstallations, + backgroundDispatcher, + blockingDispatcher, + transportFactoryProvider, + sessionsDataRepository + ) + } else { + Log.d(tag, "Initializing follower maintainer on process: ${processDetails.processName}") + SessionMaintainerFollower(sessionsDataRepository) + } sessionMaintainer.start(backgroundDispatcher) } diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetails.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetails.kt index 6f808abb876..99f1fd4a752 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetails.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetails.kt @@ -25,11 +25,14 @@ import android.os.Process /** Provides details about the current process. */ internal interface ProcessDetails { - /** Whether the current process is the app's default process or not. */ - val isDefaultProcess: Boolean - /** Whether the current process is running in the foreground or not. */ val isForegroundProcess: Boolean + + /** Name of this process */ + val processName: String? + + /** Name of the default process */ + val defaultProcessName: String } /** Android implementation of [ProcessDetails]. */ @@ -40,18 +43,16 @@ internal class AndroidProcessDetails(context: Context) : ProcessDetails { * This is the app's package name unless the app overrides the android:process attribute in the * application block of its Android manifest file. */ - private val defaultProcessName: String = context.applicationInfo.processName + override val defaultProcessName: String = context.applicationInfo.processName - /** The name of the current process, or null if it couldn't be found. */ - private val currentProcessName: String? = + /** The name of this process, or null if it couldn't be found. */ + override val processName: String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { Application.getProcessName() } else { findProcessName(context, Process.myPid()) } - override val isDefaultProcess: Boolean = currentProcessName == defaultProcessName - override val isForegroundProcess: Boolean get() { val runningAppProcessInfo = RunningAppProcessInfo() @@ -69,6 +70,7 @@ internal class AndroidProcessDetails(context: Context) : ProcessDetails { internal companion object { /** Returns whether the current process should generate a new session or not. */ fun shouldProcessGenerateNewSession(processDetails: ProcessDetails): Boolean = - processDetails.isDefaultProcess && processDetails.isForegroundProcess + (processDetails.processName == processDetails.defaultProcessName) && + processDetails.isForegroundProcess } } diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvents.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvents.kt index 1769c3ab978..0b41ccee0d1 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvents.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvents.kt @@ -21,6 +21,13 @@ import com.google.firebase.FirebaseApp import com.google.firebase.encoders.DataEncoder import com.google.firebase.encoders.json.JsonDataEncoderBuilder import com.google.firebase.sessions.api.SessionSubscriber +import com.google.firebase.sessions.leader.AutoSessionEventEncoder +import com.google.firebase.sessions.leader.DataCollectionState +import com.google.firebase.sessions.leader.DataCollectionStatus +import com.google.firebase.sessions.leader.EventType +import com.google.firebase.sessions.leader.SessionDetails +import com.google.firebase.sessions.leader.SessionEvent +import com.google.firebase.sessions.leader.SessionInfo import com.google.firebase.sessions.settings.SessionsSettings /** Contains functions for [SessionEvent]s. */ diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionMaintainer.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionMaintainer.kt index 0cecefaa8d6..846737d761e 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionMaintainer.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionMaintainer.kt @@ -24,7 +24,7 @@ import kotlinx.coroutines.CoroutineDispatcher * that includes data synchronizing across processes, sending events to our backend, and * broadcasting AQS related events to listeners */ -interface SessionMaintainer { +internal interface SessionMaintainer { /** Register a listener for updates to the session being maintained by this class */ fun register(subscriber: SessionSubscriber) diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionMaintainerFollower.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionMaintainerFollower.kt new file mode 100644 index 00000000000..30733ccf075 --- /dev/null +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionMaintainerFollower.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.sessions.follower + +import android.util.Log +import com.google.firebase.sessions.SessionMaintainer +import com.google.firebase.sessions.api.FirebaseSessionsDependencies +import com.google.firebase.sessions.api.SessionSubscriber +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +internal class SessionMaintainerFollower( + private val sessionsDataRepository: SessionsDataRepository +) : SessionMaintainer { + val tag = "SessionMaintainerFollow" + + override fun register(subscriber: SessionSubscriber) = Unit + + override fun start(backgroundDispatcher: CoroutineDispatcher) { + CoroutineScope(backgroundDispatcher).launch { + sessionsDataRepository.firebaseSessionDataFlow.collect { + if (it.sessionId == null) { + Log.d( + tag, + "No session data available in shared storage." + " subscribers will not be notified." + ) + } else { + Log.d( + tag, + "Follower process has observed a change to the repository and will notify subscribers. New session id is ${it.sessionId}" + ) + notifySubscribers(it.sessionId) + } + } + } + } + + private suspend fun notifySubscribers(sessionId: String) { + val subscribers = FirebaseSessionsDependencies.getRegisteredSubscribers() + if (subscribers.isEmpty()) { + Log.d(tag, "Sessions SDK did not have any subscribers. Events will not be sent.") + } else { + subscribers.values.forEach { subscriber -> + // Notify subscribers, irregardless ;) of sampling and data collection state. + Log.d(tag, "Sending session id $sessionId to subscriber $subscriber.") + subscriber.onSessionChanged(SessionSubscriber.SessionDetails(sessionId)) + } + } + } +} diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionsDataRepository.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionsDataRepository.kt new file mode 100644 index 00000000000..69ae50c1fba --- /dev/null +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/follower/SessionsDataRepository.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2023 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.firebase.sessions.follower + +import android.content.Context +import android.util.Log +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.emptyPreferences +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.map + +internal data class FirebaseSessionsData(val sessionId: String?) + +/** Persists session data that needs to be synchronized across processes */ +internal class SessionsDataRepository(private val context: Context) { + private val tag = "FirebaseSessionsRepo" + + private object FirebaseSessionDataKeys { + val SESSION_ID = stringPreferencesKey("session_id") + } + + val firebaseSessionDataFlow: Flow = + context.dataStore.data + .catch { exception -> + Log.e(tag, "Error reading stored session data.", exception) + emit(emptyPreferences()) + } + .map { preferences -> mapSessionsData(preferences) } + + suspend fun updateSessionId(sessionId: String) { + context.dataStore.edit { preferences -> + preferences[FirebaseSessionDataKeys.SESSION_ID] = sessionId + } + } + + private fun mapSessionsData(preferences: Preferences): FirebaseSessionsData = + FirebaseSessionsData(preferences[FirebaseSessionDataKeys.SESSION_ID]) +} + +private val Context.dataStore: DataStore by + preferencesDataStore(name = "firebase_session_data_repository") diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionCoordinator.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionCoordinator.kt similarity index 94% rename from firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionCoordinator.kt rename to firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionCoordinator.kt index 3cf9f13a3ff..f8a2dfae731 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionCoordinator.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionCoordinator.kt @@ -14,10 +14,11 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import android.util.Log import com.google.firebase.installations.FirebaseInstallationsApi +import com.google.firebase.sessions.EventGDTLoggerInterface import kotlinx.coroutines.tasks.await /** diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvent.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionEvent.kt similarity index 97% rename from firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvent.kt rename to firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionEvent.kt index 1eff07db7fa..5690fc9d2d3 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvent.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionEvent.kt @@ -14,10 +14,11 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import com.google.firebase.encoders.annotations.Encodable import com.google.firebase.encoders.json.NumberedEnum +import com.google.firebase.sessions.ApplicationInfo /** * Contains the relevant information around a Firebase Session Event. diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionGenerator.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionGenerator.kt similarity index 95% rename from firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionGenerator.kt rename to firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionGenerator.kt index b526dc0558d..cf887fbba61 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionGenerator.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionGenerator.kt @@ -14,8 +14,9 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader +import com.google.firebase.sessions.TimeProvider import java.util.UUID /** diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiateListener.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiateListener.kt similarity index 94% rename from firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiateListener.kt rename to firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiateListener.kt index 13d37d91703..d90bd920ee8 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiateListener.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiateListener.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader /** Interface for listening to the initiation of a new session. */ internal interface SessionInitiateListener { diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiator.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiator.kt similarity index 96% rename from firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiator.kt rename to firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiator.kt index 84fbd99c72d..2ce193634f7 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionInitiator.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionInitiator.kt @@ -14,11 +14,12 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle +import com.google.firebase.sessions.TimeProvider import com.google.firebase.sessions.settings.SessionsSettings import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope diff --git a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionMaintainerLeader.kt b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionMaintainerLeader.kt index e316c43717f..5acffa25c54 100644 --- a/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionMaintainerLeader.kt +++ b/firebase-sessions/src/main/kotlin/com/google/firebase/sessions/leader/SessionMaintainerLeader.kt @@ -23,17 +23,13 @@ import com.google.firebase.FirebaseApp import com.google.firebase.inject.Provider import com.google.firebase.installations.FirebaseInstallationsApi import com.google.firebase.sessions.EventGDTLogger -import com.google.firebase.sessions.SessionCoordinator -import com.google.firebase.sessions.SessionDetails import com.google.firebase.sessions.SessionEvents -import com.google.firebase.sessions.SessionGenerator -import com.google.firebase.sessions.SessionInitiateListener -import com.google.firebase.sessions.SessionInitiator import com.google.firebase.sessions.SessionMaintainer import com.google.firebase.sessions.Time import com.google.firebase.sessions.TimeProvider import com.google.firebase.sessions.api.FirebaseSessionsDependencies import com.google.firebase.sessions.api.SessionSubscriber +import com.google.firebase.sessions.follower.SessionsDataRepository import com.google.firebase.sessions.settings.SessionsSettings import kotlinx.coroutines.CoroutineDispatcher @@ -41,12 +37,13 @@ import kotlinx.coroutines.CoroutineDispatcher * Maintainer that will manage the full lifecycle of a session including sending this to our * backend. It will also notify followers when there is a change */ -class SessionMaintainerLeader( +internal class SessionMaintainerLeader( private val firebaseApp: FirebaseApp, firebaseInstallations: FirebaseInstallationsApi, backgroundDispatcher: CoroutineDispatcher, blockingDispatcher: CoroutineDispatcher, transportFactoryProvider: Provider, + private val sessionsDataRepository: SessionsDataRepository, ) : SessionMaintainer { private val applicationInfo = SessionEvents.getApplicationInfo(firebaseApp) @@ -64,7 +61,7 @@ class SessionMaintainerLeader( private val eventGDTLogger = EventGDTLogger(transportFactoryProvider) private val sessionCoordinator = SessionCoordinator(firebaseInstallations, eventGDTLogger) - private val TAG = "SessionMaintainerLeader" + private val tag = "SessionMaintainerLeader" override fun start(backgroundDispatcher: CoroutineDispatcher) { val sessionInitiateListener = @@ -89,12 +86,12 @@ class SessionMaintainerLeader( appContext.registerActivityLifecycleCallbacks(sessionInitiator.activityLifecycleCallbacks) firebaseApp.addLifecycleEventListener { _, _ -> - Log.w(TAG, "FirebaseApp instance deleted. Sessions library will not collect session data.") + Log.w(tag, "FirebaseApp instance deleted. Sessions library will not collect session data.") appContext.unregisterActivityLifecycleCallbacks(sessionInitiator.activityLifecycleCallbacks) } } else { Log.e( - TAG, + tag, "Failed to register lifecycle callbacks, unexpected context ${appContext.javaClass}." ) } @@ -116,7 +113,7 @@ class SessionMaintainerLeader( if (subscribers.isEmpty()) { Log.d( - TAG, + tag, "Sessions SDK did not have any dependent SDKs register as dependencies. Events will not be sent." ) return @@ -128,33 +125,35 @@ class SessionMaintainerLeader( } if (subscribers.values.none { it.isDataCollectionEnabled }) { - Log.d(TAG, "Data Collection is disabled for all subscribers. Skipping this Session Event") + Log.d(tag, "Data Collection is disabled for all subscribers. Skipping this Session Event") return } - Log.d(TAG, "Data Collection is enabled for at least one Subscriber") + Log.d(tag, "Data Collection is enabled for at least one Subscriber") // This will cause remote settings to be fetched if the cache is expired. sessionSettings.updateSettings() if (!sessionSettings.sessionsEnabled) { - Log.d(TAG, "Sessions SDK disabled. Events will not be sent.") + Log.d(tag, "Sessions SDK disabled. Events will not be sent.") return } if (!sessionGenerator.collectEvents) { - Log.d(TAG, "Sessions SDK has dropped this session due to sampling.") + Log.d(tag, "Sessions SDK has dropped this session due to sampling.") return } try { val sessionEvent = SessionEvents.startSession(firebaseApp, sessionDetails, sessionSettings, subscribers) + Log.d(tag, "Writing session id ${sessionEvent.sessionData.sessionId} to repository") + sessionsDataRepository.updateSessionId(sessionEvent.sessionData.sessionId) sessionCoordinator.attemptLoggingSessionEvent(sessionEvent) } catch (ex: IllegalStateException) { // This can happen if the app suddenly deletes the instance of FirebaseApp. Log.w( - TAG, + tag, "FirebaseApp is not initialized. Sessions library will not collect session data.", ex ) diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventEncoderTest.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventEncoderTest.kt index e4173cb89a1..adf16f6a733 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventEncoderTest.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventEncoderTest.kt @@ -22,6 +22,9 @@ import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp import com.google.firebase.sessions.SessionEvents.SESSION_EVENT_ENCODER import com.google.firebase.sessions.api.SessionSubscriber +import com.google.firebase.sessions.leader.EventType +import com.google.firebase.sessions.leader.SessionEvent +import com.google.firebase.sessions.leader.SessionInfo import com.google.firebase.sessions.settings.SessionsSettings import com.google.firebase.sessions.testing.FakeFirebaseApp import com.google.firebase.sessions.testing.FakeSessionSubscriber diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionCoordinatorTest.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionCoordinatorTest.kt similarity index 96% rename from firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionCoordinatorTest.kt rename to firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionCoordinatorTest.kt index fbf17a72083..88351d3fbdc 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionCoordinatorTest.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionCoordinatorTest.kt @@ -14,11 +14,12 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp +import com.google.firebase.sessions.SessionEvents import com.google.firebase.sessions.settings.SessionsSettings import com.google.firebase.sessions.testing.FakeEventGDTLogger import com.google.firebase.sessions.testing.FakeFirebaseApp diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventTest.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionEventTest.kt similarity index 96% rename from firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventTest.kt rename to firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionEventTest.kt index 4ee92f8acc1..9f78c39a14a 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionEventTest.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionEventTest.kt @@ -14,11 +14,12 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import android.os.Bundle import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp +import com.google.firebase.sessions.SessionEvents import com.google.firebase.sessions.settings.LocalOverrideSettings import com.google.firebase.sessions.settings.SessionsSettings import com.google.firebase.sessions.testing.FakeFirebaseApp diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionGeneratorTest.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionGeneratorTest.kt similarity index 99% rename from firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionGeneratorTest.kt rename to firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionGeneratorTest.kt index 59be72ea4b4..10b7c006e4c 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionGeneratorTest.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionGeneratorTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import com.google.common.truth.Truth.assertThat import com.google.firebase.sessions.testing.FakeTimeProvider diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionInitiatorTest.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionInitiatorTest.kt similarity index 99% rename from firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionInitiatorTest.kt rename to firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionInitiatorTest.kt index 891c18796ec..30ec92e090c 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionInitiatorTest.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/leader/SessionInitiatorTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.firebase.sessions +package com.google.firebase.sessions.leader import com.google.common.truth.Truth.assertThat import com.google.firebase.FirebaseApp diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeEventGDTLogger.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeEventGDTLogger.kt index d213f4e8a4c..6e6f3743ba8 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeEventGDTLogger.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeEventGDTLogger.kt @@ -18,7 +18,7 @@ package com.google.firebase.sessions.testing import com.google.firebase.sessions.EventGDTLogger import com.google.firebase.sessions.EventGDTLoggerInterface -import com.google.firebase.sessions.SessionEvent +import com.google.firebase.sessions.leader.SessionEvent /** * The [FakeEventGDTLogger] is for mocking [EventGDTLogger]. diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeProcessDetails.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeProcessDetails.kt index 2e02b2c76dc..56e92f4becb 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeProcessDetails.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeProcessDetails.kt @@ -20,6 +20,7 @@ import com.google.firebase.sessions.ProcessDetails /** Fake implementation of [ProcessDetails] that always returns the provided values. */ class FakeProcessDetails( - override val isDefaultProcess: Boolean = true, override val isForegroundProcess: Boolean = true, + override val processName: String? = "defaultProcessName", + override val defaultProcessName: String = "defaultProcessName" ) : ProcessDetails diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeTransportFactory.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeTransportFactory.kt index da1d273a33f..6d810d7cb02 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeTransportFactory.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/FakeTransportFactory.kt @@ -17,7 +17,7 @@ package com.google.firebase.sessions.testing import com.google.android.datatransport.* -import com.google.firebase.sessions.SessionEvent +import com.google.firebase.sessions.leader.SessionEvent /** Fake [Transport] that implements [send]. */ internal class FakeTransport() : Transport { diff --git a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/TestSessionEventData.kt b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/TestSessionEventData.kt index 964a28cbc98..624f23ec139 100644 --- a/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/TestSessionEventData.kt +++ b/firebase-sessions/src/test/kotlin/com/google/firebase/sessions/testing/TestSessionEventData.kt @@ -22,13 +22,13 @@ import androidx.test.core.app.ApplicationProvider import com.google.firebase.sessions.AndroidApplicationInfo import com.google.firebase.sessions.ApplicationInfo import com.google.firebase.sessions.BuildConfig -import com.google.firebase.sessions.DataCollectionState -import com.google.firebase.sessions.DataCollectionStatus -import com.google.firebase.sessions.EventType import com.google.firebase.sessions.LogEnvironment -import com.google.firebase.sessions.SessionDetails -import com.google.firebase.sessions.SessionEvent -import com.google.firebase.sessions.SessionInfo +import com.google.firebase.sessions.leader.DataCollectionState +import com.google.firebase.sessions.leader.DataCollectionStatus +import com.google.firebase.sessions.leader.EventType +import com.google.firebase.sessions.leader.SessionDetails +import com.google.firebase.sessions.leader.SessionEvent +import com.google.firebase.sessions.leader.SessionInfo internal object TestSessionEventData { const val TEST_SESSION_TIMESTAMP_US: Long = 12340000