/* Ċ Ġ* ĠVan ity : ĠAn ĠAndroid Ġlibrary Ġto Ġdownload ĠInst agram Ġprofile Ġpictures . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠP and ora ĠMedia , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . pand ora . van ity . activity Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . webkit . WebView Ċ import Ġandroid . webkit . WebView Client Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . pand ora . van ity . Van ity Constants Ċ import Ġcom . pand ora . van ity . R Ċ import Ġcom . pand ora . van ity . lifecycle . Van ity ViewModel Ċ import Ġcom . pand ora . van ity . util . Van ity Utils Ċ import Ġcom . pand ora . van ity . model . Van ity Data Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ Ċ import Ġjava . io . Unsupported EncodingException Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġandroid . webkit . Cookie Manager Ċ Ċ @ Suppress Lint (" Set JavaScript Enabled ") Ċ open Ġclass ĠVan ity Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠVan ity Activity :: class . java . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠVan ity ViewModel ĊĠĠĠ Ġprivate Ġvar Ġbin Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm ProgressBar : ĠProgress Bar ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm WebView : ĠWebView ĊĊĠĠĠ Ġprivate Ġvar Ġpicture Quality : ĠString Ġ= ĠVan ity Constants . DEFAULT _ QUAL ITY ĊĊĠĠĠ Ġprivate Ġvar Ġm Authorization Url : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . auth _ activity ) ĊĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ C ANCE LED ) ĊĊĠĠĠĠĠĠĠ Ġm ProgressBar Ġ= ĠfindViewById ( R . id . progress Bar ) ĊĠĠĠĠĠĠĠ Ġm WebView Ġ= ĠfindViewById ( R . id . webview ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Providers . of ( this )[ Van ity ViewModel :: class . java ] ĊĊĠĠĠĠĠĠĠ Ġbind Streams () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . is Downloading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm WebView . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ProgressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclientId Ġ= Ġintent . getString Extra ( Van ity Constants . INT ENT _ EXTRA _ CLIENT _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġredirect Uri Ġ= Ġintent . getString Extra ( Van ity Constants . INT ENT _ EXTRA _ RE DIRECT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . has Extra ( Van ity Constants . INT ENT _ EXTRA _ PI CTURE _ QUAL ITY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquality Ġ= Ġintent . getString Extra ( Van ity Constants . INT ENT _ EXTRA _ PI CTURE _ QUAL ITY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( quality Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpicture Quality Ġ= Ġquality ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Valid Intent Extras ( clientId , Ġredirect Uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Error (" Missing Ġrequired Ġintent Ġextras , Ġexiting ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm WebView . let Ġ{ ĠwebView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠwebView . settings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . java Script Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView . web View Client Ġ= Ġbuild WebView Client ( redirect Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Authorization Url Ġ= ĠVan ity Utils . construct Authorization Url ( clientId , Ġredirect Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm WebView . load Url ( m Authorization Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Error ( ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġbin . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild WebView Client ( redirect Uri : ĠString ): ĠWebView Client Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠWebView Client () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Override Url Loading ( view : ĠWebView , Ġurl : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . startsWith ( redirect Uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġoff Ġthe Ġsession Ġcookies , Ġif Ġany . ĠThey Ġare Ġnecessary Ġto Ġretrieve ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhigh Ġdefinition Ġprofile Ġpictures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcookie Manager Ġ= ĠCookie Manager . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcookies Ġ= Ġcookie Manager . get Cookie ( m Authorization Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cookies Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookie Manager . set Cookie ( Van ity Constants . INST AG RAM _ URL , Ġcookies ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Redirect ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( url Ġ== ĠVan ity Constants . INST AG RAM _ URL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm WebView . load Url ( m Authorization Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Download ( url : ĠString , Ġpicture Quality : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . start Download ( url , Ġpicture Quality ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Streams () Ġ{ ĊĠĠĠĠĠĠĠ Ġbin . add ( viewModel . get Download Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġupdate From Download ( null ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġupdate From Download ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwhile Ġattempting Ġto Ġdownload Ġprofile Ġinfo : Ġ${ it . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate From Download ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġupdate From Download ( result : ĠVan ity Data ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġyour ĠUI Ġhere Ġbased Ġon Ġresult Ġof Ġdownload . ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Van ity Constants . RESULT _ EXTRA _ V AN ITY _ DATA , Ġresult ) ĊĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġintent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Redirect ( redirect Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( redirect Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĠVan ity Utils . getQuery Map ( url . query ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters Ġ!= Ġnull Ġ&& Ġparameters . containsKey ( Van ity Constants . PARAM _ ERROR )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Error ( parameters [ Van ity Constants . PARAM _ ERROR _ DESCRIPTION ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġurl . ref . replace ( Van ity Constants . PARAM _ ACCESS _ TOKEN Ġ+ Ġ"=", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" access _ token Ġ= Ġ$ accessToken ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm WebView . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ProgressBar . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Url Ġ= ĠVan ity Utils . construct Url ( Van ity Constants . ENDPOINT _ USERS _ SELF , ĠaccessToken ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( api Url Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Download ( api Url , Ġpicture Quality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMal formed URLException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Error ( ex . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Valid Intent Extras ( clientId : ĠString ?, Ġredirect Uri : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clientId Ġ== Ġnull Ġ|| Ġredirect Uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Error ( errorMessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠerrorMessage ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠerrorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} Ċ } Ċ