/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 . core . view Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . Window Insets Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . test . R Ċ import Ġandroidx . core . view . Window Insets Animation Compat . Callback . DISPATCH _ MODE _ CONTINUE _ ON _ SUB TREE Ċ import Ġandroidx . core . view . Window Insets Animation Compat . Callback . DISPATCH _ MODE _ STOP Ċ import Ġandroidx . core . view . Window Insets Compat . Type . status Bars Ċ import Ġandroidx . core . view . Window Insets Compat . Type . system Bars Ċ import Ġandroidx . test . core . app . Activity Scenario Ċ import Ġandroidx . test . espress o . Esp ress o . on Idle Ċ import Ġandroidx . test . espress o . Esp ress o . on View Ċ import Ġandroidx . test . espress o . action . View Actions Ċ import Ġandroidx . test . espress o . matcher . View Matchers . with Id Ċ import Ġandroidx . test . filters . Fl aky Test Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . test . filters . Sdk Suppress Ċ import Ġandroidx . test utils . with Activity Ċ import Ġcom . google . common . truth . Truth Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Ass ume Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Sdk Suppress ( min Sdk Version Ġ= Ġ 2 1 ) Ċ @ Requires Api ( 2 1 ) Ċ @ Large Test Ċ public Ġclass ĠWindow Insets Animation Compat Activity Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscenario : ĠActivity Scenario < Window Insets Compat Activity > ĊĊĠĠĠ Ġprivate Ġvar Ġbars Shown Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġpublic Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġscenario Ġ= ĠActivity Scenario . launch ( Window Insets Compat Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġon Idle () ĊĠĠĠĠĠĠĠ Ġ// ĠClose Ġthe ĠI ME Ġif Ġit 's Ġopen , Ġso Ġwe Ġstart Ġfrom Ġa Ġknown Ġscenario ĊĠĠĠĠĠĠĠ Ġon View ( with Id ( R . id . edit text )). perform ( View Actions . close Soft Keyboard ()) ĊĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Compat . set Decor Fits System Windows ( it . window , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Compat . get Insets Controller ( it . window , Ġit . window . decor View ). show ( system Bars ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbars Shown Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Idle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġadd _ both _ listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġin sets Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinset Listener : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġboth ĠApply Window Insets Ġand Ġthe ĠAnimation ĠCallback Ġare Ġcalled ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġanimation Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġin sets Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Apply Window Insets Listener Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġremove _ in sets _ listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġin sets Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinset Listener : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġboth ĠApply Window Insets Ġand Ġthe ĠAnimation ĠCallback Ġare Ġcalled ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġnull ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġanimation Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Apply Window Insets Listener Ġshould ĠNOT Ġhave Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġremove _ animation _ listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġin sets Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinset Listener : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġnull ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġin sets Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue (" on Apply Window Insets Listener Ġhas Ġnot Ġbeen Ġcalled ", Ġapply Insets Called ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġshould ĠNOT Ġhave Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġall _ callbacks _ called () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠWindow Insets Animation Compat . Callback ( DISPATCH _ MODE _ STOP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Prepare ( animation : ĠWindow Insets Animation Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add (" prepare ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets : ĠWindow Insets Compat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Animations : ĠMutable List < Window Insets Animation Compat > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠWindow Insets Compat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add (" progress ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . add ( running Animations [ 0 ]. fraction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation : ĠWindow Insets Animation Compat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds : ĠWindow Insets Animation Compat . Bounds Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠWindow Insets Animation Compat . Bounds Compat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add (" start ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon End ( animation : ĠWindow Insets Animation Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add (" end ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġl atch . await ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( res ). contains Exactly (" prepare ", Ġ" start ", Ġ" progress ", Ġ" end "). in Order () ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( progress ). contains At Least ( 0 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( progress ). isIn Order () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger Inset Animation ( container : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bars Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Compat . get Insets Controller ( it . window , Ġcontainer ). hide ( status Bars ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbars Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Compat . get Insets Controller ( it . window , Ġcontainer ). show ( status Bars ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbars Shown Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġupdate _ apply _ listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called 1 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called 2 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called 3 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called 1 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called 2 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġin sets Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback 1 Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called 1 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback 2 Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called 2 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinset Listener 1 : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 1 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinset Listener 2 : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 2 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinset Listener 3 : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 3 Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġboth ĠApply Window Insets Ġand Ġthe ĠAnimation ĠCallback Ġare Ġcalled ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener 1 ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback 1 ) ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener 2 ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback 2 ) ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener 3 ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġanimation Latch . await ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġin sets Latch . await ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġ# 1 Ġshould Ġhave Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġon Apply Window Insets Listener Ġ# 1 Ġshould Ġhave Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġ# 2 Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Apply Window Insets Listener Ġ# 2 Ġshould Ġnot Ġhave Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Apply Window Insets Listener Ġ# 3 Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called 3 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġadd _ animation _ listener _ first () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġapply Insets Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġin sets Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġinset Listener : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġinset Listener ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġanimation Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġin sets Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Apply Window Insets Listener Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġchild _ callback _ called _ when _ consumed () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . view ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġparent Listener Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġchild Listener Called Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsaved Insets : ĠWindow Insets Compat ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġsaved View : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġapply Insets Latch Ġ= ĠCount DownLatch ( 2 ) Ġ// ĠIn sets Ġwill Ġbe Ġdis patched Ġ 3 Ġtimes ĊĠĠĠĠĠĠĠ Ġval Ġon Prepare Latch Ġ= ĠCount DownLatch ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . dispatch Apply Window Insets ( saved View !! , Ġsaved Insets !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ child Listener Called Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġcheck Ġthat Ġwhen Ġthe Ġparent Ġconsume Ġthe Ġin sets , Ġthe Ġchild Ġlistener Ġis Ġnot Ġcalled ĊĠĠĠĠĠĠĠ Ġval Ġconsuming Listener : Ġ( v : ĠView , Ġin sets : ĠWindow Insets Compat ) Ġ-> ĠWindow Insets Compat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġv , Ġin sets Compat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Listener Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Insets Ġ= Ġin sets Compat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsaved View Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Insets Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Insets Compat . CON SU MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġanimation Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( child , Ġchild Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setOn Apply Window Insets Listener ( container , Ġconsuming Listener ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġapply Insets Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġchild Latch . await ( 2 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" parent Ġlistener Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Listener Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠParent Ġconsumed Ġthe Ġin sets , Ġchild Ġlistener Ġwon 't Ġbe Ġcalled ĊĠĠĠĠĠĠĠ ĠassertEquals (" child Ġlistener Ġshould Ġnot Ġhave Ġbeen Ġcalled ", Ġ 1 , Ġchild Listener Called Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġpublic Ġfun Ġcheck _ view _ on _ apply _ called () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġon Apply Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcustom View Ġ= Ġobject Ġ: ĠView ( scenario . with Activity Ġ{ Ġthis Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Apply Window Insets ( in sets : ĠWindow Insets ): ĠWindow Insets Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Apply Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġin sets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ Ġ( container Ġas ĠViewGroup ). addView ( custom View ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstop Callback Ġ= Ġcreate Callback () ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( custom View , Ġstop Callback ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠView . on Apply Window Insets Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Apply Latch . await ( 2 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Callback ( ĊĠĠĠĠĠĠĠ Ġdispatch Mode : ĠInt Ġ= ĠDIS PATCH _ MODE _ CONTINUE _ ON _ SUB TREE , ĊĠĠĠĠĠĠĠ Ġon Prepare : Ġ(( Window Insets Animation Compat ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġon End : Ġ(( Window Insets Animation Compat ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġ): ĠWindow Insets Animation Compat . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Insets Animation Compat . Callback ( dispatch Mode ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Prepare ( animation : ĠWindow Insets Animation Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare ?. invoke ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets : ĠWindow Insets Compat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Animations : ĠMutable List < Window Insets Animation Compat > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠWindow Insets Compat Ġ= Ġin sets ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon End ( animation : ĠWindow Insets Animation Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon End ?. invoke ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Fl aky Test ( bug Id Ġ= Ġ 1 9 6 9 1 7 5 4 1 ) ĊĠĠĠ Ġpublic Ġfun Ġchild _ callback _ not _ called _ when _ dispatch _ stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġassume Not Cut tle fish () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . container ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġscenario . with Activity Ġ{ ĠfindViewById ( R . id . view ) Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġin sets Animation Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġchild Listener Called Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġon Prepare Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġstop Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDIS PATCH _ MODE _ STOP , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġstop Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ child Listener Called Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġon Prepare Latch . await ( 2 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠParent Ġconsumed Ġthe Ġin sets , Ġchild Ġlistener Ġwon 't Ġbe Ġcalled ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" child Ġlistener Ġshould Ġhave Ġnot Ġbeen Ġcalled . ĠCall Ġcount : Ġ", Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Listener Called Count ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġon Prepare Latch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġdispatch Callback Ġ= Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Prepare Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( container , Ġdispatch Callback ) ĊĠĠĠĠĠĠĠ ĠView Compat . setWindow Insets Animation Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon End Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ child Listener Called Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Latch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtrigger Inset Animation ( container ) ĊĠĠĠĠĠĠĠ Ġchild Latch . await ( 4 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠWindow Insets Animation Callback Ġhas Ġnot Ġbeen Ġcalled ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets Animation Callback Called ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" child Ġlistener Ġshould Ġhave Ġbeen Ġcalled Ġ 1 Ġtime Ġbut Ġwas Ġcalled Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ child Listener Called Count Ġtimes ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Listener Called Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassume Not Cut tle fish () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġremove Ġthis Ġif Ġb / 1 5 9 1 0 3 8 4 8 Ġis Ġresolved ĊĠĠĠĠĠĠĠ ĠAssume . assume False ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unable Ġto Ġtest : ĠCut tle fish Ġdevices Ġdefault Ġto Ġthe Ġvirtual Ġkeyboard Ġbeing Ġdisabled .", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MODEL . contains (" Cut tle fish ", Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }