/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġandroidx . window . integration . layout Ċ Ċ import Ġandroid . content . pm . Activity Info . SCREEN _ OR IENTATION _ LAND SC APE Ċ import Ġandroid . content . pm . Activity Info . SCREEN _ OR IENTATION _ POR TRA IT Ċ import Ġandroid . graphics . Rect Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . test . ext . junit . rules . Activity Scenario Rule Ċ import Ġandroidx . window . integration . Test Activity Ċ import Ġandroidx . window . integration . Test Consumer Ċ import Ġandroidx . window . layout . Display Feature Ċ import Ġandroidx . window . layout . Fold ing Feature Ċ import Ġandroidx . window . layout . Fold ing Feature . State . Companion . FLAT Ċ import Ġandroidx . window . layout . Fold ing Feature . State . Companion . HALF _ OPEN ED Ċ import Ġandroidx . window . layout . Window Info Tracker Ċ import Ġjunit . framework . TestCase . assertEquals Ċ import Ġjunit . framework . TestCase . assertFalse Ċ import Ġjunit . framework . TestCase . fail Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . Standard Test Dispatcher Ċ import Ġkotlinx . coroutines . test . Test Scope Ċ import Ġkotlinx . coroutines . test . run Test Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ Ċ /** ĠA Ġcollection Ġof Ġend Ġto Ġend Ġtests Ġfor Ġ[ Window Info Tracker ] Ġto Ġensure Ġcorrect Ġbehavior . Ġ*/ Ċ @ Experimental Cor outines Api Ċ class ĠWindow Info Tracker End ToEnd Test Ġ{ ĊĊĠĠĠ Ġ// ĠSpecify Ġthe Ġscope Ġfor Ġhandling Ġcor outines . ĊĠĠĠ Ġprivate Ġval Ġtest Scope Ġ= ĠTest Scope ( Standard Test Dispatcher ()) ĊĊĠĠĠ Ġ// ĠSpecify Ġthe Ġrules Ġto Ġlaunch / close Ġan Ġactivity Ġbefore / after Ġeach Ġtest . ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġopen Activity Rule : ĠActivity Scenario Rule < Test Activity > Ġ= ĊĠĠĠĠĠĠĠ ĠActivity Scenario Rule ( Test Activity :: class . java ) ĊĊĠĠĠ Ġ/** ĠChecks Ġthat Ġthe Ġ[ Display Feature ]' s Ġtransform Ġappropriately Ġupon Ġscreen Ġrotation . Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġverify Display Features _ Screen Rotation () Ġ= Ġtest Scope . run Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġa Ġcollector Ġthat Ġstores Ġthe ĠDisplay Features Ġfrom Ġan ĠActivity . ĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠDisplay Features Ġwill Ġlater Ġbe Ġcompared Ġacross Ġdifferent Ġscreen Ġorient ations . ĊĠĠĠĠĠĠĠ Ġval Ġexpected Layouts Collected Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġfeature Collector Por trait Ġ= ĠTest Consumer < List < Display Feature >>( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġexpected Layouts Collected ) ĊĠĠĠĠĠĠĠ Ġval Ġfeature Collector Land scape Ġ= ĠTest Consumer < List < Display Feature >>( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġexpected Layouts Collected ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġscreen Ġorientation Ġto Ġpor trait Ġand Ġcollect Ġits ĠDisplay Features . ĊĠĠĠĠĠĠĠ Ġset Screen Orientation ( SCREEN _ OR IENTATION _ POR TRA IT ) ĊĠĠĠĠĠĠĠ Ġget First Display Feature ( feature Collector Por trait ) ĊĠĠĠĠĠĠĠ Ġ// ĠAssertion : Ġthere Ġis Ġonly Ġone Ġvalue Ġin Ġthe Ġcollector Ġ( from Ġpor trait Ġmode ). ĊĠĠĠĠĠĠĠ Ġfeature Collector Por trait . waitFor Value Count () ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠDisplay Features Ġfrom Ġthe Ġpor trait Ġlayout . ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Features Por trait Ġ= Ġfeature Collector Por trait . get ( value Index Ġ= Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠChange Ġthe Ġscreen Ġorientation Ġto Ġlandscape Ġand Ġcollect Ġits ĠDisplay Features . ĊĠĠĠĠĠĠĠ Ġset Screen Orientation ( SCREEN _ OR IENTATION _ LAND SC APE ) ĊĠĠĠĠĠĠĠ Ġget First Display Feature ( feature Collector Land scape ) ĊĠĠĠĠĠĠĠ Ġ// ĠAssertion : Ġthere Ġare Ġtwo Ġvalues Ġin Ġthe Ġcollector Ġ( from Ġpor trait Ġand Ġlandscape Ġmode ). ĊĠĠĠĠĠĠĠ Ġfeature Collector Land scape . waitFor Value Count () ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠDisplay Features Ġfrom Ġthe Ġlandscape Ġlayout . ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Features Land scape Ġ= Ġfeature Collector Land scape . get ( value Index Ġ= Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssertion : Ġthe Ġnumber Ġof Ġfeatures Ġin Ġboth Ġlayouts Ġare Ġthe Ġsame . ĊĠĠĠĠĠĠĠ ĠassertEquals ( display Features Por trait . size , Ġdisplay Features Land scape . size ) ĊĠĠĠĠĠĠĠ Ġ// ĠAssertion : Ġthe Ġnumber Ġof ĠFold ing Features Ġin Ġboth Ġlayouts Ġare Ġthe Ġsame ĊĠĠĠĠĠĠĠ ĠassertEquals ( display Features Por trait . filter Is Instance < Fold ing Feature >(). size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Features Land scape . filter Is Instance < Fold ing Feature >(). size ) ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġproperties Ġof Ġeach ĠDisplay Feature Ġis Ġvalid . ĊĠĠĠĠĠĠĠ Ġval Ġfeature State Counter Por trait Ġ= Ġvalidate Display Features ( display Features Por trait ) ĊĠĠĠĠĠĠĠ Ġval Ġfeature State Counter Land scape Ġ= Ġvalidate Display Features ( display Features Land scape ) ĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġexpected Ġcounts Ġof ĠFold ing Feature Ġproperties Ġis Ġconsistent . ĊĠĠĠĠĠĠĠ ĠassertEquals ( feature State Counter Por trait , Ġfeature State Counter Land scape ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChanges Ġthe Ġscreen Ġorientation Ġand Ġwaits Ġfor Ġthe Ġrotation Ġto Ġoccur . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Screen Orientation ( screen Orientation : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe Ġactivity Ġusing Ġthe ĠActivity Scenario Rule Ġand Ġset Ġthe Ġorientation . ĊĠĠĠĠĠĠĠ Ġopen Activity Rule . scenario . on Activity Ġ{ Ġactivity : ĠTest Activity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit iate Ġa Ġtimer Ġand Ġwait Ġfor Ġthe Ġscreen Ġto Ġrotate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . reset Layout Counter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . requested Orientation Ġ= Ġscreen Orientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . waitFor Layout () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssertion : Ġthe Ġscreen Ġhas Ġproperly Ġrotated Ġ( the Ġinternal Ġvalue Ġis Ġset ). ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġthe ĠScreen Ġto ĠRotate Ġto Ġstate Ġ$ screen Orientation ;", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . requested Orientation , Ġscreen Orientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract s Ġa Ġlist Ġof Ġ[ Display Feature ] s Ġfrom Ġa Ġ[ Test Activity ] Ġusing Ġthe Ġfirst Ġwindow Ġlayout . ĊĠĠĠĠ Ġ* ĠStores Ġthe Ġ[ Display Feature ] s Ġinto Ġa Ġcollector Ġfor Ġlater Ġanalysis Ġafter Ġthe Ġscope Ġends . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget First Display Feature ( feature Collector : ĠTest Consumer < List < Display Feature >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġthe Ġactivity Ġusing Ġthe ĠActivity Scenario Rule Ġand Ġstore Ġits ĠDisplay Features . ĊĠĠĠĠĠĠĠ Ġopen Activity Rule . scenario . on Activity Ġ{ Ġactivity : ĠTest Activity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTake Ġthe Ġfirst ĠWindow Layout Info Ġfrom Ġthe ĠFlow Ġstored Ġin ĠWindow Info Tracker . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Info Ġ= ĠWindow Info Tracker . get OrCreate ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. window Layout Info ( activity ). first () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe ĠDisplay Features Ġfor Ġfurther Ġanalysis Ġafter Ġthe Ġcoroutine Ġis Ġclosed . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Collector . accept ( layout Info . display Features ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthat Ġthe Ġ[ Display Feature ]' s Ġbounds Ġhave Ġnon - negative Ġarea ĊĠĠĠĠ Ġ* Ġand Ġat Ġleast Ġone Ġpositive Ġdimension . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvalidate Display Feature Bounds ( display Feature Bounds : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġthe ĠDisplay Feature Ġhas Ġpositive Ġdimensions . ĊĠĠĠĠĠĠĠ ĠassertFalse (" Error : Ġa Ġdisplay Ġfeature Ġwas Ġfound Ġwith Ġnegative Ġdimensions .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Feature Bounds . width () Ġ< Ġ 0 Ġ|| Ġdisplay Feature Bounds . height () Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġthat Ġthe ĠDisplay Feature Ġhas Ġat Ġleast Ġone Ġdimension . ĊĠĠĠĠĠĠĠ ĠassertFalse (" Error : Ġa Ġdisplay Ġfeature Ġwas Ġfound Ġwith Ġzero Ġarea .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Feature Bounds . width () Ġ== Ġ 0 Ġ&& Ġdisplay Feature Bounds . height () Ġ== Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġclass Ġto Ġkeep Ġtrack Ġof Ġthe Ġnumber Ġof Ġeach Ġ[ Fold ing Feature ]' s Ġstate . Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠFold ing Feature State Counter ( var Ġflat Count : ĠInt , Ġvar Ġhalf Opened Count : ĠInt ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġeach Ġ[ Display Feature ]' s Ġproperties Ġto Ġmake Ġsure Ġit Ġis Ġa Ġvalid Ġ[ Display Feature ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvalidate Display Features ( ĊĠĠĠĠĠĠĠ Ġdisplay Features : ĠList < Display Feature > ĊĠĠĠ Ġ): ĠFold ing Feature State Counter Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcounter Ġto Ġcount Ġthe Ġstates Ġfor Ġthe Ġfeatures Ġin Ġdisplay Features . ĊĠĠĠĠĠĠĠ Ġval Ġfold ing Feature State Counter Ġ= ĠFold ing Feature State Counter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflat Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhalf Opened Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoop Ġthrough Ġeach ĠDisplay Feature Ġand Ġverify Ġits Ġproperties . ĊĠĠĠĠĠĠĠ Ġfor Ġ( display Feature Ġin Ġdisplay Features ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Feature Ġbounds Ġmust Ġbe Ġ 1 - dimensional , Ġnon null , Ġand Ġpositive . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Display Feature Bounds ( display Feature . bounds ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe ĠDisplay Feature Ġis Ġa ĠFold ing Feature , Ġvalidate Ġthe ĠFold ing Feature Ġproperties . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( display Feature Ġis ĠFold ing Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKeep Ġa Ġrunning Ġcounter Ġof Ġeach Ġstate Ġto Ġcompare Ġthem Ġbetween Ġorient ations . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( display Feature . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL AT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfold ing Feature State Counter . flat Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHAL F _ OPEN ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfold ing Feature State Counter . half Opened Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" The ĠFold ing Feature Ġstate Ġ${ display Feature . state } Ġhas Ġnot Ġbeen Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" added Ġto Ġthe Ġlist Ġof Ġchecked Ġstates . ĠPlease Ġadd Ġthe Ġstate Ġand Ġretry .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfold ing Feature State Counter ĊĠĠĠ Ġ} Ċ }