/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠP era ĠWallet , ĠL DA Ċ Ġ* Ġ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 Ġcom . al gor and . android . ui . notification center Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . view . isIn visible Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . paging . Load State Ċ import Ġandroidx . paging . Paging Data Ċ import Ġcom . al gor and . android . Home Navigation Directions Ċ import Ġcom . al gor and . android . R Ċ import Ġcom . al gor and . android . core . D agger Base Fragment Ċ import Ġcom . al gor and . android . databinding . Fragment Notification Center Binding Ċ import Ġcom . al gor and . android . models . Account Detail Tab Ċ import Ġcom . al gor and . android . models . Fragment Configuration Ċ import Ġcom . al gor and . android . models . IconButton Ċ import Ġcom . al gor and . android . models . Notification Center Preview Ċ import Ġcom . al gor and . android . models . Notification ListItem Ċ import Ġcom . al gor and . android . models . Screen State Ċ import Ġcom . al gor and . android . models . Toolbar Configuration Ċ import Ġcom . al gor and . android . utils . view binding . view Binding Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġjava . io . IOException Ċ import Ġjava . time . Z onedDateTime Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Android EntryPoint Ċ class ĠNotification Center Fragment Ġ: ĠD agger Base Fragment ( R . layout . fragment _ notification _ center ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġnotification Center ViewModel : ĠNotification Center ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġval Ġbinding Ġby Ġview Binding ( Fragment Notification Center Binding :: bind ) ĊĊĠĠĠ Ġprivate Ġval Ġtoolbar Configuration Ġ= ĠToolbar Configuration ( ĊĠĠĠĠĠĠĠ Ġtitle Res Id Ġ= ĠR . string . notifications , ĊĠĠĠĠĠĠĠ Ġstart Icon Res Id Ġ= ĠR . drawable . ic _ left _ arrow , ĊĠĠĠĠĠĠĠ Ġstart Icon Click Ġ= Ġ:: nav Back ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġfragment Configuration Ġ= ĠFragment Configuration ( ĊĠĠĠĠĠĠĠ Ġtoolbar Configuration Ġ= Ġtoolbar Configuration , ĊĠĠĠĠĠĠĠ Ġis Bottom Bar Needed Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġempty State Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠScreen State . Custom State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= ĠR . drawable . ic _ notification , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠR . string . no _ current _ notifications , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= ĠR . string . your _ recent _ transactions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnotification Adapter Ġ= ĠNotification Adapter (:: on New Item Added To Top , Ġ:: on Notification Click ) ĊĊĠĠĠ Ġprivate Ġval Ġnotification Center Preview Collector : Ġsuspend Ġ( Notification Center Preview ?) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġinit Preview ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnotification Pagination Collector : Ġsuspend Ġ( Paging Data < Notification ListItem >) Ġ-> ĠUnit Ġ= Ġ{ Ġpaging Data Ġ-> ĊĠĠĠĠĠĠĠ Ġnotification Adapter . submit Data ( paging Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Refresh Needed Observer Ġ= ĠObserver < Boolean > Ġ{ Ġis Refresh Needed Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( is Refresh Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh List ( change Refresh Time Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Toolbar () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĠĠĠĠĠĠĠ Ġinit Observer s () ĊĠĠĠĠĠĠĠ Ġinit Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . screen State View . setOn Neutral Button ClickListener (:: handleError Button Click ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Preview ( notification Center Preview : ĠNotification Center Preview ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( notification Center Preview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Go ing Asset Detail Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav To Asset Detail ( publicKey Ġ= Ġfirst , Ġasset Id Ġ= Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Go ing Collect ible Detail Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav To Collect ible Detail ( publicKey Ġ= Ġfirst , Ġasset Id Ġ= Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Asset Support Request Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav ( Home Navigation Directions . action Global Unsupported Asset Notification Request Action Bottom Sheet ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon History Not Available Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon History Not Available ( publicKey Ġ= Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Transaction Received Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Center ViewModel . is Asset Available On Account ( publicKey Ġ= Ġfirst , Ġasset Id Ġ= Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Transaction Sent Event ?. consume ()?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Center ViewModel . is Asset Available On Account ( publicKey Ġ= Ġfirst , Ġasset Id Ġ= Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Toolbar () Ġ{ ĊĠĠĠĠĠĠĠ Ġget App Toolbar ()?. add Button ToEnd ( IconButton ( R . drawable . ic _ filter , ĠonClick Ġ= Ġ:: on Filter Click )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . notifications RecyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Adapter . last Ref reshed DateTime Ġ= Ġnotification Center ViewModel . getLast Ref reshed DateTime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Center ViewModel . set Last Ref reshed DateTime ( Z onedDateTime . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġnotification Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnotification Adapter . register Data Observer () ĊĊĠĠĠĠĠĠĠ Ġhandle Load State () ĊĊĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . setOn Refresh Listener Ġ{ Ġrefresh List ( change Refresh Time Ġ= Ġtrue ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Center ViewModel . notification Pagination Flow . collect Latest ( notification Pagination Collector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Center ViewModel . notification Center Preview Flow . collect Latest ( notification Center Preview Collector ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotification Center ViewModel . is Refresh Needed LiveData (). observe ( view Lifecycle Owner , Ġis Refresh Needed Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġrefresh List ( change Refresh Time Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Load State () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Adapter . load State Flow . collect Latest Ġ{ Ġcombined Load States Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Notification List Empty Ġ= Ġnotification Adapter . item Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Current State Error Ġ= Ġcombined Load States . refresh Ġis ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠisLoading Ġ= Ġcombined Load States . refresh Ġis ĠLoad State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Refresh Layout . is Refresh ing Ġ= ĠisLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Current State Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Notifications Error State (( combined Load States . refresh Ġas ĠLoad State . Error ). error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading . not () Ġ&& Ġis Notification List Empty Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . screen State View . setup Ui ( empty State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . notifications RecyclerView . isIn visible Ġ= Ġis Current State Error Ġ|| Ġis Notification List Empty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . screen State View . isVisible Ġ= Ġ( is Current State Error Ġ|| Ġis Notification List Empty ) Ġ&& ĠisLoading . not () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Notifications Error State ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( throwable Ġis ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . screen State View . setup Ui ( Screen State . Connection Error ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . screen State View . setup Ui ( Screen State . Default Error ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error Button Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh List ( change Refresh Time : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrefresh DateTime : ĠZ onedDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( change Refresh Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh DateTime Ġ= ĠZ onedDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Adapter . last Ref reshed DateTime Ġ= Ġrefresh DateTime ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotification Center ViewModel . refresh Notification Data ( refresh DateTime ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Notification Click ( notification ListItem : ĠNotification ListItem ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Center ViewModel . on Notification Click Event ( notification ListItem ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon New Item Added To Top () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lifecycle . currentState . is At Least ( Lifecycle . State . INITIAL IZED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . notifications RecyclerView . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Adapter . unregister Data Observer () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Filter Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġnav ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center Fragment Directions . action Notification Center Fragment To Notification Filter Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Done Button Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnav To Collect ible Detail ( publicKey : ĠString , Ġasset Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center Fragment Directions . action Notification Center Fragment To Collect ible Detail Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect ible Asset Id Ġ= Ġasset Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnav To Asset Detail ( publicKey : ĠString , Ġasset Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav ( Home Navigation Directions . action Global Asset Detail Fragment ( address Ġ= ĠpublicKey , Ġasset Id Ġ= Ġasset Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon History Not Available ( publicKey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav To Account History ( publicKey ) ĊĠĠĠĠĠĠĠ Ġshow Unavailable Transaction History Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnav To Account History ( publicKey : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Center Fragment Directions . action Notification Center Fragment To Account Detail Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Detail Tab Ġ= ĠAccount Detail Tab . HISTORY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Unavailable Transaction History Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Global Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= ĠgetString ( R . string . the _ history _ for _ this _ sp es ific ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . asset _ history _ not _ available ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ