From 826f001dd774b4d707a19cf99cef581aba07017e Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Fri, 18 Dec 2020 10:41:40 +0300 Subject: [PATCH] Feature | Sync-status badge (#1195) --- .../anytypeio/anytype/ui/page/PageFragment.kt | 26 +++++++++++++++++-- .../widgets/toolbar/DocumentTopToolbar.kt | 1 + .../src/main/res/drawable/ic_page_more.xml | 19 ++++++++++++++ .../layout/widget_document_top_toolbar.xml | 14 +++++++++- core-ui/src/main/res/values/colors.xml | 4 +++ .../presentation/page/PageViewModel.kt | 5 +++- 6 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 core-ui/src/main/res/drawable/ic_page_more.xml diff --git a/app/src/main/java/com/anytypeio/anytype/ui/page/PageFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/page/PageFragment.kt index f787164b93..d930fc949a 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/page/PageFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/page/PageFragment.kt @@ -5,6 +5,7 @@ import android.animation.ObjectAnimator import android.app.Activity import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.graphics.Point import android.net.Uri import android.os.Build @@ -38,7 +39,9 @@ import androidx.transition.TransitionManager import androidx.transition.TransitionSet import com.anytypeio.anytype.BuildConfig import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_ui.extensions.color import com.anytypeio.anytype.core_ui.extensions.isKeyboardVisible +import com.anytypeio.anytype.core_ui.extensions.tint import com.anytypeio.anytype.core_ui.features.page.BlockAdapter import com.anytypeio.anytype.core_ui.features.page.TurnIntoActionReceiver import com.anytypeio.anytype.core_ui.features.page.scrollandmove.DefaultScrollAndMoveTargetDescriptor @@ -61,6 +64,7 @@ import com.anytypeio.anytype.domain.block.model.Block.Content.Text import com.anytypeio.anytype.domain.common.Id import com.anytypeio.anytype.domain.ext.getFirstLinkMarkupParam import com.anytypeio.anytype.domain.ext.getSubstring +import com.anytypeio.anytype.domain.status.SyncStatus import com.anytypeio.anytype.emojifier.Emojifier import com.anytypeio.anytype.ext.extractMarks import com.anytypeio.anytype.presentation.page.PageViewModel @@ -456,7 +460,8 @@ open class PageFragment : topToolbar.menu .clicks() .onEach { - vm.onDocumentMenuClicked() } + vm.onDocumentMenuClicked() + } .launchIn(lifecycleScope) topToolbar.back.clicks().onEach { @@ -550,6 +555,23 @@ open class PageFragment : .filter { it != PageViewModel.NO_SEARCH_RESULT_POSITION } .onEach { recycler.smoothScrollToPosition(it) } .launchIn(lifecycleScope) + + vm.syncStatus.onEach { status -> bindSyncStatus(status) }.launchIn(lifecycleScope) + } + + private fun bindSyncStatus(status: SyncStatus?) { + when (status) { + SyncStatus.UNKNOWN, SyncStatus.FAILED, SyncStatus.OFFLINE -> topToolbar.status.tint( + color = requireContext().color(R.color.sync_status_red) + ) + SyncStatus.SYNCING -> topToolbar.status.tint( + color = requireContext().color(R.color.sync_status_orange) + ) + SyncStatus.SYNCED -> topToolbar.status.tint( + color = requireContext().color(R.color.sync_status_green) + ) + else -> topToolbar.status.tint(Color.WHITE) + } } override fun onDestroyView() { @@ -832,7 +854,7 @@ open class PageFragment : } private fun render(state: ControlPanelState) { - + if (state.navigationToolbar.isVisible) { placeholder.requestFocus() hideKeyboard() diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/toolbar/DocumentTopToolbar.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/toolbar/DocumentTopToolbar.kt index 8c496c8117..e13b0e2691 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/toolbar/DocumentTopToolbar.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/widgets/toolbar/DocumentTopToolbar.kt @@ -13,6 +13,7 @@ import kotlinx.android.synthetic.main.widget_document_top_toolbar.view.* class DocumentTopToolbar : ConstraintLayout { + val status: View get() = syncStatusBadge val back: View get() = toolbarBackButton val menu: View get() = toolbarMenu val container: FrameLayout get() = toolbarIconContainer diff --git a/core-ui/src/main/res/drawable/ic_page_more.xml b/core-ui/src/main/res/drawable/ic_page_more.xml new file mode 100644 index 0000000000..14ed938218 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_page_more.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/core-ui/src/main/res/layout/widget_document_top_toolbar.xml b/core-ui/src/main/res/layout/widget_document_top_toolbar.xml index c2ac637b17..1d0df37e69 100644 --- a/core-ui/src/main/res/layout/widget_document_top_toolbar.xml +++ b/core-ui/src/main/res/layout/widget_document_top_toolbar.xml @@ -63,9 +63,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" - android:src="@drawable/ic_more" + android:src="@drawable/ic_page_more" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/core-ui/src/main/res/values/colors.xml b/core-ui/src/main/res/values/colors.xml index 3d062bf64c..f2d11c72e7 100644 --- a/core-ui/src/main/res/values/colors.xml +++ b/core-ui/src/main/res/values/colors.xml @@ -1,6 +1,10 @@ + #F55522 + #57C600 + #FFB522 + #2C2B27 #ACA996 #ECD91B diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/page/PageViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/page/PageViewModel.kt index e204156905..7cf2422ec6 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/page/PageViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/page/PageViewModel.kt @@ -46,6 +46,7 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.page.* import com.anytypeio.anytype.domain.page.navigation.GetListPages import com.anytypeio.anytype.domain.status.InterceptThreadStatus +import com.anytypeio.anytype.domain.status.SyncStatus import com.anytypeio.anytype.presentation.BuildConfig import com.anytypeio.anytype.presentation.common.StateReducer import com.anytypeio.anytype.presentation.common.SupportCommand @@ -118,6 +119,8 @@ class PageViewModel( SelectionStateHolder by orchestrator.memory.selections, StateReducer, Event> by reducer { + val syncStatus = MutableStateFlow(null) + val searchResultScrollPosition = MutableStateFlow(NO_SEARCH_RESULT_POSITION) private val session = MutableStateFlow(Session.IDLE) @@ -508,7 +511,7 @@ class PageViewModel( jobs += viewModelScope.launch { interceptThreadStatus .build(InterceptThreadStatus.Params(context)) - .collect { _toasts.send(it.toString()) } + .collect { syncStatus.value = it } } jobs += viewModelScope.launch {