/* Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠRos berry . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġro sb erry . com . sample Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . photos . library . v 1 . proto . MediaType Filter Ċ import Ġcom . ros berry . android . google photo provider . Cloud Media Ċ import Ġcom . ros berry . android . google photo provider . Cloud Media Provider Ċ import Ġcom . ros berry . android . google photo provider . model . Cloud Media Page Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlinx . android . synt hetic . main . a _ main .* Ċ import Ġro sb erry . com . sample . converter . Media Converter Ċ import Ġro sb erry . com . sample . entity . Media Ċ import Ġro sb erry . com . sample . entity . Media Page Ċ import Ġro sb erry . com . sample . ui . End less Scroll Listener Ċ import Ġro sb erry . com . sample . ui . Media Adapter Ċ import Ġro sb erry . com . sample . ui . Media Item Decorator Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Photos Paginator . ViewController < Media > Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġsign In Request Code Ġ= Ġ 6 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSP AN _ COUNT Ġ= Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcloud Media Provider Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠCloud Media Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . O AUTH _ Ð¡ LI ENT _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Config . O AUTH _ Ð¡ LI ENT _ SECRET ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmedia Converter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Converter () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmedia Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Width Ġ= Ġ( resources . display Metrics . width Pixels Ġ- Ġpadding ) Ġ/ ĠSP AN _ COUNT ĊĠĠĠĠĠĠĠ ĠMedia Adapter ( item Width ) Ġ{ Ġmedia Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Media Provider . download Media ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia . full Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Successfully Ġdownloaded : Ġ$ uri ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġt Ġ-> Ġt . printStackTrace () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġgoogle Photos Paginator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠGoogle Photos Paginator ({ Ġlimit , Ġtoken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Media Page From Cloud Single ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMediaType Filter . MediaType . ALL _ MEDIA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġend less Scroll Listener Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠEnd less Scroll Listener ( media List . layout Manager !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad More () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle Photos Paginator . load New Page () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpadding Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠTyped Value . apply Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ DIP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . display Metrics ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . a _ main ) ĊĊĠĠĠĠĠĠĠ Ġmedia List . add On Scroll Listener ( end less Scroll Listener ) ĊĠĠĠĠĠĠĠ Ġmedia List . adapter Ġ= Ġmedia Adapter ĊĠĠĠĠĠĠĠ Ġmedia List . addItem Decoration ( Media Item Decorator ( padding , ĠSP AN _ COUNT )) ĊĊĠĠĠĠĠĠĠ Ġcloud Media Provider . check Authorization ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon SignIn Required Ġ= Ġ{ Ġsign In Intent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Google ( signIn Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Sil ent SignIn Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Media Provider . handle SignIn Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. handle SignIn () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Already Signed In Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Connection Error Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsign In Google ( signIn Intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( signIn Intent , Ġsign In Request Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata : ĠIntent ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull Ġ&& Ġrequest Code Ġ== Ġsign In Request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ!= ĠActivity . RESULT _ C ANCE LED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon SignIn Google Result ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon SignIn Google Result ( data : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcloud Media Provider . handle SignIn Result ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. handle SignIn () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Media Page From Cloud Single ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter : ĠMediaType Filter . MediaType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext PageToken : ĠString ? ĊĠĠĠ Ġ): ĠSingle < Media Page > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Media Provider . get Cloud Media Page ( filter , Ġlimit , Ġnext PageToken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcloud Media Page Ġ-> Ġcloud Media Page . to Media Page () Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCloud Media Page . to Media Page (): ĠMedia Page Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMedia Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . media List . from Cloud To Media List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . next PageToken ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Cloud Media >. from Cloud To Media List (): ĠList < Media > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmedia Converter . convert Cloud Media ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġprivate Ġfun ĠComp letable . handle SignIn () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Successfully Ġsigned Ġin ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle Photos Paginator . restart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ MainActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Sign Ġin Ġresult Ġerror : Ġ${ throwable . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Error ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Message . text Ġ= ĠgetString ( R . string . waiting ) ĊĠĠĠĠĠĠĠ Ġmedia Message . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġmedia List . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Empty View ( show : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Message . text Ġ= ĠgetString ( R . string . error ) ĊĠĠĠĠĠĠĠ Ġmedia Message . visibility Ġ= Ġif Ġ( show ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġmedia List . visibility Ġ= Ġif Ġ( show ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Data ( data : ĠList < Media >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Adapter . show Data ( data ) ĊĠĠĠĠĠĠĠ Ġmedia Message . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġmedia List . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Page Progress ( show : ĠBoolean ) Ġ{ ĊĠĠĠ Ġ} Ċ } Ċ