Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d2499d5
DROID-3805 refactoring part 1
konstantiniiv Jul 3, 2025
02ede22
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Aug 5, 2025
cf37bfe
DROID-3805 import
konstantiniiv Aug 5, 2025
30f0428
DROID-3805 icon background
konstantiniiv Aug 5, 2025
3619916
DROID-3805 icon update
konstantiniiv Aug 5, 2025
6046563
DROID-3805 object basic header refactoring
konstantiniiv Aug 5, 2025
985a7f5
DROID-3805 title icon fixes
konstantiniiv Aug 5, 2025
7d7046a
DROID-3805 task header update
konstantiniiv Aug 5, 2025
6552cf0
DROID-3805 profile title
konstantiniiv Aug 5, 2025
5ddf6bb
DROID-3805 icon fixes
konstantiniiv Aug 5, 2025
d2d4d47
DROID-3805 top icons fixes
konstantiniiv Aug 5, 2025
3e99409
DROID-3805 fix
konstantiniiv Aug 5, 2025
b84caa0
DROID-3805 fix
konstantiniiv Aug 5, 2025
1f7832c
DROID-3805 edge to edge fixes
konstantiniiv Aug 5, 2025
f02f01f
DROID-3805 top bar color
konstantiniiv Aug 5, 2025
c9de04a
DROID-3805 fix
konstantiniiv Aug 5, 2025
7f19bbb
DROID-3805 title icon preview
konstantiniiv Aug 5, 2025
b2b7fce
DROID-3805 fix
konstantiniiv Aug 5, 2025
23b0fe2
DROID-3805 legacy
konstantiniiv Aug 5, 2025
3a0fd21
DROID-3805 legacy
konstantiniiv Aug 5, 2025
126b53b
DROID-3805 legacy
konstantiniiv Aug 5, 2025
77de14d
DROID-3805 fixes
konstantiniiv Aug 5, 2025
338e06a
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Aug 6, 2025
7634378
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Aug 12, 2025
2b93093
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Aug 13, 2025
9b3ae6b
DROID-3805 fix
konstantiniiv Aug 13, 2025
ec54ee4
DROID-3805 object fragment
konstantiniiv Aug 13, 2025
83e9c8d
DROID-3805 object prototype
konstantiniiv Aug 14, 2025
08a69f2
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Aug 20, 2025
2dd5c13
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Sep 1, 2025
2a9b42f
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Sep 4, 2025
b380599
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Sep 8, 2025
aad7efb
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Sep 20, 2025
07c49ed
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Oct 7, 2025
7a8f999
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Oct 15, 2025
957086d
DROID-3805 Merge branch 'main' into droid-3805-editor-page-icon-refac…
konstantiniiv Oct 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
267 changes: 200 additions & 67 deletions app/src/main/java/com/anytypeio/anytype/ui/editor/EditorFragment.kt

Large diffs are not rendered by default.

175 changes: 175 additions & 0 deletions app/src/main/java/com/anytypeio/anytype/ui/objects/ObjectFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
package com.anytypeio.anytype.ui.objects

import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.PopupMenu
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.anytypeio.anytype.R
import com.anytypeio.anytype.databinding.FragmentObjectBinding

class ObjectFragment : Fragment(R.layout.fragment_object) {

private var _binding: FragmentObjectBinding? = null
private val binding get() = _binding!!

private var lightStatusBars: Boolean = true
private var coverVisible: Boolean = true
private var imePaddingEnabled: Boolean = true
private var lastInsets: WindowInsetsCompat? = null

override fun onViewCreated(view: android.view.View, savedInstanceState: android.os.Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = FragmentObjectBinding.bind(view)

// Temporary: show recycler to verify layout
// --- Demo Recycler for refactor bring-up ---
val demoAdapter = DemoAdapter()
binding.recycler.adapter = demoAdapter
binding.recycler.visibility = View.VISIBLE
demoAdapter.submitList(
listOf(
"Title block",
"Paragraph block",
"Checklist block",
"Code block",
"Divider",
"Callout",
"Quote"
)
)

// Enable edge-to-edge for system bars
val window = requireActivity().window
androidx.core.view.WindowCompat.setDecorFitsSystemWindows(window, false)

// Make status bar icons dark on light backgrounds (toggle as needed when testing)
val controller = androidx.core.view.WindowInsetsControllerCompat(window, binding.root)
controller.isAppearanceLightStatusBars = true

binding.topEdgeCover.setBackgroundColor(Color.parseColor("#FF00AA")) // magenta
binding.topEdgeCover.visibility = if (coverVisible) View.VISIBLE else View.GONE

// Apply WindowInsets to size the top cover to the status bar height and
// provide bottom padding for the sheet (recycler + toolbars) vs nav/IME.
androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
val status = insets.getInsets(androidx.core.view.WindowInsetsCompat.Type.statusBars())
val nav = insets.getInsets(androidx.core.view.WindowInsetsCompat.Type.navigationBars())
val ime = insets.getInsets(androidx.core.view.WindowInsetsCompat.Type.ime())

// Extend topToolbar to include status bar area
binding.topToolbar.updateLayoutParams<ConstraintLayout.LayoutParams> {
height += status.top
}
// Add top padding to topToolbar content to push it below status bar
binding.topToolbar.setPadding(
binding.topToolbar.paddingLeft,
status.top,
binding.topToolbar.paddingRight,
binding.topToolbar.paddingBottom
)

// Pad the content bottom by the largest of nav bar or IME
val bottom = maxOf(nav.bottom, ime.bottom)
binding.sheet.setPadding(
binding.sheet.paddingLeft,
binding.sheet.paddingTop,
binding.sheet.paddingRight,
bottom
)

insets
}

//testing
binding.debugFab.setOnClickListener { view ->
val popup = PopupMenu(requireContext(), view)
popup.menu.add(0, 1, 0, "Light status bars: toggle")
popup.menu.add(0, 2, 1, "Top cover: show/hide")
popup.menu.add(0, 3, 2, "Top cover: randomize color")
popup.menu.add(0, 4, 3, "Bottom padding: toggle IME/nav")

popup.setOnMenuItemClickListener { item ->
when (item.itemId) {
1 -> {
lightStatusBars = !lightStatusBars
val controller = WindowInsetsControllerCompat(requireActivity().window, binding.root)
controller.isAppearanceLightStatusBars = lightStatusBars
true
}
2 -> {
coverVisible = !coverVisible
binding.topEdgeCover.visibility = if (coverVisible) View.VISIBLE else View.GONE
true
}
3 -> {
val rnd = kotlin.random.Random(System.currentTimeMillis())
val color = android.graphics.Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
binding.topEdgeCover.setBackgroundColor(color)
true
}
4 -> {
imePaddingEnabled = !imePaddingEnabled
// re-apply latest insets immediately
lastInsets?.let { insets ->
val nav = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
val bottom = if (imePaddingEnabled) maxOf(nav.bottom, ime.bottom) else 0
binding.sheet.setPadding(
binding.sheet.paddingLeft,
binding.sheet.paddingTop,
binding.sheet.paddingRight,
bottom
)
}
true
}
else -> false
}
}
popup.show()
}
}

override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}


// --- Minimal demo adapter to visualize the refactored layout ---
private class DemoAdapter : ListAdapter<String, DemoVH>(DIFF) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DemoVH {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_block_title, parent, false)
return DemoVH(view)
}

override fun onBindViewHolder(holder: DemoVH, position: Int) {
holder.bind(getItem(position))
}

companion object {
private val DIFF = object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(oldItem: String, newItem: String) = oldItem === newItem
override fun areContentsTheSame(oldItem: String, newItem: String) = oldItem == newItem
}
}
}

private class DemoVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(title: String) {
// `item_block_title` is assumed to contain a TextView with id `title`
itemView.findViewById<TextView>(com.anytypeio.anytype.R.id.title)?.text = title
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,7 @@ open class ObjectSetFragment :
binding.topToolbar.root.findViewById<TextView>(R.id.tvTopToolbarTitle).text = header.title.text

binding.objectHeader.root.findViewById<ViewGroup>(R.id.docEmojiIconContainer).apply {
if (header.title.emoji != null) visible() else gone()
//if (header.title.emoji != null) visible() else gone()
jobs += this.clicks()
.throttleFirst()
.onEach { vm.onObjectIconClicked() }
Expand All @@ -914,8 +914,8 @@ open class ObjectSetFragment :
}
}

binding.objectHeader.root.findViewById<ImageView>(R.id.emojiIcon)
.setEmojiOrNull(header.title.emoji)
// binding.objectHeader.root.findViewById<ImageView>(R.id.emojiIcon)
// .setEmojiOrNull(header.title.emoji)

setCover(
coverColor = header.title.coverColor,
Expand All @@ -941,15 +941,15 @@ open class ObjectSetFragment :

private fun setupHeaderMargins(header: SetOrCollectionHeaderState.Default) {
when {
header.title.emoji != null -> {
title.updateLayoutParams<LinearLayout.LayoutParams> {
topMargin = dimen(R.dimen.dp_12)
}
binding.objectHeader.docEmojiIconContainer.updateLayoutParams<FrameLayout.LayoutParams> {
topMargin =
if (!header.title.hasCover) dimen(R.dimen.dp_12) else dimen(R.dimen.dp_72)
}
}
// header.title.emoji != null -> {
// title.updateLayoutParams<LinearLayout.LayoutParams> {
// topMargin = dimen(R.dimen.dp_12)
// }
// binding.objectHeader.docEmojiIconContainer.updateLayoutParams<FrameLayout.LayoutParams> {
// topMargin =
// if (!header.title.hasCover) dimen(R.dimen.dp_12) else dimen(R.dimen.dp_72)
// }
// }
header.title.image != null -> {
title.updateLayoutParams<LinearLayout.LayoutParams> {
topMargin = dimen(R.dimen.dp_10)
Expand Down
12 changes: 1 addition & 11 deletions app/src/main/res/layout/fragment_editor.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
android:layout_width="0dp"
android:layout_height="48dp"
android:background="@color/defaultCanvasColor"
android:translationY="-48dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Expand Down Expand Up @@ -99,16 +99,6 @@
app:layout_constraintStart_toStartOf="parent"
tools:visibility="visible" />

<com.anytypeio.anytype.core_ui.widgets.ScrollAndMoveHintWidget
android:id="@+id/scrollAndMoveHint"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/defaultCanvasColor"
android:translationY="-48dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.anytypeio.anytype.core_ui.widgets.ScrollAndMoveActionWidget
android:id="@+id/scrollAndMoveBottomAction"
android:layout_width="match_parent"
Expand Down
Loading