From 064814701cf0feec238a43c023cd100186745351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Thu, 28 Apr 2022 16:23:55 +0200 Subject: [PATCH] Add analytics events after successful connection --- .../analytics/{ProfileOpenEvent.kt => Events.kt} | 12 ++++++++++++ profile_bps/build.gradle | 1 + .../nordicsemi/android/bps/viewmodel/BPSViewModel.kt | 10 +++++++++- profile_cgms/build.gradle | 1 + .../android/cgms/viewmodel/CGMViewModel.kt | 10 +++++++++- profile_csc/build.gradle | 1 + .../nordicsemi/android/csc/viewmodel/CSCViewModel.kt | 10 +++++++++- profile_gls/build.gradle | 1 + .../android/gls/main/viewmodel/GLSViewModel.kt | 10 +++++++++- profile_hrs/build.gradle | 1 + .../nordicsemi/android/hrs/viewmodel/HRSViewModel.kt | 10 +++++++++- profile_hts/build.gradle | 1 + .../nordicsemi/android/hts/viewmodel/HTSViewModel.kt | 10 +++++++++- profile_prx/build.gradle | 1 + .../nordicsemi/android/prx/viewmodel/PRXViewModel.kt | 10 +++++++++- profile_rscs/build.gradle | 1 + .../android/rscs/viewmodel/RSCSViewModel.kt | 10 +++++++++- profile_uart/build.gradle | 1 + .../android/uart/viewmodel/UARTViewModel.kt | 10 +++++++++- 19 files changed, 102 insertions(+), 9 deletions(-) rename lib_analytics/src/main/java/no/nordicsemi/android/analytics/{ProfileOpenEvent.kt => Events.kt} (64%) diff --git a/lib_analytics/src/main/java/no/nordicsemi/android/analytics/ProfileOpenEvent.kt b/lib_analytics/src/main/java/no/nordicsemi/android/analytics/Events.kt similarity index 64% rename from lib_analytics/src/main/java/no/nordicsemi/android/analytics/ProfileOpenEvent.kt rename to lib_analytics/src/main/java/no/nordicsemi/android/analytics/Events.kt index c072e2d6..237f9d22 100644 --- a/lib_analytics/src/main/java/no/nordicsemi/android/analytics/ProfileOpenEvent.kt +++ b/lib_analytics/src/main/java/no/nordicsemi/android/analytics/Events.kt @@ -22,3 +22,15 @@ enum class ProfileOpenEvent(override val eventName: String) : AppEvent { DFU("DFU_PROFILE_OPEN"), LOGGER("LOGGER_PROFILE_OPEN"), } + +enum class ProfileConnectedEvent(override val eventName: String) : AppEvent { + BPS("BPS_CONNECTED"), + CGMS("CGMS_CONNECTED"), + CSC("CSC_CONNECTED"), + GLS("GLS_CONNECTED"), + HRS("HRS_CONNECTED"), + HTS("HTS_CONNECTED"), + PRX("PRX_CONNECTED"), + RSCS("RSCS_CONNECTED"), + UART("UART_CONNECTED"), +} diff --git a/profile_bps/build.gradle b/profile_bps/build.gradle index 459d5360..7d90a59b 100644 --- a/profile_bps/build.gradle +++ b/profile_bps/build.gradle @@ -2,6 +2,7 @@ apply from: rootProject.file("library.gradle") apply plugin: 'kotlin-parcelize' dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt index 8ea7928a..13e8fbda 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt @@ -7,10 +7,13 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.bps.data.BPS_SERVICE_UUID import no.nordicsemi.android.bps.repository.BPSRepository import no.nordicsemi.android.bps.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.DiscoveredBluetoothDevice @@ -20,7 +23,8 @@ import javax.inject.Inject @HiltViewModel internal class BPSViewModel @Inject constructor( private val repository: BPSRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -53,6 +57,10 @@ internal class BPSViewModel @Inject constructor( private fun connectDevice(device: DiscoveredBluetoothDevice) { repository.downloadData(device).onEach { _state.value = WorkingState(it) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.BPS) + } }.launchIn(viewModelScope) } } diff --git a/profile_cgms/build.gradle b/profile_cgms/build.gradle index 5a6b3f72..1fa9270c 100644 --- a/profile_cgms/build.gradle +++ b/profile_cgms/build.gradle @@ -6,6 +6,7 @@ android { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt index 9cf47f27..68a7689d 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/viewmodel/CGMViewModel.kt @@ -5,11 +5,14 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.cgms.data.CGMS_SERVICE_UUID import no.nordicsemi.android.cgms.repository.CGMRepository import no.nordicsemi.android.cgms.data.CGMServiceCommand import no.nordicsemi.android.cgms.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -18,7 +21,8 @@ import javax.inject.Inject @HiltViewModel internal class CGMViewModel @Inject constructor( private val repository: CGMRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -33,6 +37,10 @@ internal class CGMViewModel @Inject constructor( repository.data.onEach { _state.value = WorkingState(it) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.CGMS) + } }.launchIn(viewModelScope) } diff --git a/profile_csc/build.gradle b/profile_csc/build.gradle index b5a6c8cd..95e5bcf2 100644 --- a/profile_csc/build.gradle +++ b/profile_csc/build.gradle @@ -2,6 +2,7 @@ apply from: rootProject.file("library.gradle") apply plugin: 'kotlin-parcelize' dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt index ec692fbd..07c9f513 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/viewmodel/CSCViewModel.kt @@ -5,10 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.csc.data.CSC_SERVICE_UUID import no.nordicsemi.android.csc.repository.CSCRepository import no.nordicsemi.android.csc.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -17,7 +20,8 @@ import javax.inject.Inject @HiltViewModel internal class CSCViewModel @Inject constructor( private val repository: CSCRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(CSCViewState()) @@ -32,6 +36,10 @@ internal class CSCViewModel @Inject constructor( repository.data.onEach { _state.value = _state.value.copy(cscManagerState = WorkingState(it)) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.CSC) + } }.launchIn(viewModelScope) } diff --git a/profile_gls/build.gradle b/profile_gls/build.gradle index 4322b8ca..8382e92d 100644 --- a/profile_gls/build.gradle +++ b/profile_gls/build.gradle @@ -6,6 +6,7 @@ android { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt index eb62319b..a23656ed 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/viewmodel/GLSViewModel.kt @@ -4,11 +4,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.gls.GlsDetailsDestinationId import no.nordicsemi.android.gls.repository.GLSRepository import no.nordicsemi.android.gls.data.GLS_SERVICE_UUID import no.nordicsemi.android.gls.main.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.DiscoveredBluetoothDevice @@ -18,7 +21,8 @@ import javax.inject.Inject @HiltViewModel internal class GLSViewModel @Inject constructor( private val repository: GLSRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -54,6 +58,10 @@ internal class GLSViewModel @Inject constructor( private fun connectDevice(device: DiscoveredBluetoothDevice) { repository.downloadData(device).onEach { _state.value = WorkingState(it) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.GLS) + } }.launchIn(viewModelScope) } } diff --git a/profile_hrs/build.gradle b/profile_hrs/build.gradle index 3c89c30f..6cc0298d 100644 --- a/profile_hrs/build.gradle +++ b/profile_hrs/build.gradle @@ -6,6 +6,7 @@ android { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt index b5d8aa90..4c2201de 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/viewmodel/HRSViewModel.kt @@ -5,10 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.hrs.data.HRS_SERVICE_UUID import no.nordicsemi.android.hrs.service.HRSRepository import no.nordicsemi.android.hrs.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -17,7 +20,8 @@ import javax.inject.Inject @HiltViewModel internal class HRSViewModel @Inject constructor( private val repository: HRSRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -33,6 +37,10 @@ internal class HRSViewModel @Inject constructor( repository.data.onEach { val zoomIn = (_state.value as? WorkingState)?.zoomIn ?: false _state.value = WorkingState(it, zoomIn) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.HRS) + } }.launchIn(viewModelScope) } diff --git a/profile_hts/build.gradle b/profile_hts/build.gradle index 735ac727..db875eaf 100644 --- a/profile_hts/build.gradle +++ b/profile_hts/build.gradle @@ -2,6 +2,7 @@ apply from: rootProject.file("library.gradle") apply plugin: 'kotlin-parcelize' dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt index 3e8b63a3..c9503afa 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/viewmodel/HTSViewModel.kt @@ -5,10 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.hts.data.HTS_SERVICE_UUID import no.nordicsemi.android.hts.repository.HTSRepository import no.nordicsemi.android.hts.view.* import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -17,7 +20,8 @@ import javax.inject.Inject @HiltViewModel internal class HTSViewModel @Inject constructor( private val repository: HTSRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(HTSViewState()) @@ -32,6 +36,10 @@ internal class HTSViewModel @Inject constructor( repository.data.onEach { _state.value = _state.value.copy(htsManagerState = WorkingState(it)) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.HTS) + } }.launchIn(viewModelScope) } diff --git a/profile_prx/build.gradle b/profile_prx/build.gradle index 6d940edc..040d27f4 100644 --- a/profile_prx/build.gradle +++ b/profile_prx/build.gradle @@ -6,6 +6,7 @@ android { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt index 4aac1ea3..3dc278df 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt @@ -5,10 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.navigation.* import no.nordicsemi.android.prx.data.PRX_SERVICE_UUID import no.nordicsemi.android.prx.repository.PRXRepository import no.nordicsemi.android.prx.view.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -17,7 +20,8 @@ import javax.inject.Inject @HiltViewModel internal class PRXViewModel @Inject constructor( private val repository: PRXRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -32,6 +36,10 @@ internal class PRXViewModel @Inject constructor( repository.data.onEach { _state.value = WorkingState(it) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.PRX) + } }.launchIn(viewModelScope) } diff --git a/profile_rscs/build.gradle b/profile_rscs/build.gradle index 526911f2..4562a695 100644 --- a/profile_rscs/build.gradle +++ b/profile_rscs/build.gradle @@ -6,6 +6,7 @@ android { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt index 03c00310..a4c4f304 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/viewmodel/RSCSViewModel.kt @@ -5,10 +5,13 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.navigation.* import no.nordicsemi.android.rscs.data.RSCS_SERVICE_UUID import no.nordicsemi.android.rscs.repository.RSCSRepository import no.nordicsemi.android.rscs.view.* +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.utils.exhaustive import no.nordicsemi.android.utils.getDevice import no.nordicsemi.ui.scanner.ScannerDestinationId @@ -17,7 +20,8 @@ import javax.inject.Inject @HiltViewModel internal class RSCSViewModel @Inject constructor( private val repository: RSCSRepository, - private val navigationManager: NavigationManager + private val navigationManager: NavigationManager, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(NoDeviceState) @@ -32,6 +36,10 @@ internal class RSCSViewModel @Inject constructor( repository.data.onEach { _state.value = WorkingState(it) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.RSCS) + } }.launchIn(viewModelScope) } diff --git a/profile_uart/build.gradle b/profile_uart/build.gradle index cc25b94c..41d41506 100644 --- a/profile_uart/build.gradle +++ b/profile_uart/build.gradle @@ -23,6 +23,7 @@ protobuf { } dependencies { + implementation project(":lib_analytics") implementation project(":lib_service") implementation project(":lib_theme") implementation project(":lib_utils") diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt index 690dd5a6..fdbbed75 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/viewmodel/UARTViewModel.kt @@ -6,8 +6,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import no.nordicsemi.android.analytics.AppAnalytics +import no.nordicsemi.android.analytics.ProfileConnectedEvent import no.nordicsemi.android.navigation.* import no.nordicsemi.android.service.IdleResult +import no.nordicsemi.android.service.SuccessResult import no.nordicsemi.android.uart.data.UARTConfiguration import no.nordicsemi.android.uart.data.UARTMacro import no.nordicsemi.android.uart.data.UARTPersistentDataSource @@ -23,7 +26,8 @@ import javax.inject.Inject internal class UARTViewModel @Inject constructor( private val repository: UARTRepository, private val navigationManager: NavigationManager, - private val dataSource: UARTPersistentDataSource + private val dataSource: UARTPersistentDataSource, + private val analytics: AppAnalytics ) : ViewModel() { private val _state = MutableStateFlow(UARTViewState()) @@ -41,6 +45,10 @@ internal class UARTViewModel @Inject constructor( return@onEach } _state.value = _state.value.copy(uartManagerState = WorkingState(it)) + + (it as? SuccessResult)?.let { + analytics.logEvent(ProfileConnectedEvent.UART) + } }.launchIn(viewModelScope) dataSource.getConfigurations().onEach {