Os dispositivos dobráveis têm recursos e funções únicos que exigem testes especializados. Teste o app em dispositivos dobráveis de tela pequena e grande, dobrados e desdobrados, nas orientações de retrato e paisagem, nas posturas de mesa e livro, e no modo de várias janelas. Consulte as diretrizes de qualidade de apps para telas grandes para ver mais informações.
FoldingFeature
A biblioteca Jetpack WindowManager notifica o app quando há uma mudança na posição de um dispositivo dobrável para que você possa modificar o layout dele.
O artefato window-testing
inclui a regra JUnit4
WindowLayoutInfoPublisherRule
,
que possibilita a publicação de uma
WindowInfoLayout
para
simular um FoldingFeature
nos testes.
Para testar o status de um recurso dobrável, primeiro defina uma classe e as regras:
Kotlin
import androidx.window.layout.FoldingFeature.Orientation.Companion.HORIZONTAL import androidx.window.layout.FoldingFeature.Orientation.Companion.VERTICAL import androidx.window.layout.FoldingFeature.State.Companion.FLAT import androidx.window.layout.FoldingFeature.State.Companion.HALF_OPENED import androidx.window.testing.layout.FoldingFeature import androidx.window.testing.layout.TestWindowLayoutInfo import androidx.window.testing.layout.WindowLayoutInfoPublisherRule @RunWith(AndroidJUnit4::class) class DisplayFeaturesActivityTest { private val activityRule = ActivityScenarioRule(DisplayFeaturesActivity::class.java) private val publisherRule = WindowLayoutInfoPublisherRule() @get:Rule val testRule: TestRule init { testRule = RuleChain.outerRule(publisherRule).around(activityRule) } @Test myTest() { // TODO } }
Java
import static androidx.window.layout.FoldingFeature.Orientation.HORIZONTAL; import static androidx.window.layout.FoldingFeature.Orientation.VERTICAL; import static androidx.window.layout.FoldingFeature.State.FLAT; import static androidx.window.layout.FoldingFeature.State.HALF_OPENED; import static androidx.window.testing.layout.DisplayFeatureTesting.createFoldingFeature; import static androidx.window.testing.layout.WindowLayoutInfoTesting.createWindowLayoutInfo; import androidx.window.layout.FoldingFeature; import androidx.window.layout.WindowLayoutInfo; import androidx.window.testing.layout.WindowLayoutInfoPublisherRule; @RunWith(AndroidJUnit4.class) public class DisplayFeaturesActivityJavaTest { private WindowLayoutInfoPublisherRule publisherRule = new WindowLayoutInfoPublisherRule(); @Rule public TestRule testRule; public DisplayFeaturesActivityJavaTest() { testRule = RuleChain.outerRule(publisherRule).around(activityRule); }; @Test public void myTest() { // TODO } }
Em seguida, você pode simular um recurso dobrável, como uma tela dobrável meio aberta com uma dobra horizontal centralizada de largura zero:
Kotlin
val feature = FoldingFeature( activity = activity, state = HALF_OPENED, orientation = HORIZONTAL) val expected = TestWindowLayoutInfo(listOf(feature))
Java
FoldingFeature feature = createFoldingFeature( activity, -1, 0, HALF_OPENED, HORIZONTAL); WindowLayoutInfo expected = createWindowLayoutInfo( Collections.singletonList(feature) );
Depois disso, use a WindowLayoutInfoPublisherRule
para publicar a
WindowLayoutInfo
personalizada:
Kotlin
@Test myTest() { ... publisherRule.overrideWindowLayoutInfo(expected) ... }
Java
@Test public void myTest() { ... publisherRule.overrideWindowLayoutInfo(expected); ... }
Por fim, confira se o layout da atividade se comporta conforme o esperado usando os matchers do Espresso disponíveis.
O exemplo a seguir simula um FoldingFeature
com uma
articulação vertical
HALF_OPENED
no centro da tela e usa um matcher para confirmar se o
layout está de acordo com o esperado:
Kotlin
@Test fun testDeviceOpen_Vertical() { activityRule.scenario.onActivity { activity -> val feature = FoldingFeature( activity = activity, state = HALF_OPENED, orientation = VERTICAL) val expected = TestWindowLayoutInfo(listOf(feature)) publisherRule.overrideWindowLayoutInfo(expected) } // Checks that start_layout is on the left of end_layout with a vertical folding feature. onView(withId(R.id.start_layout)) .check(isCompletelyLeftOf(withId(R.id.end_layout))) }
Java
@Test public void testDeviceOpen_Vertical() { activityRule .getScenario() .onActivity( activity -> { FoldingFeature feature = createFoldingFeature( activity, -1, 0, HALF_OPENED, VERTICAL); WindowLayoutInfo expected = createWindowLayoutInfo( Collections.singletonList(feature) ); publisherRule.overrideWindowLayoutInfo(expected); }); // Checks that start_layout is on the left of end_layout with a vertical folding feature. onView(withId(R.id.start_layout)) .check(isCompletelyLeftOf(withId(R.id.end_layout))); }
Mudanças de configuração
Se o app processa as mudanças de configuração de forma programática usando o método de callback onConfigurationChanged()
,
verifique se ele responde prontamente às mudanças de configuração e,
em especial, às rotações do dispositivo entre as orientações de retrato e paisagem.
Para garantir que o app seja notificado sobre mudanças de orientação e tamanho da tela, especifique estas definições de configuração no elemento de manifesto activity:configChanges
:
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"