diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 96a0fbbe10..55e3b31a74 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -50,6 +50,11 @@ android {
execution = "ANDROIDX_TEST_ORCHESTRATOR"
// Robolectric 이 병합된 매니페스트·리소스를 읽어야 NavHost 를 실제 컴포지션으로 띄울 수 있다 (#1601).
unitTests.isIncludeAndroidResources = true
+ unitTests.all {
+ // 여러 SDK의 앱 리소스를 읽은 뒤에도 후속 테스트의 샌드박스를 생성할 수 있어야 한다.
+ // 기본 512 MB에서는 API 33 알림 권한 테스트의 리소스 로딩이 OOM으로 실패한다 (#2200).
+ it.maxHeapSize = "1g"
+ }
managedDevices {
localDevices {
create("pixel2Api26") {
diff --git a/app/src/main/res/values-v29/themes.xml b/app/src/main/res/values-v29/themes.xml
new file mode 100644
index 0000000000..4232750e1d
--- /dev/null
+++ b/app/src/main/res/values-v29/themes.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 9b2b71e273..c7475ebf71 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,8 +1,8 @@
-
-
+
+
-
\ No newline at end of file
+
diff --git a/app/src/test/java/com/afternote/afternote_fe/BiometricDialogThemeTest.kt b/app/src/test/java/com/afternote/afternote_fe/BiometricDialogThemeTest.kt
new file mode 100644
index 0000000000..8744dce378
--- /dev/null
+++ b/app/src/test/java/com/afternote/afternote_fe/BiometricDialogThemeTest.kt
@@ -0,0 +1,100 @@
+package com.afternote.afternote_fe
+
+import android.app.Activity
+import android.app.Application
+import android.app.Dialog
+import android.content.Context
+import android.content.DialogInterface
+import android.os.Looper
+import android.util.TypedValue
+import android.widget.Button
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.Robolectric
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows.shadowOf
+import org.robolectric.annotation.Config
+
+/** 실제 앱 테마로 AndroidX 지문 대화상자와 같은 AppCompat dialog를 생성한다. */
+@RunWith(RobolectricTestRunner::class)
+@Config(sdk = [26, 27, 28], application = Application::class)
+class BiometricDialogThemeTest {
+ @Test
+ fun `API26부터 28 앱 테마는 AppCompat 인증 대화상자를 띄우고 닫을 수 있다`() {
+ val controller = Robolectric.buildActivity(Activity::class.java)
+ controller.get().setTheme(R.style.Theme_Afternotefe_Main)
+ controller.setup()
+ val activity = controller.get()
+ var canceled = false
+ val dialog = createAppCompatDialog(activity) { canceled = true }
+
+ try {
+ // 플랫폼 Material 테마만 있으면 show()에서 AppCompat 테마 요구 예외가 발생한다.
+ dialog.show()
+ assertTrue(dialog.isShowing)
+ dialog.findViewById