Fix showing empty view in mobile device view (#407)

This commit is contained in:
Rafał Borcz 2019-06-07 19:03:26 +02:00 committed by Mikołaj Pich
parent ba6fb1a4b9
commit 58d5e4da0e
6 changed files with 68 additions and 27 deletions

View File

@ -35,10 +35,18 @@ class MobileDeviceRepository @Inject constructor(
}
fun unregisterDevice(semester: Semester, device: MobileDevice): Single<Boolean> {
return remote.unregisterDevice(semester, device)
return ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
if (it) remote.unregisterDevice(semester, device)
else Single.error(UnknownHostException())
}
}
fun getToken(semester: Semester): Single<MobileDeviceToken> {
return remote.getToken(semester)
return ReactiveNetwork.checkInternetConnectivity(settings)
.flatMap {
if (it) remote.getToken(semester)
else Single.error(UnknownHostException())
}
}
}

View File

@ -6,5 +6,5 @@ import io.github.wulkanowy.data.db.entities.MobileDevice
class MobileDeviceAdapter<T : IFlexible<*>> : FlexibleAdapter<T>(null, null, true) {
var onDeviceUnregisterListener: (MobileDevice, position: Int) -> Unit = { _, _ -> }
var onDeviceUnregisterListener: (device: MobileDevice, position: Int) -> Unit = { _, _ -> }
}

View File

@ -8,10 +8,10 @@ import android.view.View.VISIBLE
import android.view.ViewGroup
import eu.davidea.flexibleadapter.common.FlexibleItemDecoration
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import eu.davidea.flexibleadapter.helpers.EmptyViewHelper
import eu.davidea.flexibleadapter.helpers.UndoHelper
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.MobileDevice
import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.ui.modules.main.MainView
@ -48,7 +48,7 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi
}
override fun initView() {
mobileDevicesRecycler.run {
with(mobileDevicesRecycler) {
layoutManager = SmoothScrollLinearLayoutManager(context)
adapter = devicesAdapter
addItemDecoration(FlexibleItemDecoration(context)
@ -56,37 +56,43 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi
.withDrawDividerOnLastItem(false)
)
}
EmptyViewHelper.create(devicesAdapter, mobileDevicesEmpty)
with(devicesAdapter) {
isPermanentDelete = false
onDeviceUnregisterListener = presenter::onUnregisterDevice
}
mobileDevicesSwipe.setOnRefreshListener { presenter.onSwipeRefresh() }
mobileDeviceAddButton.setOnClickListener { presenter.onRegisterDevice() }
devicesAdapter.run {
isPermanentDelete = false
onDeviceUnregisterListener = { device, position ->
val onActionListener = object : UndoHelper.OnActionListener {
override fun onActionConfirmed(action: Int, event: Int) {
presenter.onUnregister(device)
}
override fun onActionCanceled(action: Int, positions: MutableList<Int>?) {
devicesAdapter.restoreDeletedItems()
}
}
UndoHelper(devicesAdapter, onActionListener)
.withConsecutive(false)
.withAction(UndoHelper.Action.REMOVE)
.start(listOf(position), mobileDevicesRecycler, R.string.mobile_device_removed, R.string.all_undo, 3000)
}
}
}
override fun updateData(data: List<MobileDeviceItem>) {
devicesAdapter.updateDataSet(data)
}
override fun restoreDeleteItem() {
devicesAdapter.restoreDeletedItems()
}
override fun clearData() {
devicesAdapter.clear()
}
override fun showUndo(position: Int, device: MobileDevice) {
val onActionListener = object : UndoHelper.OnActionListener {
override fun onActionConfirmed(action: Int, event: Int) {
presenter.onUnregisterConfirmed(device)
}
override fun onActionCanceled(action: Int, positions: MutableList<Int>?) {
presenter.onUnregisterCancelled()
}
}
UndoHelper(devicesAdapter, onActionListener)
.withConsecutive(false)
.withAction(UndoHelper.Action.REMOVE)
.start(listOf(position), mobileDevicesRecycler, R.string.mobile_device_removed, R.string.all_undo, 3000)
}
override fun hideRefresh() {
mobileDevicesSwipe.isRefreshing = false
}
@ -95,6 +101,10 @@ class MobileDeviceFragment : BaseFragment(), MobileDeviceView, MainView.TitledVi
mobileDevicesProgress.visibility = if (show) VISIBLE else GONE
}
override fun showEmpty(show: Boolean) {
mobileDevicesEmpty.visibility = if (show) VISIBLE else GONE
}
override fun enableSwipe(enable: Boolean) {
mobileDevicesSwipe.isEnabled = enable
}

View File

@ -50,6 +50,7 @@ class MobileDevicePresenter @Inject constructor(
view?.run {
updateData(it)
showContent(it.isNotEmpty())
showEmpty(it.isEmpty())
}
analytics.logEvent("load_devices", "items" to it.size, "force_refresh" to forceRefresh)
}) {
@ -62,13 +63,27 @@ class MobileDevicePresenter @Inject constructor(
view?.showTokenDialog()
}
fun onUnregister(device: MobileDevice) {
fun onUnregisterDevice(device: MobileDevice, position: Int) {
view?.run {
showUndo(position, device)
showEmpty(isViewEmpty)
}
}
fun onUnregisterCancelled() {
view?.run {
restoreDeleteItem()
showEmpty(isViewEmpty)
}
}
fun onUnregisterConfirmed(device: MobileDevice) {
Timber.i("Unregister device started")
disposable.add(studentRepository.getCurrentStudent()
.flatMap { semesterRepository.getCurrentSemester(it) }
.flatMap { semester ->
mobileDeviceRepository.unregisterDevice(semester, device)
.flatMap { mobileDeviceRepository.getDevices(semester, it) }
.flatMap { mobileDeviceRepository.getDevices(semester, it) }
}
.map { items -> items.map { MobileDeviceItem(it) } }
.subscribeOn(schedulers.backgroundThread)
@ -84,6 +99,7 @@ class MobileDevicePresenter @Inject constructor(
view?.run {
updateData(it)
showContent(it.isNotEmpty())
showEmpty(it.isEmpty())
}
}) {
Timber.i("Unregister device result: An exception occurred")

View File

@ -1,5 +1,6 @@
package io.github.wulkanowy.ui.modules.mobiledevice
import io.github.wulkanowy.data.db.entities.MobileDevice
import io.github.wulkanowy.ui.base.BaseView
interface MobileDeviceView : BaseView {
@ -10,6 +11,8 @@ interface MobileDeviceView : BaseView {
fun updateData(data: List<MobileDeviceItem>)
fun restoreDeleteItem()
fun hideRefresh()
fun clearData()
@ -20,5 +23,9 @@ interface MobileDeviceView : BaseView {
fun showContent(show: Boolean)
fun showEmpty(show: Boolean)
fun showUndo(position: Int, device: MobileDevice)
fun showTokenDialog()
}

View File

@ -20,7 +20,7 @@
android:gravity="center"
android:orientation="vertical"
android:padding="10dp"
android:alpha="0.0">
android:visibility="gone">
<TextView
android:layout_width="wrap_content"