Keyboard management on login screen.
This commit is contained in:
		
							parent
							
								
									fc88b881b4
								
							
						
					
					
						commit
						b05d9d0cf3
					
				
					 2 changed files with 32 additions and 4 deletions
				
			
		
							
								
								
									
										2
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/misc.xml
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -79,6 +79,8 @@
 | 
				
			||||||
        <entry key="../../../../../layout/compose-model-1620400432847.xml" value="0.28125" />
 | 
					        <entry key="../../../../../layout/compose-model-1620400432847.xml" value="0.28125" />
 | 
				
			||||||
        <entry key="../../../../../layout/compose-model-1620400507721.xml" value="0.2962962962962963" />
 | 
					        <entry key="../../../../../layout/compose-model-1620400507721.xml" value="0.2962962962962963" />
 | 
				
			||||||
        <entry key="../../../../../layout/compose-model-1620400535629.xml" value="0.16300675675675674" />
 | 
					        <entry key="../../../../../layout/compose-model-1620400535629.xml" value="0.16300675675675674" />
 | 
				
			||||||
 | 
					        <entry key="../../../../../layout/compose-model-1620401962136.xml" value="0.28125" />
 | 
				
			||||||
 | 
					        <entry key="../../../../../layout/compose-model-1620402873003.xml" value="0.28125" />
 | 
				
			||||||
        <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.2898148148148148" />
 | 
					        <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.2898148148148148" />
 | 
				
			||||||
        <entry key="app/src/main/res/drawable/ic_baseline_local_library_24.xml" value="0.25462962962962965" />
 | 
					        <entry key="app/src/main/res/drawable/ic_baseline_local_library_24.xml" value="0.25462962962962965" />
 | 
				
			||||||
        <entry key="app/src/main/res/drawable/ic_google.xml" value="0.2962962962962963" />
 | 
					        <entry key="app/src/main/res/drawable/ic_google.xml" value="0.2962962962962963" />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,11 +4,12 @@ import androidx.compose.foundation.Image
 | 
				
			||||||
import androidx.compose.foundation.clickable
 | 
					import androidx.compose.foundation.clickable
 | 
				
			||||||
import androidx.compose.foundation.layout.*
 | 
					import androidx.compose.foundation.layout.*
 | 
				
			||||||
import androidx.compose.foundation.rememberScrollState
 | 
					import androidx.compose.foundation.rememberScrollState
 | 
				
			||||||
 | 
					import androidx.compose.foundation.text.KeyboardActions
 | 
				
			||||||
 | 
					import androidx.compose.foundation.text.KeyboardOptions
 | 
				
			||||||
import androidx.compose.foundation.verticalScroll
 | 
					import androidx.compose.foundation.verticalScroll
 | 
				
			||||||
import androidx.compose.material.*
 | 
					import androidx.compose.material.*
 | 
				
			||||||
import androidx.compose.material.ButtonDefaults.outlinedButtonColors
 | 
					import androidx.compose.material.ButtonDefaults.outlinedButtonColors
 | 
				
			||||||
import androidx.compose.material.TextFieldDefaults.outlinedTextFieldColors
 | 
					import androidx.compose.material.TextFieldDefaults.outlinedTextFieldColors
 | 
				
			||||||
import androidx.compose.material.TextFieldDefaults.textFieldColors
 | 
					 | 
				
			||||||
import androidx.compose.material.icons.Icons
 | 
					import androidx.compose.material.icons.Icons
 | 
				
			||||||
import androidx.compose.material.icons.sharp.Visibility
 | 
					import androidx.compose.material.icons.sharp.Visibility
 | 
				
			||||||
import androidx.compose.material.icons.sharp.VisibilityOff
 | 
					import androidx.compose.material.icons.sharp.VisibilityOff
 | 
				
			||||||
| 
						 | 
					@ -16,8 +17,12 @@ import androidx.compose.runtime.*
 | 
				
			||||||
import androidx.compose.runtime.livedata.observeAsState
 | 
					import androidx.compose.runtime.livedata.observeAsState
 | 
				
			||||||
import androidx.compose.ui.Alignment
 | 
					import androidx.compose.ui.Alignment
 | 
				
			||||||
import androidx.compose.ui.Modifier
 | 
					import androidx.compose.ui.Modifier
 | 
				
			||||||
 | 
					import androidx.compose.ui.focus.FocusRequester
 | 
				
			||||||
 | 
					import androidx.compose.ui.focus.focusRequester
 | 
				
			||||||
 | 
					import androidx.compose.ui.platform.LocalFocusManager
 | 
				
			||||||
import androidx.compose.ui.res.painterResource
 | 
					import androidx.compose.ui.res.painterResource
 | 
				
			||||||
import androidx.compose.ui.res.stringResource
 | 
					import androidx.compose.ui.res.stringResource
 | 
				
			||||||
 | 
					import androidx.compose.ui.text.input.ImeAction
 | 
				
			||||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
 | 
					import androidx.compose.ui.text.input.PasswordVisualTransformation
 | 
				
			||||||
import androidx.compose.ui.text.input.VisualTransformation
 | 
					import androidx.compose.ui.text.input.VisualTransformation
 | 
				
			||||||
import androidx.compose.ui.tooling.preview.Preview
 | 
					import androidx.compose.ui.tooling.preview.Preview
 | 
				
			||||||
| 
						 | 
					@ -63,17 +68,24 @@ fun LoginScreenComposable(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Spacer(modifier = Modifier.weight(1f))
 | 
					        Spacer(modifier = Modifier.weight(1f))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        val focusRequester = remember { FocusRequester() }
 | 
				
			||||||
 | 
					        val localFocus = LocalFocusManager.current
 | 
				
			||||||
        LoginField(
 | 
					        LoginField(
 | 
				
			||||||
            viewModel = authenticationViewModel,
 | 
					            viewModel = authenticationViewModel,
 | 
				
			||||||
            modifier = Modifier
 | 
					            modifier = Modifier
 | 
				
			||||||
                .fillMaxWidth()
 | 
					                .fillMaxWidth()
 | 
				
			||||||
                .padding(bottom = 16.dp)
 | 
					                .padding(bottom = 16.dp),
 | 
				
			||||||
 | 
					            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
 | 
				
			||||||
 | 
					            keyboardActions = KeyboardActions { focusRequester.requestFocus() }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        PasswordField(
 | 
					        PasswordField(
 | 
				
			||||||
            viewModel = authenticationViewModel,
 | 
					            viewModel = authenticationViewModel,
 | 
				
			||||||
            modifier = Modifier
 | 
					            modifier = Modifier
 | 
				
			||||||
                .fillMaxWidth()
 | 
					                .fillMaxWidth()
 | 
				
			||||||
                .padding(bottom = 16.dp)
 | 
					                .padding(bottom = 16.dp)
 | 
				
			||||||
 | 
					                .focusRequester(focusRequester),
 | 
				
			||||||
 | 
					            keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
 | 
				
			||||||
 | 
					            keyboardActions = KeyboardActions { localFocus.clearFocus() }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        CredentialRemember(
 | 
					        CredentialRemember(
 | 
				
			||||||
            viewModel = authenticationViewModel,
 | 
					            viewModel = authenticationViewModel,
 | 
				
			||||||
| 
						 | 
					@ -122,7 +134,12 @@ fun LoginScreenComposable(
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Composable
 | 
					@Composable
 | 
				
			||||||
private fun LoginField(viewModel: AuthenticationViewModel, modifier: Modifier = Modifier) {
 | 
					private fun LoginField(
 | 
				
			||||||
 | 
					    viewModel: AuthenticationViewModel,
 | 
				
			||||||
 | 
					    modifier: Modifier = Modifier,
 | 
				
			||||||
 | 
					    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
 | 
				
			||||||
 | 
					    keyboardActions: KeyboardActions = KeyboardActions(),
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
    val login: State<String?> = viewModel.login.observeAsState()
 | 
					    val login: State<String?> = viewModel.login.observeAsState()
 | 
				
			||||||
    TextField(
 | 
					    TextField(
 | 
				
			||||||
        modifier = modifier,
 | 
					        modifier = modifier,
 | 
				
			||||||
| 
						 | 
					@ -132,11 +149,18 @@ private fun LoginField(viewModel: AuthenticationViewModel, modifier: Modifier =
 | 
				
			||||||
        colors = outlinedTextFieldColors(),
 | 
					        colors = outlinedTextFieldColors(),
 | 
				
			||||||
        maxLines = 1,
 | 
					        maxLines = 1,
 | 
				
			||||||
        singleLine = true,
 | 
					        singleLine = true,
 | 
				
			||||||
 | 
					        keyboardOptions = keyboardOptions,
 | 
				
			||||||
 | 
					        keyboardActions = keyboardActions,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Composable
 | 
					@Composable
 | 
				
			||||||
private fun PasswordField(viewModel: AuthenticationViewModel, modifier: Modifier = Modifier) {
 | 
					private fun PasswordField(
 | 
				
			||||||
 | 
					    viewModel: AuthenticationViewModel,
 | 
				
			||||||
 | 
					    modifier: Modifier = Modifier,
 | 
				
			||||||
 | 
					    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
 | 
				
			||||||
 | 
					    keyboardActions: KeyboardActions = KeyboardActions(),
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
    val password = viewModel.password.observeAsState()
 | 
					    val password = viewModel.password.observeAsState()
 | 
				
			||||||
    var passwordVisibility by remember { mutableStateOf(false) }
 | 
					    var passwordVisibility by remember { mutableStateOf(false) }
 | 
				
			||||||
    TextField(
 | 
					    TextField(
 | 
				
			||||||
| 
						 | 
					@ -156,6 +180,8 @@ private fun PasswordField(viewModel: AuthenticationViewModel, modifier: Modifier
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        keyboardOptions = keyboardOptions,
 | 
				
			||||||
 | 
					        keyboardActions = keyboardActions,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue