package Ġcom . av ito . android . test . espress o . action . recycler Ċ Ċ import Ġandroid . support . test . espress o . Perform Exception Ċ import Ġandroid . support . test . espress o . Ui Controller Ċ import Ġandroid . support . test . espress o . View Action Ċ import Ġandroid . support . test . espress o . intent . Checks Ċ import Ġandroid . support . test . espress o . matcher . View Matchers Ċ import Ġandroid . support . test . espress o . util . Human Read ables Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . View Ċ import Ġcom . av ito . android . test . espress o . action . scroll . collapse All App Bars In Parent Ċ import Ġcom . av ito . android . test . espress o . action . scroll . scrollTo Scroll able Parent Center Position Ċ import Ġorg . hamcrest . Matcher Ċ import Ġorg . hamcrest . Matchers Ċ Ċ private Ġclass ĠScroll To Position View Action ( private Ġval Ġposition : ĠInt ) Ġ: ĠView Action Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Constraints (): ĠMatcher < View > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMatch ers . all Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . isAssignableFrom ( RecyclerView :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . is Displayed () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescription (): ĠString Ġ= Ġ" scroll ĠRecyclerView Ġto Ġposition : Ġ$ position " ĊĊĠĠĠ Ġoverride Ġfun Ġperform ( ui Controller : ĠUi Controller , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġview Ġas ĠRecyclerView ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . scroll Item At Position To Center ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller Ġ= Ġui Controller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSm ooth Scroll To Position View Action Ġconstructor ( private Ġval Ġposition : ĠInt ) Ġ: ĠView Action Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Constraints (): ĠMatcher < View > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMatch ers . all Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . isAssignableFrom ( RecyclerView :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . is Displayed () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescription (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" smooth Ġscroll ĠRecyclerView Ġto Ġposition : Ġ$ position " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform ( ui Controller : ĠUi Controller , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġview Ġas ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġre cyclerView . smooth Scroll To Position ( position ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġscroll To Position ( position : ĠInt ): ĠView Action Ġ{ ĊĠĠĠ Ġreturn ĠScroll To Position View Action ( position ) Ċ } Ċ Ċ private Ġclass ĠScroll To Element Inside RecyclerView Item ( ĊĠĠĠ Ġprivate Ġval Ġposition : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġtarget View Id : ĠInt Ċ ) Ġ: ĠView Action Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescription (): ĠString Ġ= Ġ" scroll Ġto Ġelement Ġin Ġitem " ĊĊĠĠĠ Ġoverride Ġfun Ġget Constraints (): ĠMatcher < View > Ġ= ĊĠĠĠĠĠĠĠ ĠMatch ers . all Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . isAssignableFrom ( RecyclerView :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . is Displayed () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġperform ( ui Controller : ĠUi Controller , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġview Ġas ĠRecyclerView ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . scrollTo View Inside Item At Position To Center ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller Ġ= Ġui Controller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Id Ġ= Ġtarget View Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġscroll To Element Inside RecyclerView Item ( ĊĠĠĠ Ġposition : ĠInt , ĊĠĠĠ Ġchild View Id : ĠInt Ċ ): ĠView Action Ġ= ĠScroll To Element Inside RecyclerView Item ( ĊĠĠĠ Ġposition Ġ= Ġposition , ĊĠĠĠ Ġtarget View Id Ġ= Ġchild View Id Ċ ) Ċ Ċ internal Ġclass ĠScroll To View Action < VH Ġ: ĠRecyclerView . ViewHolder >( ĊĠĠĠ Ġprivate Ġval ĠviewHolder Matcher : ĠMatcher < VH >, ĊĠĠĠ Ġprivate Ġval ĠviewHolder Type : ĠClass < VH >, ĊĠĠĠ Ġprivate Ġval Ġat Position : ĠInt Ġ= ĠRecyclerView . NO _ POSITION Ċ ) Ġ: ĠPosition able RecyclerView Action Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġat Position ( position : ĠInt ): ĠPosition able RecyclerView Action Ġ{ ĊĠĠĠĠĠĠĠ ĠChecks . check Argument ( position Ġ>= Ġ 0 , Ġ"% d Ġis Ġused Ġas Ġan Ġindex Ġ- Ġmust Ġbe Ġ>= Ġ 0 ", Ġposition ) ĊĠĠĠĠĠĠĠ Ġreturn ĠScroll To View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Matcher Ġ= ĠviewHolder Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Type Ġ= ĠviewHolder Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġat Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Constraints (): ĠMatcher < View > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMatch ers . all Of < View >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . isAssignableFrom ( RecyclerView :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Matchers . is Displayed () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescription (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( at Position Ġ== ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" scroll ĠRecyclerView Ġto : Ġ$ view Holder Matcher " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" scroll ĠRecyclerView Ġto Ġthe : Ġ% d th Ġmatching Ġ% s .", Ġat Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Matcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform ( ui Controller : ĠUi Controller , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġview Ġas ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Matches Ġ= Ġif Ġ( at Position Ġ== ĠRecyclerView . NO _ POSITION ) Ġ 2 Ġelse Ġat Position Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselect Index Ġ= Ġif Ġ( at Position Ġ== ĠRecyclerView . NO _ POSITION ) Ġ 0 Ġelse Ġat Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatched Items Ġ= Ġitems Matching ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġre cyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Matcher Ġ= ĠviewHolder Matcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Type Ġ= ĠviewHolder Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġmax Matches ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( select Index Ġ>= Ġmatched Items . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġ% d Ġitems Ġmatching Ġ% s , Ġbut Ġposition Ġ% d Ġwas Ġrequested .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatched Items . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Matcher . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġat Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( at Position Ġ== ĠRecyclerView . NO _ POSITION Ġ&& Ġmatched Items . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġambiguous View Error Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġambiguous View Error . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" Found Ġmore Ġthan Ġone Ġsub - view Ġmatching Ġ% s ", ĠviewHolder Matcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġmatched Items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġambiguous View Error . append ( item . toString () Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( amb iguous View Error . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Position ( matched Items [ select Index ]. position ). perform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controller . loop MainThread Until Idle () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPerform Exception . Builder (). with Action Description ( this . description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with View Description ( Human Read ables . describe ( view )). with Cause ( t ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< VH Ġ: ĠRecyclerView . ViewHolder > Ġscroll To Holder ( ĊĠĠĠ ĠviewHolder Matcher : ĠMatcher < VH >, ĊĠĠĠ ĠviewHolder Type : ĠClass < VH > Ċ ): ĠPosition able RecyclerView Action Ġ= ĊĠĠĠ ĠScroll To View Action ( ĊĠĠĠĠĠĠĠ ĠviewHolder Matcher Ġ= ĠviewHolder Matcher , ĊĠĠĠĠĠĠĠ ĠviewHolder Type Ġ= ĠviewHolder Type ĊĠĠĠ Ġ) Ċ Ċ fun Ġ< VH Ġ: ĠRecyclerView . ViewHolder > Ġscroll To Holder ( ĊĠĠĠ ĠviewHolder Matcher : ĠMatcher < VH >, ĊĠĠĠ ĠviewHolder Type : ĠClass < VH >, ĊĠĠĠ Ġposition : ĠInt Ċ ): ĠPosition able RecyclerView Action Ġ= ĊĠĠĠ ĠScroll To View Action ( ĊĠĠĠĠĠĠĠ ĠviewHolder Matcher Ġ= ĠviewHolder Matcher , ĊĠĠĠĠĠĠĠ ĠviewHolder Type Ġ= ĠviewHolder Type , ĊĠĠĠĠĠĠĠ Ġat Position Ġ= Ġposition ĊĠĠĠ Ġ) Ċ Ċ fun Ġ< VH Ġ: ĠRecyclerView . ViewHolder > Ġscroll To ( ĊĠĠĠ ĠitemView Matcher : ĠMatcher < View >, ĊĠĠĠ ĠviewHolder Type : ĠClass < VH > Ċ ): ĠPosition able RecyclerView Action Ġ{ ĊĠĠĠ Ġval ĠviewHolder Matcher Ġ= ĠviewHolder Matcher < VH >( item View Matcher ) ĊĊĠĠĠ Ġreturn ĠScroll To View Action ( ĊĠĠĠĠĠĠĠ ĠviewHolder Matcher Ġ= ĠviewHolder Matcher , ĊĠĠĠĠĠĠĠ ĠviewHolder Type Ġ= ĠviewHolder Type ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠRecyclerView . scroll Item At Position To Center ( ĊĠĠĠ Ġui Controller : ĠUi Controller , ĊĠĠĠ Ġposition : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcollapse All App Bars In Parent () ĊĠĠĠĠĠĠĠ Ġui Controller . loop MainThread Until Idle () ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcollapse All App Bars In Parent Ġcontains Ġhard Ġlogic Ġto Ġfind Ġapp Ġbar Ġin Ġparent , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe 're Ġjust Ġtrying Ġto Ġcollapse Ġit . ĠThis Ġaction Ġis Ġoptional ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! view For Item At Position Exists ( position )) Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll To Position ( position ) ĊĠĠĠĠĠĠĠ Ġui Controller . loop MainThread Until Idle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find View By Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . scrollTo Scroll able Parent Center Position () ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġscroll To Scroll able Parent Center Position Ġcontains Ġhard Ġlogic Ġto Ġfind Ġscroll able Ġcontainer , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe 're Ġjust Ġtrying Ġto Ġscroll Ġto Ġcenter Ġof Ġscroll able Ġparent . ĠThis Ġaction Ġis Ġoptional ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġui Controller . loop MainThread Until Idle () Ċ } Ċ Ċ private Ġfun ĠRecyclerView . scrollTo View Inside Item At Position To Center ( ĊĠĠĠ Ġui Controller : ĠUi Controller , ĊĠĠĠ Ġposition : ĠInt , ĊĠĠĠ Ġchild Id : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcollapse All App Bars In Parent () ĊĠĠĠĠĠĠĠ Ġui Controller . loop MainThread Until Idle () ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcollapse All App Bars In Parent Ġcontains Ġhard Ġlogic Ġto Ġfind Ġapp Ġbar Ġin Ġparent , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe 're Ġjust Ġtrying Ġto Ġcollapse Ġit . ĠThis Ġaction Ġis Ġoptional ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! view For Item At Position Exists ( position )) Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll To Position ( position ) ĊĠĠĠĠĠĠĠ Ġui Controller . loop MainThread Until Idle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find View By Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . findViewById < View >( child Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . scrollTo Scroll able Parent Center Position () ĊĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġscroll To Scroll able Parent Center Position Ġcontains Ġhard Ġlogic Ġto Ġfind Ġscroll able Ġcontainer , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe 're Ġjust Ġtrying Ġto Ġscroll Ġto Ġcenter Ġof Ġscroll able Ġparent . ĠThis Ġaction Ġis Ġoptional ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġui Controller . loop MainThread Until Idle () Ċ } Ċ Ċ private Ġfun ĠRecyclerView . view For Item At Position Exists ( position : ĠInt ): ĠBoolean Ġ= ĊĠĠĠ Ġfind ViewHolder For Adapter Position ( position ) Ġ!= Ġnull Ċ