Skip to content

fix(change-notetype): edge to edge - #22112

Open
criticalAY wants to merge 1 commit into
ankidroid:mainfrom
criticalAY:fix/change-notetype-edge-to-edge
Open

criticalAY wants to merge 1 commit into
ankidroid:mainfrom
criticalAY:fix/change-notetype-edge-to-edge

Conversation

@criticalAY

Copy link
Copy Markdown
Contributor

Note

Assisted-by: Opus 5.5

Purpose / Description

Fixes

How Has This Been Tested?

Before:
image

After:
image

Learning (optional, can help others)

Describe the research stage

Links to blog posts, patterns, libraries or addons used to solve this problem

Checklist

Please, go through these checks before submitting the PR.

  • You have a descriptive commit message with a short title (first line, max 50 chars).
  • You have commented your code, particularly in hard-to-understand areas
  • You have performed a self-review of your own code
  • UI changes: include screenshots of all affected screens (in particular showing any new or changed strings)
  • UI Changes: You have tested your change using the Google Accessibility Scanner

Assisted-by: Opus 5.5
@criticalAY
criticalAY force-pushed the fix/change-notetype-edge-to-edge branch from d866bd0 to e915b43 Compare September 26, 2026 19:53

@david-allison david-allison left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add screenshot tests

This should clean things up a little (untested)

Subject: [PATCH] refactor(change-notetype): simplify insets
---
Index: AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt
--- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt	(revision e915b4331e3b7d7849f08d3de4838afae75bc20a)
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt	(revision ff4ec3087c6269b0347967d3ce1d5052a08f008b)
@@ -28,7 +28,6 @@
 import androidx.core.view.WindowInsetsCompat.Type.systemBars
 import androidx.core.view.isVisible
 import androidx.core.view.updateLayoutParams
-import androidx.core.view.updatePadding
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.viewModels
 import androidx.lifecycle.lifecycleScope
@@ -140,14 +139,9 @@
     }
 
     private fun setupEdgeToEdge(binding: DialogChangeNoteTypeBinding) {
-        ViewCompat.setOnApplyWindowInsetsListener(binding.toolbarContainer) { toolbarContainer, insets ->
+        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
             val bars = insets.getInsets(systemBars() or displayCutout())
-            toolbarContainer.updatePadding(left = bars.left, top = bars.top, right = bars.right)
-            insets
-        }
-        ViewCompat.setOnApplyWindowInsetsListener(binding.changeNoteTypeLayout) { content, insets ->
-            val bars = insets.getInsets(systemBars() or displayCutout())
-            content.updatePadding(left = bars.left, right = bars.right, bottom = bars.bottom)
+            view.setPadding(bars.left, bars.top, bars.right, bars.bottom)
             insets
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
Index: AnkiDroid/src/main/res/layout/dialog_change_note_type.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/AnkiDroid/src/main/res/layout/dialog_change_note_type.xml b/AnkiDroid/src/main/res/layout/dialog_change_note_type.xml
--- a/AnkiDroid/src/main/res/layout/dialog_change_note_type.xml	(revision e915b4331e3b7d7849f08d3de4838afae75bc20a)
+++ b/AnkiDroid/src/main/res/layout/dialog_change_note_type.xml	(revision ff4ec3087c6269b0347967d3ce1d5052a08f008b)
@@ -11,31 +11,25 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <FrameLayout
-        android:id="@+id/toolbar_container"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <com.google.android.material.appbar.MaterialToolbar
-            android:id="@+id/toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:minHeight="?attr/actionBarSize"
-            app:navigationIcon="@drawable/close_icon"
-            app:titleTextAppearance="@style/TextAppearance.AnkiDroid.TopAppBar.Title"
-            tools:title="Change note type">
+    <com.google.android.material.appbar.MaterialToolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?attr/actionBarSize"
+        app:navigationIcon="@drawable/close_icon"
+        app:titleTextAppearance="@style/TextAppearance.AnkiDroid.TopAppBar.Title"
+        tools:title="Change note type">
 
-            <com.google.android.material.button.MaterialButton
-                android:id="@+id/btn_save"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="end"
-                android:layout_marginEnd="8dp"
-                android:text="@string/save"
-                android:visibility="gone"
-                tools:visibility="visible" />
-        </com.google.android.material.appbar.MaterialToolbar>
-    </FrameLayout>
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/btn_save"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="end"
+            android:layout_marginEnd="8dp"
+            android:text="@string/save"
+            android:visibility="gone"
+            tools:visibility="visible" />
+    </com.google.android.material.appbar.MaterialToolbar>
 
     <LinearLayout
         android:id="@+id/change_note_type_loading_layout"
Index: AnkiDroid/src/test/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialogInsetsTest.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialogInsetsTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialogInsetsTest.kt
--- a/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialogInsetsTest.kt	(revision e915b4331e3b7d7849f08d3de4838afae75bc20a)
+++ b/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialogInsetsTest.kt	(revision ff4ec3087c6269b0347967d3ce1d5052a08f008b)
@@ -3,12 +3,10 @@
 package com.ichi2.anki.dialogs
 
 import android.os.Bundle
-import android.view.View
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowCompat
 import androidx.fragment.app.testing.launchFragment
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.ichi2.anki.R
 import com.ichi2.anki.RobolectricTest
 import com.ichi2.anki.dialogs.ChangeNoteTypeDialog.Companion.ARG_NOTE_IDS
 import com.ichi2.anki.settings.enums.DayTheme
@@ -16,7 +14,6 @@
 import com.ichi2.anki.settings.enums.Theme
 import com.ichi2.testutils.windowInsetsOf
 import com.ichi2.themes.Themes
-import com.ichi2.utils.Dp
 import com.ichi2.utils.dp
 import org.hamcrest.MatcherAssert.assertThat
 import org.hamcrest.Matchers.equalTo
@@ -26,30 +23,19 @@
 @RunWith(AndroidJUnit4::class)
 class ChangeNoteTypeDialogInsetsTest : RobolectricTest() {
     @Test
-    fun `toolbar content clears the status bar`() =
-        withDialog { dialog ->
-            dialog.dispatchInsets()
-
-            assertThat(dialog.toolbarContainer.paddingTop, equalTo(24.dp.toPx(targetContext)))
-        }
-
-    @Test
-    fun `toolbar and content clear a side navigation bar and cutout`() =
-        withDialog { dialog ->
-            dialog.dispatchInsets(navBarRight = 48.dp, cutoutLeft = 32.dp)
-
-            for (view in listOf(dialog.toolbarContainer, dialog.content)) {
-                assertThat(view.paddingLeft, equalTo(32.dp.toPx(targetContext)))
-                assertThat(view.paddingRight, equalTo(48.dp.toPx(targetContext)))
-            }
-        }
-
-    @Test
-    fun `content clears the navigation bar`() =
+    fun `dialog clears system bars and cutouts`() =
         withDialog { dialog ->
-            dialog.dispatchInsets(navBarBottom = 48.dp)
+            val insets =
+                with(targetContext) {
+                    windowInsetsOf(navBarBottom = 48.dp, navBarRight = 48.dp, cutoutLeft = 32.dp)
+                }
+            ViewCompat.dispatchApplyWindowInsets(dialog.requireDialog().window!!.decorView, insets)
 
-            assertThat(dialog.content.paddingBottom, equalTo(48.dp.toPx(targetContext)))
+            val root = dialog.requireView()
+            assertThat(root.paddingLeft, equalTo(32.dp.toPx(targetContext)))
+            assertThat(root.paddingTop, equalTo(24.dp.toPx(targetContext)))
+            assertThat(root.paddingRight, equalTo(48.dp.toPx(targetContext)))
+            assertThat(root.paddingBottom, equalTo(48.dp.toPx(targetContext)))
         }
 
     @Test
@@ -64,30 +50,12 @@
             assertThat(dialog.hasLightStatusBars, equalTo(false))
         }
 
-    private val ChangeNoteTypeDialog.toolbarContainer: View
-        get() = requireView().findViewById(R.id.toolbar_container)
-
-    private val ChangeNoteTypeDialog.content: View
-        get() = requireView().findViewById(R.id.change_note_type_layout)
-
     private val ChangeNoteTypeDialog.hasLightStatusBars: Boolean
         get() {
             val window = requireDialog().window!!
             return WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars
         }
 
-    private fun ChangeNoteTypeDialog.dispatchInsets(
-        navBarBottom: Dp = 0.dp,
-        navBarRight: Dp = 0.dp,
-        cutoutLeft: Dp = 0.dp,
-    ) {
-        val insets =
-            with(targetContext) {
-                windowInsetsOf(navBarBottom = navBarBottom, navBarRight = navBarRight, cutoutLeft = cutoutLeft)
-            }
-        ViewCompat.dispatchApplyWindowInsets(requireDialog().window!!.decorView, insets)
-    }
-
     private fun withDialog(
         theme: Theme = DayTheme.LIGHT,
         block: (ChangeNoteTypeDialog) -> Unit,

@david-allison david-allison added the Needs Author Reply Waiting for a reply from the original author label Sep 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs Author Reply Waiting for a reply from the original author Needs Review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement edge to edge for 'Change notetype'

2 participants