Improve (a bit) the devices list UX/UI
This commit is contained in:
parent
a00f51a264
commit
01db856a5d
|
@ -23,12 +23,16 @@ import com.airbnb.mvrx.Success
|
||||||
import com.airbnb.mvrx.Uninitialized
|
import com.airbnb.mvrx.Uninitialized
|
||||||
import im.vector.matrix.android.api.extensions.sortByLastSeen
|
import im.vector.matrix.android.api.extensions.sortByLastSeen
|
||||||
import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo
|
import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo
|
||||||
|
import im.vector.riotx.R
|
||||||
import im.vector.riotx.core.epoxy.errorWithRetryItem
|
import im.vector.riotx.core.epoxy.errorWithRetryItem
|
||||||
import im.vector.riotx.core.epoxy.loadingItem
|
import im.vector.riotx.core.epoxy.loadingItem
|
||||||
import im.vector.riotx.core.error.ErrorFormatter
|
import im.vector.riotx.core.error.ErrorFormatter
|
||||||
|
import im.vector.riotx.core.resources.StringProvider
|
||||||
|
import im.vector.riotx.core.ui.list.genericItemHeader
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class DevicesController @Inject constructor(private val errorFormatter: ErrorFormatter) : EpoxyController() {
|
class DevicesController @Inject constructor(private val errorFormatter: ErrorFormatter,
|
||||||
|
private val stringProvider: StringProvider) : EpoxyController() {
|
||||||
|
|
||||||
var callback: Callback? = null
|
var callback: Callback? = null
|
||||||
private var viewState: DevicesViewState? = null
|
private var viewState: DevicesViewState? = null
|
||||||
|
@ -61,16 +65,53 @@ class DevicesController @Inject constructor(private val errorFormatter: ErrorFor
|
||||||
listener { callback?.retry() }
|
listener { callback?.retry() }
|
||||||
}
|
}
|
||||||
is Success ->
|
is Success ->
|
||||||
devices()
|
buildDevicesList(devices(), state.myDeviceId, state.currentExpandedDeviceId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildDevicesList(devices: List<DeviceInfo>, myDeviceId: String, currentExpandedDeviceId: String?) {
|
||||||
|
// Current device
|
||||||
|
genericItemHeader {
|
||||||
|
id("current")
|
||||||
|
text(stringProvider.getString(R.string.devices_current_device))
|
||||||
|
}
|
||||||
|
|
||||||
|
devices
|
||||||
|
.filter {
|
||||||
|
it.deviceId == myDeviceId
|
||||||
|
}
|
||||||
|
.forEachIndexed { idx, deviceInfo ->
|
||||||
|
deviceItem {
|
||||||
|
id("myDevice$idx")
|
||||||
|
deviceInfo(deviceInfo)
|
||||||
|
currentDevice(true)
|
||||||
|
buttonsVisible(deviceInfo.deviceId == currentExpandedDeviceId)
|
||||||
|
itemClickAction { callback?.onDeviceClicked(deviceInfo) }
|
||||||
|
renameClickAction { callback?.onRenameDevice(deviceInfo) }
|
||||||
|
deleteClickAction { callback?.onDeleteDevice(deviceInfo) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Other devices
|
||||||
|
if (devices.size > 1) {
|
||||||
|
genericItemHeader {
|
||||||
|
id("others")
|
||||||
|
text(stringProvider.getString(R.string.devices_other_devices))
|
||||||
|
}
|
||||||
|
|
||||||
|
devices
|
||||||
|
.filter {
|
||||||
|
it.deviceId != myDeviceId
|
||||||
|
}
|
||||||
// sort before display: most recent first
|
// sort before display: most recent first
|
||||||
.sortByLastSeen()
|
.sortByLastSeen()
|
||||||
.forEachIndexed { idx, deviceInfo ->
|
.forEachIndexed { idx, deviceInfo ->
|
||||||
val isCurrentDevice = deviceInfo.deviceId == state.myDeviceId
|
val isCurrentDevice = deviceInfo.deviceId == myDeviceId
|
||||||
deviceItem {
|
deviceItem {
|
||||||
id("device$idx")
|
id("device$idx")
|
||||||
deviceInfo(deviceInfo)
|
deviceInfo(deviceInfo)
|
||||||
currentDevice(isCurrentDevice)
|
currentDevice(isCurrentDevice)
|
||||||
buttonsVisible(deviceInfo.deviceId == state.currentExpandedDeviceId)
|
buttonsVisible(deviceInfo.deviceId == currentExpandedDeviceId)
|
||||||
itemClickAction { callback?.onDeviceClicked(deviceInfo) }
|
itemClickAction { callback?.onDeviceClicked(deviceInfo) }
|
||||||
renameClickAction { callback?.onRenameDevice(deviceInfo) }
|
renameClickAction { callback?.onRenameDevice(deviceInfo) }
|
||||||
deleteClickAction { callback?.onDeleteDevice(deviceInfo) }
|
deleteClickAction { callback?.onDeleteDevice(deviceInfo) }
|
||||||
|
|
|
@ -60,7 +60,7 @@ class VectorSettingsDevicesFragment @Inject constructor(
|
||||||
waiting_view_status_text.setText(R.string.please_wait)
|
waiting_view_status_text.setText(R.string.please_wait)
|
||||||
waiting_view_status_text.isVisible = true
|
waiting_view_status_text.isVisible = true
|
||||||
devicesController.callback = this
|
devicesController.callback = this
|
||||||
recyclerView.configureWith(devicesController)
|
recyclerView.configureWith(devicesController, showDivider = true)
|
||||||
devicesViewModel.requestErrorLiveData.observeEvent(this) {
|
devicesViewModel.requestErrorLiveData.observeEvent(this) {
|
||||||
displayErrorDialog(it)
|
displayErrorDialog(it)
|
||||||
// Password is maybe not good, for safety measure, reset it here
|
// Password is maybe not good, for safety measure, reset it here
|
||||||
|
|
|
@ -15,5 +15,7 @@
|
||||||
<string name="settings_rageshake_detection_threshold_summary">Shake your phone to test the detection threshold</string>
|
<string name="settings_rageshake_detection_threshold_summary">Shake your phone to test the detection threshold</string>
|
||||||
<string name="rageshake_detected">Shake detected!</string>
|
<string name="rageshake_detected">Shake detected!</string>
|
||||||
<string name="settings">Settings</string>
|
<string name="settings">Settings</string>
|
||||||
|
<string name="devices_current_device">Current device</string>
|
||||||
|
<string name="devices_other_devices">Other devices</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue