package Ġcom . stripe . android . payments heet Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ScrollView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . core . view . do On Next Layout Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . commit Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . google . android . material . app bar . AppBar Layout Ċ import Ġcom . google . android . material . app bar . Material Toolbar Ċ import Ġcom . stripe . android . payments heet . databinding . Activity Payment Options Binding Ċ import Ġcom . stripe . android . payments heet . ui . Animation Constants Ċ import Ġcom . stripe . android . payments heet . ui . Base Sheet Activity Ċ import Ġcom . stripe . android . payments heet . ui . Primary Button Ċ Ċ /** Ċ Ġ* ĠAn Ġ` Activity ` Ġfor Ġselecting Ġa Ġpayment Ġoption . Ċ Ġ*/ Ċ internal Ġclass ĠPayment Options Activity Ġ: ĠBase Sheet Activity < Payment Option Result >() Ġ{ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġval Ġview Binding Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Payment Options Binding . inflate ( layout Inflater ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory Ġ= ĊĠĠĠĠĠĠĠ ĠPayment Options ViewModel . Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġapplication Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġrequire NotNull ( starter Args ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent ?. extras ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval ĠviewModel : ĠPayment Options ViewModel Ġby Ġview Models Ġ{ ĠviewModel Factory Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstarter Args : ĠPayment Option Contract . Args ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPayment Option Contract . Args . from Intent ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfragment Container Id : ĠInt ĊĠĠĠĠĠĠĠ Ġ@ Id Res ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġview Binding . fragment Container . id ĊĊĠĠĠ Ġoverride Ġval Ġroot View : ĠViewGroup Ġby Ġlazy Ġ{ Ġview Binding . root Ġ} ĊĠĠĠ Ġoverride Ġval Ġbottom Sheet : ĠViewGroup Ġby Ġlazy Ġ{ Ġview Binding . bottom Sheet Ġ} ĊĠĠĠ Ġoverride Ġval Ġapp bar : ĠApp Bar Layout Ġby Ġlazy Ġ{ Ġview Binding . app bar Ġ} ĊĠĠĠ Ġoverride Ġval Ġtoolbar : ĠMaterial Toolbar Ġby Ġlazy Ġ{ Ġview Binding . toolbar Ġ} ĊĠĠĠ Ġoverride Ġval Ġscroll View : ĠScroll View Ġby Ġlazy Ġ{ Ġview Binding . scroll View Ġ} ĊĠĠĠ Ġoverride Ġval Ġmessage View : ĠTextView Ġby Ġlazy Ġ{ Ġview Binding . message Ġ} ĊĠĠĠ Ġoverride Ġval Ġfragment Container Parent : ĠViewGroup Ġby Ġlazy Ġ{ Ġview Binding . fragment Container Parent Ġ} ĊĠĠĠ Ġoverride Ġval Ġtest Mode Indicator : ĠTextView Ġby Ġlazy Ġ{ Ġview Binding . test mode Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstarter Args Ġ= Ġthis . starter Args ĊĠĠĠĠĠĠĠ Ġif Ġ( starter Args Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstarter Args . status Bar Color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . status Bar Color Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠsetContentView ( view Binding . root ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . payment Option Result . observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose Sheet ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsetup Continue Button ( view Binding . continue Button ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . transition . observe ( this ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent ?. getContent IfNot Handled ()?. let Ġ{ Ġtransition Target Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Transition Target ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Sheet Activity . EXTRA _ STAR TER _ ARGS Ġto Ġstarter Args , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Sheet Activity . EXTRA _ FRAGMENT _ CONFIG Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Target . fragment Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . fragment Config Event . observe ( this ) Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġevent . getContent IfNot Handled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . transition To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt Ġwould Ġbe Ġnice Ġto Ġsee Ġthis Ġcondition Ġmove Ġinto Ġthe ĠPayment Options List Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhere Ġwe Ġalso Ġjump Ġto Ġa Ġnew Ġun saved Ġcard . ĠHowever Ġthis Ġmove Ġrequire ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtransition Ġtarget Ġto Ġspecify Ġwhen Ġto Ġand Ġwhen Ġnot Ġto Ġadd Ġthings Ġto Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġback stack . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( starter Args . payment Methods . isEmpty () Ġ&& Ġ! config . is Google Pay Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Options ViewModel . Transition Target . Add PaymentMethod Sheet ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Options ViewModel . Transition Target . Select Saved PaymentMethod ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . register Fragment Lifecycle Callbacks ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFragment Manager . Fragment Lifecycle Callbacks () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fragment Started ( fm : ĠFragment Manager , Ġfragment : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . continue Button . isVisible Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġis ĠPayment Options Add PaymentMethod Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Continue Button ( add Button : ĠPrimary Button ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding . continue Button . lock Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġview Binding . continue Button . update State ( Primary Button . State . Ready ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . config ?. primary Button Color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . continue Button . background Tint List Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on User Selection () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . cta Enabled . observe ( this ) Ġ{ Ġis Enabled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Button . isEnabled Ġ= Ġis Enabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Transition Target ( ĊĠĠĠĠĠĠĠ Ġtransition Target : ĠPayment Options ViewModel . Transition Target , ĊĠĠĠĠĠĠĠ Ġfragment Args : ĠBundle ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . commit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( transition Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPayment Options ViewModel . Transition Target . Add PaymentMethod Full Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Custom Animations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Constants . FA DE _ IN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Constants . FA DE _ OUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Constants . FA DE _ IN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnimation Constants . FA DE _ OUT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Back Stack ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Options Add PaymentMethod Fragment :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPayment Options ViewModel . Transition Target . Select Saved PaymentMethod Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Options List Fragment :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPayment Options ViewModel . Transition Target . Add PaymentMethod Sheet Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Options Add PaymentMethod Fragment :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Args ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġbottom Ġsheet Ġis Ġexpanded Ġonly Ġafter Ġthe Ġfragment Ġtransaction Ġis Ġcompleted ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . execute Pending Transactions () ĊĠĠĠĠĠĠĠ Ġroot View . do On Next Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExpand Ġsheet Ġonly Ġafter Ġthe Ġfirst Ġfragment Ġis Ġattached Ġso Ġthat Ġit Ġanim ates Ġin . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFurther Ġcalls Ġto Ġexpand () Ġare Ġno - op Ġif Ġthe Ġsheet Ġis Ġalready Ġexpanded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Controller . expand () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Activity Result ( result : ĠPayment Option Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . result Code , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Extras ( result . to Bundle ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ FRAGMENT _ CONFIG Ġ= ĠBase Sheet Activity . EXTRA _ FRAGMENT _ CONFIG ĊĠĠĠĠĠĠĠ Ġinternal Ġconst Ġval ĠEX TRA _ STAR TER _ ARGS Ġ= ĠBase Sheet Activity . EXTRA _ STAR TER _ ARGS ĊĠĠĠ Ġ} Ċ } Ċ