package Ġcom . ging erc ake . ns n . main Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ging erc ake . ns n . Session Manager Ċ import Ġcom . ging erc ake . ns n . auth . Auth Activity Ċ import Ġcom . ging erc ake . ns n . framework . Constants Ċ import Ġcom . ging erc ake . ns n . model . post . Post Ċ import Ġcom . ging erc ake . ns n . model . post . Post Repo Ċ import Ġcom . ging erc ake . ns n . model . user . User Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Set Options Ċ import Ġcom . google . firebase . functions . Firebase Functions Ċ import Ġcom . google . firebase . functions . Firebase Functions Exception Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġkotlinx . parcel ize . Parcel ize Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . HashMap Ċ Ċ @ Parcel ize Ċ data Ġclass ĠCreate Post Progress ( val Ġstate : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Transfer red : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Byte Count : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost : ĠPost Ġ= ĠPost (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage : ĠString Ġ= Ġ" Main "): ĠParcel able Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUP LOADING Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUP LOAD _ PA USED Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFAIL Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCANCEL LED Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUP LOADED Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSUCCESS Ġ= Ġ 6 ĊĠĠĠ Ġ} Ċ } Ċ class ĠMain ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġstorage : ĠFirebase Storage , ĊĠĠĠ Ġprivate Ġval Ġdb : ĠFirebase Fire store , ĊĠĠĠ Ġprivate Ġval Ġpost Repo : ĠPost Repo , ĊĠĠĠ Ġprivate Ġval Ġfunctions : ĠFirebase Functions , Ċ ): ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ post Creation LiveData Ġ= ĠMutable LiveData < Create Post Progress >() ĊĠĠĠ Ġprivate Ġval Ġ_ account Balance LiveData Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġprivate Ġval Ġ_ purchase LiveData Ġ= ĠMutable LiveData < Create Post Progress >() ĊĊĠĠĠ Ġval Ġpost Creation LiveData : ĠLive Data < Create Post Progress > Ġ= Ġ_ post Creation LiveData ĊĠĠĠ Ġval Ġaccount Balance LiveData : ĠLive Data < String > Ġ= Ġ_ account Balance LiveData ĊĠĠĠ Ġval Ġpurchase LiveData : ĠLive Data < Create Post Progress > Ġ= Ġ_ purchase LiveData ĊĊĠĠĠ Ġfun Ġget Account Balance () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbalance Response Ġ= Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Https Callable (" blockchain _ account - get Account Balance ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call ( hash Map Of (" username " Ġto ĠSession Manager . currentUser . username )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. continue With Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. data Ġas ĠHashMap < String , ĠObject > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbalance Ġ= Ġ( balance Response [" data "] Ġas ĠHashMap < String , ĠObject >) [" balance "] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( balance . endsWith (" EOS ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ= Ġbalance . replace (" EOS ", Ġ""). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession Manager . currentUser . eos Amount Ġ= Ġbalance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ account Balance LiveData . post Value ( balance ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġquery Ġaccount Ġbalance ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Post ( post Id : ĠString , Ġtitle : ĠString , Ġcontent : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Path : ĠString , Ġresource Type : ĠInt , Ġprice : ĠString , Ġpassword : ĠString ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Name Ġ= Ġif Ġ(! resource Path . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠUri . from File ( java . io . File ( resource Path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdot Index Ġ= Ġresource Path . lastIndexOf ('.') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ext Ġ= Ġif Ġ( dot Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource Path . substring ( dot Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuploading Name Ġ= ĠUUID . randomUUID (). toString (). replace ("- ", Ġ"") Ġ+ Ġfile Ext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reference . child ( upload ing Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Canceled Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . CANCEL LED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" failed Ġto Ġupload ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . FAIL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Paused Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" upload Ġis Ġpaused ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . UPLOAD _ PA USED , Ġit . bytes Transfer red , Ġit . total Byte Count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Progress Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . UPLOAD ING , Ġit . bytes Transfer red , Ġit . total Byte Count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . UP LOADED , Ġit . bytes Transfer red , Ġit . total Byte Count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuploading Name ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġpost Ġ= ĠPost . newInstance ( post Id , Ġtitle , Ġcontent , Ġresource Name , Ġresource Type , Ġprice , ĠSession Manager . currentUser ) ĊĠĠĠĠĠĠĠ Ġdb . collection ( Constants . POST S _ COLLECTION ). document ( post Id ). set ( post , ĠSet Options . merge ()). await () ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġhash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" post Id " Ġto Ġpost Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" password " Ġto Ġpassword , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Https Callable (" blockchain _ post - create Post ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. continue With Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Auth Activity . TAG , Ġ"" Ġ+ Ġtask . result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġcreate Ġpost ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġif Ġ( e Ġis ĠFirebase Functions Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . details . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġcreate Ġyour Ġpost . ĠPlease Ġtry Ġagain !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . FAIL , Ġpost Ġ= Ġpost , ĠerrorMessage Ġ= Ġmsg )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ post Creation LiveData . post Value ( Create Post Progress ( Create Post Progress . SUCCESS , Ġpost Ġ= Ġpost )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġview Post ( user : ĠUser , Ġpost : ĠPost ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( post . owner . uid Ġ!= Ġuser . uid Ġ&& Ġpost . author . uid Ġ!= Ġuser . uid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Repo . view Post ( user , Ġpost . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlike Post ( user : ĠUser , Ġpost Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Repo . like Post ( user , Ġpost Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun like Post ( user : ĠUser , Ġpost Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Repo . un like Post ( user , Ġpost Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpurchase Post ( post : ĠPost , Ġnew Price : ĠString , Ġpassword : ĠString ) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Https Callable (" blockchain _ post - purchase Post ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call ( hash Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" post Id " Ġto Ġpost . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" new Price " Ġto Ġnew Price , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" password " Ġto Ġpassword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. continue With Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . result ?. data ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ purchase LiveData . post Value ( Create Post Progress ( Create Post Progress . SUCCESS , Ġpost Ġ= Ġpost )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġpurchase Ġpost ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġif Ġ( e Ġis ĠFirebase Functions Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . details . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġpurchase Ġthis Ġpost . ĠPlease Ġtry Ġagain !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ purchase LiveData . post Value ( Create Post Progress ( Create Post Progress . FAIL , Ġpost Ġ= Ġpost , ĠerrorMessage Ġ= Ġmsg )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" New Post ViewModel " ĊĠĠĠ Ġ} Ċ }