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 @@ + + + + - \ 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