/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . view pager 2 . widget Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . text . InputType Ċ import Ġandroid . text . Sp ann able StringBuilder Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . ViewGroup . LayoutParams . MATCH _ PARENT Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . test . espress o . Esp ress o . on View Ċ import Ġandroidx . test . espress o . action . View Actions Ċ import Ġandroidx . test . espress o . action . View Actions . click Ċ import Ġandroidx . test . espress o . matcher . View Matchers . isAssignableFrom Ċ import Ġandroidx . test . espress o . matcher . View Matchers . is Comp let ely Displayed Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 . OR IENTATION _ HORIZONTAL Ċ import Ġorg . hamcrest . Core Matchers . all Of Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ Ċ /** ĠRegression Ġtest Ġfor Ġan Ġissue Ġwhen Ġfoc using Ġon Ġan ĠEditText Ġwould Ġcause Ġa Ġscroll Ġto Ġpage Ġ 0 . Ġ*/ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Large Test Ċ class ĠEditText Focus Test Ġ: ĠBaseTest () Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ currentPage _ click Focus _ edit Text Is Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest _ currentPage _ click Focus ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ currentPage _ click Focus _ edit Text Is Page Child () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest _ currentPage _ click Focus ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠVerifies Ġwe Ġstay Ġon Ġthe Ġcurrent Ġpage Ġif Ġfocus Ġis Ġrequested Ġon Ġits Ġelement . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtest _ currentPage _ click Focus ( wrap EditText In ViewGroup : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠsetUp Test ( 3 , Ġwrap EditText In ViewGroup ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 , Ġ 2 , Ġ 1 , Ġ 0 , Ġ 1 ). forEach Ġ{ Ġtarget Page Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġa Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Soft Keyboard () Ġ// ĠsetCurrent Item Ġignored Ġotherwise ; ĠTODO : Ġcheck Ġif Ġon Ġpurpose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Sync Ġ{ Ġview Pager . setCurrent Item ( target Page , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Basic State ( target Page , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen ĠEditText Ġgets Ġfocus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent EditText . perform ( click ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen Ġno Ġpage Ġchange Ġas Ġa Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Basic State ( target Page , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ not Current Page _ request Focus _ edit Text Is Page () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest _ not Current Page _ request Focus ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ not Current Page _ request Focus _ edit Text Is Page Child () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest _ not Current Page _ request Focus ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠVerifies Ġwe Ġdon 't Ġnavigate Ġto Ġanother Ġpage Ġif Ġfocus Ġis Ġrequested Ġon Ġits Ġelement . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtest _ not Current Page _ request Focus ( wrap EditText In ViewGroup : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Count Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ ĠsetUp Test ( page Count , Ġwrap EditText In ViewGroup ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġpage Count ). forEach Ġ{ Ġtarget Page Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . setCurrent Item Sync ( target Page , Ġfalse , Ġ 2 , ĠSE CON DS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Basic State ( target Page , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Page Ġ= Ġ( target Page Ġ+ Ġ 1 ) Ġ% Ġpage Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedit Text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text For Page ( view Pager . linear LayoutManager . find View By Position ( other Page ) !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Soft Keyboard () Ġ// ĠsetCurrent Item Ġignored Ġotherwise ; ĠTODO : Ġcheck Ġif Ġon Ġpurpose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= Ġview Pager . add WaitFor First Scroll Event Latch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Sync Ġ{ Ġedit Text . request Focus () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( latch . await ( 1 , ĠSE CON DS )) Ġ// ĠTODO : Ġreplace Ġwith ĠRo bo lectric ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Basic State ( target Page , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Test ( ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Same Parameter Value ") Ġpage Count : ĠInt , ĊĠĠĠĠĠĠĠ Ġwrap EditText In ViewGroup : ĠBoolean ĊĠĠĠ Ġ): ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠsetUp Test ( OR IENTATION _ HORIZONTAL ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Sync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . adapter Ġ= Ġcreate EditText Adapter ( page Count , Ġwrap EditText In ViewGroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . off screen Page Limit Ġ= Ġpage Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Basic State ( 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcurrent EditText ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġon View ( all Of ( is Comp let ely Displayed (), Ġis AssignableFrom ( EditText :: class . java ))) ĊĊĠĠĠ Ġprivate Ġfun Ġclose Soft Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent EditText . perform ( View Actions . close Soft Keyboard ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġadapter Ġwith ĠEditText Ġelements Ġrepro ducing Ġb / 1 3 9 4 3 2 4 9 8 ĊĠĠĠĠ Ġ* Ġ@ param Ġwrap EditText In ViewGroup Ġif Ġfalse , Ġ[ EditText ] Ġis Ġthe Ġpage Ġroot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate EditText Adapter ( page Count : ĠInt , Ġwrap EditText In ViewGroup : ĠBoolean ): ĊĠĠĠĠĠĠĠ ĠRecyclerView . Adapter < RecyclerView . ViewHolder > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRecyclerView . Adapter < RecyclerView . ViewHolder >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġpage Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Type : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedit Text Ġ= ĠEditText ( parent . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠViewGroup . LayoutParams ( MATCH _ PARENT , ĠMATCH _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Ġ= ĠGr avity . CENTER _ VERTICAL Ġor ĠGr avity . END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Type Ġ= ĠInput Type . TYPE _ TEXT _ FLAG _ NO _ SU G GEST IONS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( Color . DK GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage View Ġ= Ġpage For EditText ( edit Text , Ġwrap EditText In ViewGroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠRecyclerView . ViewHolder ( page View ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text For Page ( holder . item View ). text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp ann able StringBuilder (" position =$ position ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġedit Text For Page ( page : ĠView ): ĠEditText Ġ= Ġpage . let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEditText Ġ-> Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠViewGroup Ġ-> Ġit . getChild At ( 0 ) Ġas ĠEditText ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpage For EditText ( edit Text : ĠEditText , Ġwrap In ViewGroup : ĠBoolean ): ĠView Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( wrap In ViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġedit Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠFrame Layout ( edit Text . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠViewGroup . LayoutParams ( MATCH _ PARENT , ĠMATCH _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( edit Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ