This commit is contained in:
ganfra 2022-11-22 12:10:45 +01:00
commit bf64c8945a
5 changed files with 51 additions and 10 deletions

View file

@ -7,15 +7,18 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
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.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -61,8 +64,6 @@ fun LoginContent(
onSubmitClicked: () -> Unit = {}, onSubmitClicked: () -> Unit = {},
onLoginWithSuccess: () -> Unit = {}, onLoginWithSuccess: () -> Unit = {},
) { ) {
var login by textFieldState(state.login)
var password by textFieldState(state.password)
Surface(color = MaterialTheme.colorScheme.background) { Surface(color = MaterialTheme.colorScheme.background) {
Box( Box(
modifier = Modifier modifier = Modifier
@ -116,6 +117,7 @@ fun LoginContent(
} }
) )
} }
var login by textFieldState(state.login)
OutlinedTextField( OutlinedTextField(
value = login, value = login,
modifier = Modifier modifier = Modifier
@ -133,6 +135,12 @@ fun LoginContent(
imeAction = ImeAction.Next imeAction = ImeAction.Next
), ),
) )
var passwordVisible by remember { mutableStateOf(false) }
var password by textFieldState(state.password)
if (state.isLoggedIn is Loading) {
// Ensure password is hidden when user submits the form
passwordVisible = false
}
OutlinedTextField( OutlinedTextField(
value = password, value = password,
modifier = Modifier modifier = Modifier
@ -146,11 +154,21 @@ fun LoginContent(
Text(text = "Password") Text(text = "Password")
}, },
isError = isError, isError = isError,
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
trailingIcon = {
val image =
if (passwordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff
val description =
if (passwordVisible) "Hide password" else "Show password"
IconButton(onClick = { passwordVisible = !passwordVisible }) {
Icon(imageVector = image, description)
}
},
keyboardOptions = KeyboardOptions( keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Password, keyboardType = KeyboardType.Password,
imeAction = ImeAction.Done, imeAction = ImeAction.Done,
), ),
visualTransformation = PasswordVisualTransformation(),
keyboardActions = KeyboardActions( keyboardActions = KeyboardActions(
onDone = { onSubmitClicked() } onDone = { onSubmitClicked() }
), ),

View file

@ -1,7 +1,5 @@
package io.element.android.x.features.login package io.element.android.x.features.login
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.airbnb.mvrx.MavericksViewModel import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.Uninitialized
import io.element.android.x.matrix.MatrixInstance import io.element.android.x.matrix.MatrixInstance

View file

@ -1,14 +1,13 @@
package io.element.android.x.features.roomlist package io.element.android.x.features.roomlist
import com.airbnb.mvrx.MavericksViewModel import com.airbnb.mvrx.*
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.ViewModelContext
import io.element.android.x.core.data.parallelMap import io.element.android.x.core.data.parallelMap
import io.element.android.x.designsystem.components.avatar.AvatarData import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.designsystem.components.avatar.AvatarSize import io.element.android.x.designsystem.components.avatar.AvatarSize
import io.element.android.x.features.roomlist.model.MatrixUser import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.features.roomlist.model.RoomListRoomSummary import io.element.android.x.features.roomlist.model.RoomListRoomSummary
import io.element.android.x.features.roomlist.model.RoomListViewState import io.element.android.x.features.roomlist.model.RoomListViewState
import io.element.android.x.features.roomlist.model.createFakePlaceHolders
import io.element.android.x.matrix.MatrixClient import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.MatrixInstance import io.element.android.x.matrix.MatrixInstance
import io.element.android.x.matrix.media.MediaResolver import io.element.android.x.matrix.media.MediaResolver
@ -80,7 +79,19 @@ class RoomListViewModel(
.map(::mapRoomSummaries) .map(::mapRoomSummaries)
.flowOn(Dispatchers.Default) .flowOn(Dispatchers.Default)
.execute { .execute {
copy(rooms = it) copy(
rooms = when {
it is Loading ||
// Note: this second case will prevent to handle correctly the empty case
(it is Success && it().isEmpty()) -> {
// Show fake placeholders to avoid having empty screen
Loading(createFakePlaceHolders())
}
else -> {
it
}
}
)
} }
} }

View file

@ -0,0 +1,13 @@
package io.element.android.x.features.roomlist.model
/**
* Create a list of 16 RoomListRoomSummary placeholders
*/
fun createFakePlaceHolders(): List<RoomListRoomSummary> {
return mutableListOf<RoomListRoomSummary>().apply {
for (i in 0..15) {
add(RoomListRoomSummary.placeholder("\$fakeRoom$i"))
}
}
}

View file

@ -19,6 +19,7 @@ dependencies {
implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material:material") implementation("androidx.compose.material:material")
implementation("androidx.compose.material3:material3") implementation("androidx.compose.material3:material3")
implementation("androidx.compose.material:material-icons-extended")
implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1")
implementation("androidx.activity:activity-compose:1.6.1") implementation("androidx.activity:activity-compose:1.6.1")