@@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.calculateStartPadding
1414import androidx.compose.foundation.layout.displayCutoutPadding
1515import androidx.compose.foundation.layout.fillMaxSize
1616import androidx.compose.foundation.layout.fillMaxWidth
17+ import androidx.compose.foundation.layout.height
1718import androidx.compose.foundation.layout.padding
1819import androidx.compose.foundation.pager.HorizontalPager
1920import androidx.compose.foundation.pager.rememberPagerState
@@ -48,6 +49,7 @@ import androidx.compose.runtime.Composable
4849import androidx.compose.runtime.LaunchedEffect
4950import androidx.compose.runtime.rememberCoroutineScope
5051import androidx.compose.ui.Modifier
52+ import androidx.compose.ui.draw.alpha
5153import androidx.compose.ui.platform.LocalLayoutDirection
5254import androidx.compose.ui.res.stringResource
5355import androidx.compose.ui.text.font.FontFamily
@@ -108,6 +110,7 @@ private fun GetEventScreen(
108110) {
109111 val pagerState = rememberPagerState(pageCount = { 2 })
110112 val scope = rememberCoroutineScope()
113+ val isExpertModeEnabled = state.expertModeStatus == ExpertModeStatus .ENABLED
111114 val selectedTab = if (pagerState.currentPage == 0 ) GetEventTab .INFO else GetEventTab .EVENTS
112115 val hasOutputForSelectedTab = when (selectedTab) {
113116 GetEventTab .INFO -> state.deviceInfoOutput.isNotEmpty()
@@ -129,67 +132,69 @@ private fun GetEventScreen(
129132 bottomBar = {
130133 BottomAppBar (
131134 floatingActionButton = {
132- if (state.expertModeStatus == ExpertModeStatus .ENABLED ) {
133- val containerColor = if (refreshButtonState == RefreshButtonState .STOP ) {
134- MaterialTheme .colorScheme.errorContainer
135- } else {
136- MaterialTheme .colorScheme.primaryContainer
137- }
138- val contentColor = if (refreshButtonState == RefreshButtonState .STOP ) {
139- MaterialTheme .colorScheme.onErrorContainer
140- } else {
141- MaterialTheme .colorScheme.onPrimaryContainer
142- }
143- FloatingActionButton (
144- onClick = {
145- if (selectedTab == GetEventTab .INFO ) {
146- onRefreshDeviceInfoClick()
147- } else {
148- if (! state.isRecording) {
149- scope.launch { pagerState.animateScrollToPage(1 ) }
150- }
151- onToggleRecordClick()
135+ val containerColor = if (refreshButtonState == RefreshButtonState .STOP ) {
136+ MaterialTheme .colorScheme.errorContainer
137+ } else {
138+ MaterialTheme .colorScheme.primaryContainer
139+ }
140+ val contentColor = if (refreshButtonState == RefreshButtonState .STOP ) {
141+ MaterialTheme .colorScheme.onErrorContainer
142+ } else {
143+ MaterialTheme .colorScheme.onPrimaryContainer
144+ }
145+ FloatingActionButton (
146+ modifier = if (isExpertModeEnabled) Modifier else Modifier .alpha(0.5f ),
147+ onClick = {
148+ if (! isExpertModeEnabled) {
149+ return @FloatingActionButton
150+ }
151+ if (selectedTab == GetEventTab .INFO ) {
152+ onRefreshDeviceInfoClick()
153+ } else {
154+ if (! state.isRecording) {
155+ scope.launch { pagerState.animateScrollToPage(1 ) }
152156 }
157+ onToggleRecordClick()
158+ }
159+ },
160+ containerColor = containerColor,
161+ contentColor = contentColor,
162+ elevation = FloatingActionButtonDefaults .bottomAppBarFabElevation(),
163+ ) {
164+ AnimatedContent (
165+ targetState = refreshButtonState,
166+ transitionSpec = {
167+ fadeIn(animationSpec = tween(200 )) togetherWith
168+ fadeOut(animationSpec = tween(200 ))
153169 },
154- containerColor = containerColor,
155- contentColor = contentColor,
156- elevation = FloatingActionButtonDefaults .bottomAppBarFabElevation(),
157- ) {
158- AnimatedContent (
159- targetState = refreshButtonState,
160- transitionSpec = {
161- fadeIn(animationSpec = tween(200 )) togetherWith
162- fadeOut(animationSpec = tween(200 ))
163- },
164- label = " refresh_button_state" ,
165- ) { buttonState ->
166- when (buttonState) {
167- RefreshButtonState .REFRESH_INFO -> {
168- Icon (
169- imageVector = Icons .Outlined .Refresh ,
170- contentDescription = stringResource(
171- R .string.debug_getevent_refresh,
172- ),
173- )
174- }
170+ label = " refresh_button_state" ,
171+ ) { buttonState ->
172+ when (buttonState) {
173+ RefreshButtonState .REFRESH_INFO -> {
174+ Icon (
175+ imageVector = Icons .Outlined .Refresh ,
176+ contentDescription = stringResource(
177+ R .string.debug_getevent_refresh,
178+ ),
179+ )
180+ }
175181
176- RefreshButtonState .START_RECORDING -> {
177- Icon (
178- imageVector = Icons .Rounded .FiberManualRecord ,
179- contentDescription = stringResource(
180- R .string.debug_getevent_start_recording,
181- ),
182- )
183- }
182+ RefreshButtonState .START_RECORDING -> {
183+ Icon (
184+ imageVector = Icons .Rounded .FiberManualRecord ,
185+ contentDescription = stringResource(
186+ R .string.debug_getevent_start_recording,
187+ ),
188+ )
189+ }
184190
185- RefreshButtonState .STOP -> {
186- Icon (
187- imageVector = Icons .Rounded .Stop ,
188- contentDescription = stringResource(
189- R .string.debug_getevent_stop_recording,
190- ),
191- )
192- }
191+ RefreshButtonState .STOP -> {
192+ Icon (
193+ imageVector = Icons .Rounded .Stop ,
194+ contentDescription = stringResource(
195+ R .string.debug_getevent_stop_recording,
196+ ),
197+ )
193198 }
194199 }
195200 }
@@ -247,39 +252,38 @@ private fun GetEventScreen(
247252 .padding(16 .dp),
248253 onSetupExpertModeClick = onSetupExpertModeClick,
249254 )
250- } else {
251- PrimaryTabRow (
252- selectedTabIndex = pagerState.targetPage,
253- modifier = Modifier .fillMaxWidth(),
254- contentColor = MaterialTheme .colorScheme.onSurface,
255- ) {
256- Tab (
257- selected = pagerState.targetPage == 0 ,
258- onClick = { scope.launch { pagerState.animateScrollToPage(0 ) } },
259- text = { Text (stringResource(R .string.debug_getevent_tab_info)) },
260- )
261- Tab (
262- selected = pagerState.targetPage == 1 ,
263- onClick = { scope.launch { pagerState.animateScrollToPage(1 ) } },
264- text = { Text (stringResource(R .string.debug_getevent_tab_events)) },
265- )
266- }
255+ }
256+ PrimaryTabRow (
257+ selectedTabIndex = pagerState.targetPage,
258+ modifier = Modifier .fillMaxWidth(),
259+ contentColor = MaterialTheme .colorScheme.onSurface,
260+ ) {
261+ Tab (
262+ selected = pagerState.targetPage == 0 ,
263+ onClick = { scope.launch { pagerState.animateScrollToPage(0 ) } },
264+ text = { Text (stringResource(R .string.debug_getevent_tab_info)) },
265+ )
266+ Tab (
267+ selected = pagerState.targetPage == 1 ,
268+ onClick = { scope.launch { pagerState.animateScrollToPage(1 ) } },
269+ text = { Text (stringResource(R .string.debug_getevent_tab_events)) },
270+ )
271+ }
267272
268- HorizontalPager (
269- modifier = Modifier .fillMaxSize(),
270- state = pagerState,
271- ) { pageIndex ->
272- when (pageIndex) {
273- 0 -> InfoContent (
274- modifier = Modifier .fillMaxSize(),
275- state = state,
276- )
273+ HorizontalPager (
274+ modifier = Modifier .fillMaxSize(),
275+ state = pagerState,
276+ ) { pageIndex ->
277+ when (pageIndex) {
278+ 0 -> InfoContent (
279+ modifier = Modifier .fillMaxSize(),
280+ state = state,
281+ )
277282
278- 1 -> EventsContent (
279- modifier = Modifier .fillMaxSize(),
280- state = state,
281- )
282- }
283+ 1 -> EventsContent (
284+ modifier = Modifier .fillMaxSize(),
285+ state = state,
286+ )
283287 }
284288 }
285289 }
@@ -315,7 +319,8 @@ private fun ExpertModeSetupCard(
315319private fun InfoContent (modifier : Modifier = Modifier , state : GetEventViewModel .State ) {
316320 Column (modifier = modifier) {
317321 if (state.isLoadingDeviceInfo) {
318- LinearProgressIndicator (modifier = Modifier .fillMaxWidth())
322+ Spacer (Modifier .height(16 .dp))
323+ LinearProgressIndicator (modifier = Modifier .fillMaxWidth().padding(horizontal = 16 .dp))
319324 }
320325
321326 if (state.deviceInfoOutput.isNotEmpty()) {
@@ -352,7 +357,13 @@ private fun EventsContent(modifier: Modifier = Modifier, state: GetEventViewMode
352357
353358 Column (modifier = modifier) {
354359 if (state.isRecording) {
355- LinearProgressIndicator (modifier = Modifier .fillMaxWidth())
360+ Spacer (Modifier .height(16 .dp))
361+ LinearProgressIndicator (modifier = Modifier .fillMaxWidth().padding(horizontal = 16 .dp))
362+ Text (
363+ modifier = Modifier .padding(horizontal = 16 .dp, vertical = 8 .dp),
364+ text = stringResource(R .string.debug_getevent_events_output_after_recording),
365+ style = MaterialTheme .typography.bodySmall,
366+ )
356367 }
357368
358369 if (state.recordingOutput.isNotEmpty()) {
@@ -454,19 +465,6 @@ private fun PreviewRecording() {
454465 }
455466}
456467
457- @Preview
458- @Composable
459- private fun PreviewEventsContentEmptyIdle () {
460- KeyMapperTheme {
461- GetEventScreen (
462- state = GetEventViewModel .State (
463- isRecording = false ,
464- expertModeStatus = ExpertModeStatus .ENABLED ,
465- ),
466- )
467- }
468- }
469-
470468@Preview
471469@Composable
472470private fun PreviewEventsContentOutputIdle () {
0 commit comments