diff --git a/lib_service/src/main/java/no/nordicsemi/android/service/BleManagerStatus.kt b/lib_service/src/main/java/no/nordicsemi/android/service/BleManagerStatus.kt index 97dca30c..e57e07e0 100644 --- a/lib_service/src/main/java/no/nordicsemi/android/service/BleManagerStatus.kt +++ b/lib_service/src/main/java/no/nordicsemi/android/service/BleManagerStatus.kt @@ -15,6 +15,7 @@ sealed class BleManagerResult { } } +class IdleResult : BleManagerResult() class ConnectingResult : BleManagerResult() data class SuccessResult(val data: T) : BleManagerResult() diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt index a991dbef..f7e01c80 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.bps.R import no.nordicsemi.android.bps.viewmodel.BPSViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -37,6 +36,7 @@ fun BPSScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt index 820c8e9b..c997ce3f 100644 --- a/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt +++ b/profile_cgms/src/main/java/no/nordicsemi/android/cgms/view/CGMScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.cgms.R import no.nordicsemi.android.cgms.viewmodel.CGMScreenViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -35,6 +34,7 @@ fun CGMScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt index 33774a33..043fc6e2 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.csc.R import no.nordicsemi.android.csc.viewmodel.CSCViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -35,6 +34,7 @@ fun CSCScreen() { when (state.cscManagerState) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.cscManagerState.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(OnDisconnectButtonClick) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt index e39c952b..7b14b62b 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/main/view/GLSScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.gls.R import no.nordicsemi.android.gls.main.viewmodel.GLSViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -37,6 +36,7 @@ fun GLSScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt index 37ae8175..e6b4c883 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSScreen.kt @@ -34,6 +34,7 @@ fun HRSScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt index bf25a839..ad936c8a 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.hts.R import no.nordicsemi.android.hts.viewmodel.HTSViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -35,6 +34,7 @@ fun HTSScreen() { when (state.htsManagerState) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.htsManagerState.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt index ce53534e..c6a85fb6 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreen.kt @@ -12,12 +12,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.prx.R import no.nordicsemi.android.prx.viewmodel.PRXViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -36,6 +35,7 @@ fun PRXScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceOutOfRangeView { viewModel.onEvent(DisconnectEvent) } diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt index 2f18abf2..1b8e23d3 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSScreen.kt @@ -11,12 +11,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.rscs.R import no.nordicsemi.android.rscs.viewmodel.RSCSViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -35,6 +34,7 @@ fun RSCSScreen() { when (state) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.result) { + is IdleResult, is ConnectingResult -> DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } is DisconnectedResult -> DeviceDisconnectedView(Reason.USER, navigateUp) is LinkLossResult -> DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) diff --git a/profile_uart/build.gradle b/profile_uart/build.gradle index cc25b94c..99b1f0dc 100644 --- a/profile_uart/build.gradle +++ b/profile_uart/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'com.google.protobuf' protobuf { protoc { - artifact = 'com.google.protobuf:protoc:3.14.0' + artifact = 'com.google.protobuf:protoc:3.14.0:osx-x86_64' } // Generates the java Protobuf-lite code for the Protobufs in this project. See diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt index 0469820d..07a197c4 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTRepository.kt @@ -10,7 +10,7 @@ import no.nordicsemi.android.ble.ktx.suspend import no.nordicsemi.android.logger.ToolboxLogger import no.nordicsemi.android.logger.ToolboxLoggerFactory import no.nordicsemi.android.service.BleManagerResult -import no.nordicsemi.android.service.ConnectingResult +import no.nordicsemi.android.service.IdleResult import no.nordicsemi.android.service.ServiceManager import no.nordicsemi.android.uart.data.* import javax.inject.Inject @@ -22,14 +22,21 @@ class UARTRepository @Inject internal constructor( private val context: Context, private val serviceManager: ServiceManager, private val configurationDataSource: ConfigurationDataSource, - private val toolboxLoggerFactory: ToolboxLoggerFactory + private val toolboxLoggerFactory: ToolboxLoggerFactory, + private val sp: UARTSharedPrefs ) { private var manager: UARTManager? = null private var logger: ToolboxLogger? = null - private val _data = MutableStateFlow>(ConnectingResult()) + private val _data = MutableStateFlow>(IdleResult()) internal val data = _data.asStateFlow() + var showTutorial: Boolean + get() = sp.showTutorial + set(value) { + sp.showTutorial = value + } + val isRunning = data.map { it.isRunning() } val hasBeenDisconnected = data.map { it.hasBeenDisconnected() } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt new file mode 100644 index 00000000..e1eab714 --- /dev/null +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/repository/UARTSharedPrefs.kt @@ -0,0 +1,20 @@ +package no.nordicsemi.android.uart.repository + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +private const val FILE_NAME = "uart-sp" +private const val SHOW_TUTORIAL_FIELD = "show-tutorial" + +class UARTSharedPrefs @Inject constructor( + @ApplicationContext + private val context: Context +) { + + private val sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE) + + var showTutorial: Boolean + get() = sp.getBoolean(SHOW_TUTORIAL_FIELD, true) + set(value) = sp.edit().putBoolean(SHOW_TUTORIAL_FIELD, value).apply() +} diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/SettingsScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/SettingsScreen.kt new file mode 100644 index 00000000..6aa828f2 --- /dev/null +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/SettingsScreen.kt @@ -0,0 +1,9 @@ +package no.nordicsemi.android.uart.view + +import androidx.compose.runtime.Composable + +@Composable +fun SettingsScreen() { + + +} \ No newline at end of file diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt new file mode 100644 index 00000000..ef78c37d --- /dev/null +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/TutorialScreen.kt @@ -0,0 +1,36 @@ +package no.nordicsemi.android.uart.view + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import no.nordicsemi.android.material.you.Tutorial +import no.nordicsemi.android.uart.R +import no.nordicsemi.android.uart.viewmodel.UARTViewModel + +@Composable +internal fun TutorialScreen(viewModel: UARTViewModel) { + + val page1: @Composable () -> Unit = { + Image( + painter = painterResource(id = R.drawable.tutorial_1), + contentDescription = "", + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize() + ) + } + val page2: @Composable () -> Unit = { + Image( + painter = painterResource(id = R.drawable.tutorial_2), + contentDescription = "", + contentScale = ContentScale.Crop, + modifier = Modifier.fillMaxSize() + ) + } + + Tutorial(listOf(page1, page2)) { + viewModel.onTutorialClose() + } +} diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt index 5fc75aa0..9daeb29a 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTScreen.kt @@ -9,14 +9,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import no.nordicsemi.android.service.* -import no.nordicsemi.android.theme.view.BackIconAppBar import no.nordicsemi.android.theme.view.LoggerIconAppBar -import no.nordicsemi.ui.scanner.ui.DeviceConnectingView -import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.android.uart.R import no.nordicsemi.android.uart.viewmodel.UARTViewModel import no.nordicsemi.android.utils.exhaustive +import no.nordicsemi.ui.scanner.ui.DeviceConnectingView import no.nordicsemi.ui.scanner.ui.DeviceDisconnectedView +import no.nordicsemi.ui.scanner.ui.NoDeviceView import no.nordicsemi.ui.scanner.ui.Reason @Composable @@ -39,13 +38,24 @@ fun UARTScreen() { when (state.uartManagerState) { NoDeviceState -> NoDeviceView() is WorkingState -> when (state.uartManagerState.result) { + is IdleResult, is ConnectingResult -> Scroll { DeviceConnectingView { viewModel.onEvent(DisconnectEvent) } } is DisconnectedResult -> Scroll { DeviceDisconnectedView(Reason.USER, navigateUp) } is LinkLossResult -> Scroll { DeviceDisconnectedView(Reason.LINK_LOSS, navigateUp) } is MissingServiceResult -> Scroll { DeviceDisconnectedView(Reason.MISSING_SERVICE, navigateUp) } is UnknownErrorResult -> Scroll { DeviceDisconnectedView(Reason.UNKNOWN, navigateUp) } - is SuccessResult -> UARTContentView(state.uartManagerState.result.data, state) { viewModel.onEvent(it) } + is SuccessResult -> { +// val i1 = PagerViewEntity( +// listOf( +// PagerViewItem("aaa") { Text("aa") }, +// PagerViewItem("bbb") { Text("bb") } +// ) +// ) +// PagerView(i1) + UARTContentView(state.uartManagerState.result.data, state) { viewModel.onEvent(it) } + } } + TutorialState -> TutorialScreen(viewModel) }.exhaustive } } diff --git a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt index 0c8d4242..4e4eff72 100644 --- a/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt +++ b/profile_uart/src/main/java/no/nordicsemi/android/uart/view/UARTState.kt @@ -29,3 +29,5 @@ internal sealed class HTSManagerState internal data class WorkingState(val result: BleManagerResult) : HTSManagerState() internal object NoDeviceState : HTSManagerState() + +internal object TutorialState : HTSManagerState() 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 83341e93..66133d8c 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 @@ -7,6 +7,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import no.nordicsemi.android.navigation.* +import no.nordicsemi.android.service.IdleResult import no.nordicsemi.android.uart.data.UARTConfiguration import no.nordicsemi.android.uart.data.UARTMacro import no.nordicsemi.android.uart.data.UARTPersistentDataSource @@ -30,12 +31,17 @@ internal class UARTViewModel @Inject constructor( init { viewModelScope.launch { - if (repository.isRunning.firstOrNull() == false) { + if (repository.showTutorial) { + _state.value = _state.value.copy(uartManagerState = TutorialState) + } else if (repository.isRunning.firstOrNull() == false) { requestBluetoothDevice() } } repository.data.onEach { + if (it is IdleResult) { + return@onEach + } _state.value = _state.value.copy(uartManagerState = WorkingState(it)) }.launchIn(viewModelScope) @@ -87,6 +93,16 @@ internal class UARTViewModel @Inject constructor( }.exhaustive } + fun onTutorialClose() { + repository.showTutorial = false + _state.value = _state.value.copy(uartManagerState = NoDeviceState) + viewModelScope.launch { + if (repository.isRunning.firstOrNull() == false) { + requestBluetoothDevice() + } + } + } + private fun onMacroInputSwitch() { _state.value = _state.value.copy(isInputVisible = !state.value.isInputVisible) } diff --git a/profile_uart/src/main/res/drawable/tutorial_1.png b/profile_uart/src/main/res/drawable/tutorial_1.png new file mode 100644 index 00000000..b94d1b79 Binary files /dev/null and b/profile_uart/src/main/res/drawable/tutorial_1.png differ diff --git a/profile_uart/src/main/res/drawable/tutorial_2.png b/profile_uart/src/main/res/drawable/tutorial_2.png new file mode 100644 index 00000000..5e598adb Binary files /dev/null and b/profile_uart/src/main/res/drawable/tutorial_2.png differ