/** Ċ * ĠCopyright ĠS or am its u ĠCo ., ĠLtd . ĠAll ĠRights ĠReserved . Ċ * ĠSPDX - License - Identifier : ĠGPL - 3 . 0 Ċ */ Ċ Ċ package Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . wallet Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . do On Layout Ċ import Ġandroidx . core . view . do On Next Layout Ċ import Ġandroidx . core . view . update Padding Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . paging . Load State Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġby . kir ich 1 4 0 9 . view binding delegate . view Binding Ċ import Ġcom . github . flo rent 3 7 . runtime permission . Runtime Permission . ask Permission Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . zx ing . integration . android . Intent Integr ator Ċ import Ġjp . co . sor am its u . common . base . Base Fragment Ċ import Ġjp . co . sor am its u . common . di . api . Feature Utils Ċ import Ġjp . co . sor am its u . common . presentation . De bounce Click Handler Ċ import Ġjp . co . sor am its u . common . presentation . view . De bounce ClickListener Ċ import Ġjp . co . sor am its u . common . util . ext . set De bounc ed ClickListener Ċ import Ġjp . co . sor am its u . common . util . ext . show Or Hide Ċ import Ġjp . co . sor am its u . feature _ wallet _ api . di . Wallet Feature Api Ċ import Ġjp . co . sor am its u . feature _ wallet _ api . domain . interfaces . Bottom Bar Controller Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . R Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . databinding . Fragment Wallet Binding Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . di . Wallet Feature Component Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . util . Scan Qr Bottom Sheet Dialog Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . wallet . asset . Asset Adapter Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . wallet . events . Events Load Adapter Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . wallet . events . History Adapter Ċ import Ġjp . co . sor am its u . feature _ wallet _ impl . presentation . wallet . events . Lock Bottom Sheet Behavior Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed By Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠWallet Fragment Ġ: ĠBase Fragment < Wallet ViewModel >( R . layout . fragment _ wallet ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK _ IMAGE _ REQUEST Ġ= Ġ 1 0 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġdebounce Click Handler : ĠDe bounce Click Handler ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbottom Sheet Behavior : ĠLock Bottom Sheet Behavior < View > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġintegr ator : ĠIntent Integr ator ĊĊĠĠĠ Ġprivate Ġvar Ġbottom Sheet Collapsed Or Half Expanded Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġview Binding Ġby Ġview Binding ( Fragment Wallet Binding :: bind ) ĊĊĠĠĠ Ġoverride Ġfun Ġinject () Ġ{ ĊĠĠĠĠĠĠĠ ĠFeature Utils . get Feature < Wallet Feature Component >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Feature Api :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wallet Sub Component Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Fragment ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhistory Adapter : ĠHistory Adapter ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ( activity Ġas ĠBottom Bar Controller ). show Bottom Bar () ĊĊĠĠĠĠĠĠĠ Ġintegr ator Ġ= ĠIntent Integr ator . for Support Fragment ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Desired Barcode Formats ( Intent Integr ator . QR _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Prompt ( getString ( R . string . contacts _ scan )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Be ep Enabled ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Binding . ib Wallet Send . setOnClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDe bounce ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . send Button Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġview Binding . ib Wallet Receive . setOnClickListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDe bounce ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . receive Button Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior Ġ= ĠLock Bottom Sheet Behavior . from View ( view Binding . recent Events Bottom Sheet ) ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . set Bottom Sheet Callback ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . Bottom Sheet Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slide ( bottom Sheet : ĠView , Ġslide Offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( bottom Sheet : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Collapsed Or Half Expanded Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Sheet Behavior . STATE _ COLL AP SED Ġ== ĠnewState Ġ|| ĠBottom Sheet Behavior . STATE _ HALF _ EXP AN DED Ġ== ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Added ) Ġview Binding . swipe Layout . isEnabled Ġ= Ġbottom Sheet Collapsed Or Half Expanded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġview Binding . swipe Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . refresh Assets () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Adapter . refresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Binding . recent Events Bottom Sheet . do On Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . peek Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Binding . bottom Sheet Pin . height Ġ+ Ġview Binding . bottom Sheet Pin . top ) Ġ* Ġ 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . expanded Offset Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . is Fit To Contents Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . state Ġ= ĠBottom Sheet Behavior . STATE _ COLL AP SED ĊĊĠĠĠĠĠĠĠ Ġhistory Adapter Ġ= ĠHistory Adapter ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . event Clicked ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . event RecyclerView . adapter Ġ= Ġhistory Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Load State Footer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Ġ= ĠEvents Load Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . event RecyclerView . context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . line _ ver _ divider ĊĠĠĠĠĠĠĠ Ġ) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . event RecyclerView . addItem Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiv ider Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . event RecyclerView . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiv ider Item Decoration . VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drawable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Binding . ib Wallet More . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . asset Settings Clicked () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Binding . ib Wallet Scan . set De bounc ed ClickListener ( de bounce Click Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScan Qr Bottom Sheet Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Listener Ġ= Ġ{ ĠviewModel . open Gallery () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Listener Ġ= Ġ{ ĠviewModel . open Camera () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . init iate Gallery Chooser LiveData . observe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Qr From Gallery () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . init iate Scanner LiveData . observe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitiate Scan () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . assets LiveData . observe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Binding . assets Rv . adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . layout Manager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsset Adapter ( de bounce Click Handler ) Ġ{ Ġasset Ġ-> ĠviewModel . asset Clicked ( asset ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Binding . assets Rv . adapter Ġas ĠAsset Adapter ). submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . content Container . do On Next Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġratio : ĠFloat Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . height Ġ+ Ġview Binding . title . height Ġ+ Ġresources . get Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . dim en . x 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ/ Ġview Binding . page Container . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Behavior . half Expanded Ratio Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ratio Ġ> Ġ 0 . 1 5 Ġ&& Ġratio Ġ< Ġ 0 . 8 5 ) Ġ 1 Ġ- Ġratio Ġelse Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . adapter ?. let Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter . item Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Binding . assets Rv . height Ġ>= Ġview Binding . page Container . height Ġ- Ġview Binding . assets Rv . getChild At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). height Ġ* Ġ 1 . 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . update Padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . assets Rv . getChild At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). height Ġ* Ġ 1 . 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . transactions Flow . collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Adapter . submit Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Adapter . load State Flow . collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . swipe Layout . is Refresh ing Ġ= Ġit . medi ator ?. refresh Ġis ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . transactions Unavailable Placeholder . container . show Or Hide ( it . refresh Ġis ĠLoad State . Error Ġ&& Ġhistory Adapter . item Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . refresh Ġis ĠLoad State . Not Loading Ġ&& Ġit . refresh Ġ! is ĠLoad State . Error Ġ&& Ġhistory Adapter . item Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . gr Empty History Wallet . show Or Hide ( emptyList ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch When Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Adapter . load State Flow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed By Ġ{ Ġit . refresh Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . refresh Ġis ĠLoad State . Not Loading Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġview Binding . event RecyclerView . scrollTo Position ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Swipe Progress LiveData . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . swipe Layout . is Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . copied Address Event . observe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Activity (), ĠR . string . common _ copied , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . qr Error LiveData . observe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error From Response ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscroll Listener Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Position Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Binding . assets Rv . layout Manager Ġas ĠLinearLayoutManager ). findFirst Comp let ely Visible Item Position () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . swipe Layout . isEnabled Ġ= Ġfirst Visible Position Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Binding . assets Rv . add On Scroll Listener ( scroll Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitiate Scan () Ġ{ ĊĠĠĠĠĠĠĠ Ġask Permission ( this , ĠManifest . permission . CAMERA ). on Accepted Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintegr ator . init iate Scan () ĊĠĠĠĠĠĠĠ Ġ}. ask () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Qr From Gallery () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ GET _ CONTENT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . create Chooser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . common _ options _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ICK _ IMAGE _ REQUEST ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠIntent Integr ator . parse Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . contents Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . qr Result Process ( result . contents ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠP ICK _ IMAGE _ REQUEST Ġ&& ĠresultCode Ġ== ĠActivity . RESULT _ OK Ġ&& Ġdata Ġ!= Ġnull Ġ&& Ġdata . data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . decode Text From Bitmap Qr ( data . data !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠviewModel . refresh Assets () ĊĠĠĠ Ġ} Ċ } Ċ