package Ġcom . dew . ai h ua . ui . fragment Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġcom . dew . ai h ua . R Ċ import Ġcom . dew . ai h ua . player . helper . Animation Utils . animate View Ċ import Ġcom . dew . ai h ua . player . helper . Extractor Helper Ċ import Ġcom . dew . ai h ua . player . helper . Info Cache Ċ import Ġcom . dew . ai h ua . report . Error Activity Ċ import Ġcom . dew . ai h ua . report . Error Info Ċ import Ġcom . dew . ai h ua . report . User Action Ċ import Ġcom . dew . ai h ua . ui . activity . MainActivity Ċ import Ġcom . dew . ai h ua . ui . activity . Re Captcha Activity Ċ import Ġcom . dew . ai h ua . ui . contract . View Contract Ċ import Ġcom . jak ew h art on . r xb ind ing 2 . view . Rx View Ċ import Ġice pick . State Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġorg . sch abi . new pipe . extractor . exceptions . Re Captcha Exception Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* Ġ ĠCreated Ġby ĠEd ward Ġon Ġ 3 / 2 / 2 0 1 9 . Ċ Ġ*/ Ċ abstract Ġclass ĠBase State Fragment < I > Ġ: ĠBase Fragment (), ĠView Contract < I > Ġ{ ĊĊĠĠĠ Ġ@ State ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġwas Loading Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġprotected Ġvar ĠisLoading Ġ= ĠAtomic Boolean () ĊĊĠĠĠ Ġprotected Ġvar Ġempty State View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprotected Ġvar Ġloading ProgressBar : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġerror Panel Root : ĠView ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġerror Button Retry : ĠButton ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġerror TextView : ĠTextView ĊĊĠĠĠ Ġprotected Ġval Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( root View : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( root View , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġdo Initial Load Logic () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġwas Loading . set ( isLoading . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġif Ġ(! composite Disposable . is Disposed ) Ġcomposite Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĠĠĠ Ġ// ĠInit ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĊĊĠĠĠ Ġoverride Ġfun Ġinit Views ( root View : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init Views ( root View , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġempty State View Ġ= Ġroot View . findViewById ( R . id . empty _ state _ view ) ĊĠĠĠĠĠĠĠ Ġloading ProgressBar Ġ= Ġroot View . findViewById ( R . id . loading _ progress _ bar ) ĊĊĠĠĠĠĠĠĠ Ġerror Panel Root Ġ= Ġroot View . findViewById ( R . id . error _ panel ) ĊĠĠĠĠĠĠĠ Ġerror Button Retry Ġ= Ġroot View . findViewById ( R . id . error _ button _ retry ) ĊĠĠĠĠĠĠĠ Ġerror TextView Ġ= Ġroot View . findViewById ( R . id . error _ message _ view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init Listeners () ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠRx View . click s ( error Button Retry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 3 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġon Retry Button Clicked () Ġ} ĊĊĠĠĠĠĠĠĠ Ġcomposite Disposable . add ( d ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġon Retry Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġreload Content () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġreload Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Loading ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĠĠĠ Ġ// ĠLoad ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġdo Initial Load Logic () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Loading ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġstart Loading ( force Load : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Loading () Ġcalled Ġwith : Ġforce Load Ġ= Ġ[$ force Load ]") ĊĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠ ĠisLoading . set ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĠĠĠ Ġ// ĠContract ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĊĠĠĠ Ġoverride Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( empty State View Ġ!= Ġnull ) Ġanimate View ( empty State View !! , Ġfalse , Ġ 1 5 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ProgressBar Ġ!= Ġnull ) Ġanimate View ( loading ProgressBar !! , Ġtrue , Ġ 4 0 0 ) ĊĠĠĠĠĠĠĠ Ġanimate View ( error Panel Root , Ġfalse , Ġ 1 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( empty State View Ġ!= Ġnull ) Ġanimate View ( empty State View !! , Ġfalse , Ġ 1 5 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ProgressBar Ġ!= Ġnull ) Ġanimate View ( loading ProgressBar !! , Ġfalse , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġanimate View ( error Panel Root , Ġfalse , Ġ 1 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Empty State () Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading . set ( false ) ĊĠĠĠĠĠĠĠ Ġif Ġ( empty State View Ġ!= Ġnull ) Ġanimate View ( empty State View !! , Ġtrue , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ProgressBar Ġ!= Ġnull ) Ġanimate View ( loading ProgressBar !! , Ġfalse , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġanimate View ( error Panel Root , Ġfalse , Ġ 1 5 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Error ( message : ĠString , Ġshow Retry Button : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" show Error () Ġcalled Ġwith : Ġmessage Ġ= Ġ[$ message ], Ġshow Retry Button Ġ= Ġ[$ show Retry Button ]") ĊĠĠĠĠĠĠĠ ĠisLoading . set ( false ) ĊĠĠĠĠĠĠĠ ĠInfo Cache . clear Cache () ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĊĠĠĠĠĠĠĠ Ġerror TextView . text Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġif Ġ( show Retry Button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate View ( error Button Retry , Ġtrue , Ġ 6 0 0 ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate View ( error Button Retry , Ġfalse , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġanimate View ( error Panel Root , Ġtrue , Ġ 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Result ( result : ĠI ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Result () Ġcalled Ġwith : Ġresult Ġ= Ġ[$ result ]") ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĠĠĠ Ġ// ĠError Ġhandling ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġimplementation Ġhandles Ġsome Ġgeneral Ġexceptions ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġif Ġthe Ġexception Ġwas Ġhandled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun ĠonError ( exception : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onError () Ġcalled Ġwith : Ġexception Ġ= Ġ[$ exception ]") ĊĠĠĠĠĠĠĠ ĠisLoading . set ( false ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Detached Ġ|| Ġis Removing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" onError () Ġis Ġdet ached Ġor Ġremoving Ġ= Ġ[$ exception ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Extractor Helper . is Inter rupted Cause d ( exception )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" onError () Ġis Inter rupted Cause d ! Ġ= Ġ[$ exception ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠRe Captcha Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Re Captcha Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( exception Ġis ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error ( getString ( R . string . network _ error ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Re Captcha Exception () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Re Captcha Exception () Ġcalled ") ĊĠĠĠĠĠĠĠ ĠToast . makeText ( activity , ĠR . string . rec aptcha _ request _ toast , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ// ĠStarting ĠRe Captcha ĠChallenge ĠActivity ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( Intent ( activity , ĠRe Captcha Activity :: class . java ), ĠRe Captcha Activity . REC AP T CHA _ REQUEST ) ĊĊĠĠĠĠĠĠĠ Ġshow Error ( getString ( R . string . rec aptcha _ request _ toast ), Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Un recover able Error ( exception : ĠThrowable , Ġuser Action : ĠUser Action , ĠserviceName : ĠString , Ġrequest : ĠString , Ġ@ String Res Ġerror Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġexception Ġlike Ġ" Parsing Exception : ĠMal formed Ġun accept able Ġurl : Ġhttps :// www . youtube . com / channel / UC 4 Z Ln CS 3 X 8 CI 4 Rpp O XT m T 4 g " ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġlink Ġis Ġa Ġchannel , Ġstill Ġrecover able . ĊĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġrecover Ġthis Ġkind Ġof Ġparsing Ġexceptions . ĊĠĠĠĠĠĠĠ Ġon Un recover able Error ( listOf ( exception ), Ġuser Action , ĠserviceName , Ġrequest , Ġerror Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Un recover able Error ( exception : ĠList < Throwable >, Ġuser Action : ĠUser Action , ĠserviceName P : ĠString ?, Ġrequest P : ĠString ?, Ġ@ String Res Ġerror Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠserviceName Ġ= ĠserviceName P ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Ġ= Ġrequest P ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Un recover able Error () Ġcalled Ġwith : Ġexception Ġ= Ġ[$ exception ]") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( serviceName Ġ== Ġnull ) ĠserviceName Ġ= Ġ" none " ĊĠĠĠĠĠĠĠ Ġif Ġ( request Ġ== Ġnull ) Ġrequest Ġ= Ġ" none " ĊĊĠĠĠĠĠĠĠ ĠError Activity . report Error ( context !! , Ġexception , ĠMainActivity :: class . java , Ġnull , ĠError Info . make ( user Action , ĠserviceName , Ġrequest , Ġerror Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Sn ackBar Error ( exception : ĠThrowable , Ġuser Action : ĠUser Action , ĠserviceName : ĠString , Ġrequest : ĠString , Ġ@ String Res Ġerror Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Sn ackBar Error ( listOf ( exception ), Ġuser Action , ĠserviceName , Ġrequest , Ġerror Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShow Ġa ĠSn ackBar Ġand Ġonly Ġcall ĠError Activity # report Error ĠIF Ġwe Ġa Ġfind Ġa Ġvalid Ġview Ġ( otherwise Ġthe Ġerror Ġscreen Ġappears ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshow Sn ackBar Error ( exception : ĠList < Throwable >, Ġuser Action : ĠUser Action , ĠserviceName : ĠString , Ġrequest : ĠString , Ġ@ String Res Ġerror Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" show Sn ackBar Error () Ġcalled Ġwith : Ġexception Ġ= Ġ[$ exception ], Ġuser Action Ġ= Ġ[$ user Action ], Ġrequest Ġ= Ġ[$ request ], Ġerror Id Ġ= Ġ[$ error Id ]") ĊĊĠĠĠĠĠĠĠ Ġvar Ġroot View : ĠView ? Ġ= Ġif Ġ( activity Ġ!= Ġnull ) Ġactivity !!. findViewById ( android . R . id . content ) Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( root View Ġ== Ġnull Ġ&& Ġview Ġ!= Ġnull ) Ġroot View Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġif Ġ( root View Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠError Activity . report Error ( context !! , Ġexception , ĠMainActivity :: class . java , Ġroot View , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Info . make ( user Action , ĠserviceName , Ġrequest , Ġerror Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĠĠĠ Ġ// ĠUtils ĊĠĠĠ Ġ// //////////////////////////////////////////////////////////////////////// / ĊĊĠĠĠ Ġprotected Ġfun Ġopen Url In Browser ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse ( url )) ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( intent , Ġactivity !!. getString ( R . string . share _ dialog _ title ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġshare Url ( subject : ĠString , Ġurl : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND ) ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ SUBJECT , Ġsubject ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ TEXT , Ġurl ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( intent , ĠgetString ( R . string . share _ dialog _ title ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġis GridLayout : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Mode Ġ= ĠPreference Manager . getDefault SharedPreferences ( activity ). getString ( getString ( R . string . list _ view _ mode _ key ), ĠgetString ( R . string . list _ view _ mode _ value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( list Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" list " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġresources . configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . is Layout Size At Least ( Configuration . SCREEN LAYOUT _ SIZE _ LARGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" auto ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" grid " Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠBase State Fragment :: class . java . simple Name ĊĠĠĠ Ġ} Ċ } Ċ