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 {