@@ -27,6 +27,12 @@ internal data class ExtractedVariant(
2727 val variant : ExperimentVariant ,
2828)
2929
30+ internal data class TriggerContent (
31+ val experimentId : String ,
32+ val kind : ExperimentKind ,
33+ val block : UIBlock ,
34+ )
35+
3036class NotFoundException : Exception (" Not found" )
3137class FailedToDecodeException : Exception (" Failed to decode" )
3238class SkipHttpRequestException : Exception (" Skip http request" )
@@ -53,8 +59,9 @@ internal interface Container {
5359 ): Result <JsonElement >
5460
5561 suspend fun fetchEmbedding (experimentId : String , componentId : String? = null): Result <UIBlock >
56- suspend fun fetchTriggerContent (trigger : String , kinds : List <ExperimentKind >): Result <Pair < ExperimentKind , UIBlock > >
62+ suspend fun fetchTriggerContent (trigger : String , kinds : List <ExperimentKind >): Result <TriggerContent >
5763 suspend fun fetchRemoteConfig (experimentId : String ): Result <ExperimentVariant >
64+ fun appendExperimentHistory (experimentId : String )
5865
5966 fun storeNativeCrash (throwable : Throwable )
6067 fun sendFlutterCrash (crashEvent : TrackCrashEvent )
@@ -182,7 +189,11 @@ internal class ContainerImpl(
182189 variantId = variantId
183190 )
184191 )
185- this .databaseRepository.appendExperimentHistory(extracted.experimentId)
192+ // Tooltip is a Flutter-only flow. Persist tooltip history only after
193+ // Flutter confirms the tooltip actually started rendering.
194+ if (extracted.kind != ExperimentKind .TOOLTIP ) {
195+ this .databaseRepository.appendExperimentHistory(extracted.experimentId)
196+ }
186197 val componentId = extractComponentId(extracted.variant) ? : return Result .failure(NotFoundException ())
187198 val component =
188199 this .componentRepository.fetchComponent(extracted.experimentId, componentId).getOrElse {
@@ -191,7 +202,7 @@ internal class ContainerImpl(
191202 return Result .success(component)
192203 }
193204
194- override suspend fun fetchTriggerContent (trigger : String , kinds : List <ExperimentKind >): Result <Pair < ExperimentKind , UIBlock > > {
205+ override suspend fun fetchTriggerContent (trigger : String , kinds : List <ExperimentKind >): Result <TriggerContent > {
195206 // send the user track event and save it to database
196207 this .trackRepository.trackEvent(TrackUserEvent (trigger))
197208 this .databaseRepository.appendUserEvent(trigger)
@@ -213,13 +224,23 @@ internal class ContainerImpl(
213224 variantId = variantId
214225 )
215226 )
216- this .databaseRepository.appendExperimentHistory(extracted.experimentId)
227+ // Tooltip is a Flutter-only flow. Persist tooltip history only after
228+ // Flutter confirms the tooltip actually started rendering.
229+ if (extracted.kind != ExperimentKind .TOOLTIP ) {
230+ this .databaseRepository.appendExperimentHistory(extracted.experimentId)
231+ }
217232 val componentId = extractComponentId(extracted.variant) ? : return Result .failure(NotFoundException ())
218233 val component =
219234 this .componentRepository.fetchComponent(extracted.experimentId, componentId).getOrElse {
220235 return Result .failure(it)
221236 }
222- return Result .success(extracted.kind to component)
237+ return Result .success(
238+ TriggerContent (
239+ experimentId = extracted.experimentId,
240+ kind = extracted.kind,
241+ block = component,
242+ )
243+ )
223244 }
224245
225246 override suspend fun fetchRemoteConfig (experimentId : String ): Result <ExperimentVariant > {
@@ -241,6 +262,10 @@ internal class ContainerImpl(
241262 return Result .success(extracted.variant)
242263 }
243264
265+ override fun appendExperimentHistory (experimentId : String ) {
266+ this .databaseRepository.appendExperimentHistory(experimentId)
267+ }
268+
244269 private fun extractVariant (
245270 configs : ExperimentConfigs ,
246271 kinds : List <ExperimentKind >,
0 commit comments