1 package com.android.onboarding.bedsteadonboarding.graph 2 3 import com.android.bedstead.nene.utils.Poll 4 import com.android.onboarding.bedsteadonboarding.utils.EventLogUtils.ONBOARDING_EVENT_LOG_TAG 5 import com.android.onboarding.bedsteadonboarding.logcat.LogcatReader 6 import com.android.onboarding.nodes.OnboardingGraph 7 import com.android.onboarding.nodes.OnboardingEvent 8 import java.time.Duration 9 10 /** 11 * Entry point to onboarding graph. Used to query onboarding events. 12 */ 13 class OnboardingGraphProvider(logcatReader: LogcatReader) { 14 15 internal val graph: OnboardingGraph = OnboardingGraph(getOnboardingEvents(logcatReader)) 16 17 /** 18 * Get a [OnboardingGraphQueryBuilder] to iteratively build a query to search for events in the 19 * onboarding graph. 20 */ querynull21 fun query(): OnboardingGraphQueryBuilder { 22 return OnboardingGraphQueryBuilder(this) 23 } 24 25 /** Returns the immutable set of OnboardingEvents read from logs */ getOnboardingEventsnull26 private fun getOnboardingEvents(logcatReader: LogcatReader) = 27 Poll.forValue("Onboarding events") { fetchOnboardingEventsFromLogs(logcatReader) } <lambda>null28 .toMeet { it.isNotEmpty() } 29 .timeout(Duration.ofMinutes(LOG_READ_TIMEOUT_MINUTE)) 30 .errorOnFail("No onboarding event logged after $LOG_READ_TIMEOUT_MINUTE minute(s).") 31 .await() 32 fetchOnboardingEventsFromLogsnull33 private fun fetchOnboardingEventsFromLogs(logcatReader: LogcatReader) : Set<OnboardingEvent> { 34 val onboardingEvents = mutableSetOf<OnboardingEvent>() 35 for (logLines in logcatReader.getFilteredLogs()) { 36 // Is an onboarding graph line containing OnboardingEvent. 37 val encoded = logLines.split("$ONBOARDING_EVENT_LOG_TAG: ")[1] 38 39 // Deserialize and store the OnboardingEvent in-memory. 40 val event = OnboardingEvent.deserialize(encoded) 41 onboardingEvents.add(event) 42 } 43 return onboardingEvents.toSet() 44 } 45 46 companion object { 47 const val LOG_READ_TIMEOUT_MINUTE = 1L 48 } 49 } 50