@ file : Suppress (" unused ") Ċ Ċ package Ġcom . nek 1 2 . android utils . extensions . android Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . webkit .* Ċ import Ġandroidx . core . net . to Uri Ċ Ċ /** Ċ Ġ* ĠA Ġlistener Ġfor Ġevents Ġthat Ġhappen Ġin Ġ[ Web Client ] Ċ Ġ*/ Ċ interface ĠWeb Client Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIs Ġtriggered Ġwhen Ġwhole Ġpage Ġcould Ġnot Ġbe Ġloaded Ġ( not Ġtriggered Ġfor Ġcss , Ġjs , Ġads Ġ& Ġother Ġerrors ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonError ( url : ĠUri ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrigger ed Ġ** once ** Ġwhen Ġthe Ġpage Ġhas Ġfinished Ġloading ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonSuccess ( url : ĠUri ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrigger ed Ġwhen Ġyou Ġcall Ġ[ Web Client . load ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Started Loading ( url : ĠUri ?) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrigger ed Ġin Ġthe Ġfollowing Ġsituations : ĊĠĠĠĠ Ġ* Ġ 1 . ĠWhen Ġattempting Ġto Ġload Ġany Ġurl Ġthat Ġis Ġnot Ġin Ġ[ Web Client . allowed Hosts ] ĊĠĠĠĠ Ġ* Ġ 2 . ĠWhen Ġopening Ġa Ġlink Ġthat Ġis Ġnot Ġbrowser - open able Ġ( i . e . Ġmail to :) ĊĠĠĠĠ Ġ* Ġ 3 . ĠWhen Ġattempting Ġto Ġopen Ġan Ġunknown Ġlink Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Foreign Url Encounter ed ( url : ĠUri , Ġlink Type : ĠLink Type ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrigger ed Ġwhen Ġopening Ġa Ġlink Ġpointing Ġto Ġa Ġfile , Ġi . e . Ġhttps :// < blah >. pdf Ġetc . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Requested File Download ( url : ĠUri , ĠfileName : ĠString , Ġmime type : ĠString ?) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġweb Ġclient Ġthat Ġsolves Ġmany Ġproblems Ġof Ġ[ WebView Client ] Ġand Ġprovides Ġa Ġnice ĠAPI Ġto Ġuse . Ċ Ġ* Ġ** This Ġclient Ġautomatically Ġsets ĠJS Ġas Ġenabled **. ĠYou Ġcan Ġoverride Ġthis Ġbehavior Ġby Ġcalling Ċ Ġ* Ġ[ Web Settings . set JavaScript Enabled ]. ĠOnly Ġdomains Ġin Ġ[ allowed Hosts ] Ġwill Ġbe Ġopened Ġin Ġthe Ġweb view , Ġothers Ġwill Ċ Ġ* Ġtrigger Ġ[ Web Client Listener . on Foreign Url Encounter ed ]. ĠDon 't Ġforget Ġto Ġ[ attach ] Ġthe Ġclient Ġin Ġon View Created Ġand Ċ Ġ* Ġ[ detach ] Ġit Ġin Ġon Destroy View . Ċ Ġ*/ Ċ @ Suppress Lint (" Set JavaScript Enabled ") Ċ open Ġclass ĠWeb Client ( ĊĠĠĠ Ġprivate Ġval Ġallowed Hosts : ĠList < String ? >, Ċ ): ĠWebView Client (), ĠDownload Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠwebView : ĠWebView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠWeb Client Listener ? Ġ= Ġnull ĊĠĠĠ Ġval Ġurl Ġget () Ġ= ĠwebView ?. url ĊĊĠĠĠ Ġopen Ġval Ġcan Go Back : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠwebView ?. can Go Back () Ġ?: Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRefresh Ġcurrent Ġpage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġreload () Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. reload () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġload ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. load Url ( uri . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġin Ġ[ android x . appcompat . app . AppCompatActivity . on Save InstanceState ] Ġstate Ġor ĊĠĠĠĠ Ġ* Ġ[ android x . fragment . app . Fragment . on ViewState Restore d ], Ġ** if Ġyou Ġdo Ġnot Ġsave Ġstate , ĠwebView Ġwill Ġnot Ġsave Ġit Ġfor ĊĠĠĠĠ Ġ* Ġyou ! ** ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġrestore State ( in State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. restore State ( in State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġin Ġ[ android x . fragment . app . Fragment . on Save InstanceState ] Ġto Ġ** save Ġweb view Ġstate **. ĠIf Ġyou Ġdo Ġnot ĊĠĠĠĠ Ġ* Ġcall Ġthis , Ġ** webview Ġwon 't Ġsave Ġit Ġfor Ġyou ! ** ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsave State ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. save State ( out State ) ĊĠĠĠĠĠĠĠ Ġ// TODO : ĠRestore Ġand Ġsave Ġclient - specific Ġfields ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġin Ġ[ android x . fragment . app . Fragment . on View Created ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġattach ( ĊĠĠĠĠĠĠĠ ĠwebView : ĠWebView , ĊĠĠĠĠĠĠĠ Ġlistener : ĠWeb Client Listener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġuser Agent : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġjava Script Enabled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġ): ĠWeb Client Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . web View Ġ= ĠwebView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset JavaScript Enabled ( java Script Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloads Images Autom atically Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Wide View Port Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent ?. let Ġ{ Ġuser Agent String Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload With Overview Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Script Can Open Windows Autom atically Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Download Listener ( this @ Web Client ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Chrome Client Ġ= ĠWeb Chrome Client () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠwebView Client Ġ= Ġthis @ Web Client ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġin Ġ[ android x . fragment . app . Fragment . on Destroy View ]. ĠIf Ġyou Ġdo Ġnot Ġcall Ġthis , Ġyou Ġwill Ġget Ġcrashes Ġin ĊĠĠĠĠ Ġ* Ġruntime Ġand Ġa Ġmemory Ġleak ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġdetach () Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġgo Back () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( can Go Back ) ĠwebView ?. go Back () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġclear History () Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. clear History () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġclear All Data () Ġ{ ĊĠĠĠĠĠĠĠ ĠwebView ?. clear History () ĊĠĠĠĠĠĠĠ ĠwebView ?. clear Cache ( true ) ĊĠĠĠĠĠĠĠ ĠwebView ?. clear FormData () ĊĠĠĠĠĠĠĠ ĠWeb Storage . getInstance (). delete All Data (); ĊĠĠĠĠĠĠĠ ĠCookie Manager . getInstance (). removeAll Cookies ( null ); ĊĠĠĠĠĠĠĠ ĠCookie Manager . getInstance (). flush (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshould Override Url Loading ( view : ĠWebView ?, Ġurl : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Should Override Url Loading , Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġurl ?. to Uri () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ== Ġnull Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuri . host Ġin Ġallowed Hosts Ġ&& Ġuri . link Type Ġ== ĠLink Type . Web Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Foreign Url Encounter ed ( uri , Ġuri . link Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Page Finished ( view : ĠWebView ?, Ġurl : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Page Finished , Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġsuper . on Page Finished ( view , Ġurl ) ĊĠĠĠĠĠĠĠ Ġ// work around Ġbug Ġwhen Ġon Page Finished Ġis Ġtriggered Ġ 3 Ġtimes , Ġlast Ġone Ġis Ġfor Ġ 1 0 0 % ĊĠĠĠĠĠĠĠ Ġif Ġ( view ?. progress Ġ== Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Success ( url ?. to Uri ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Page Started ( view : ĠWebView ?, Ġurl : ĠString ?, Ġfav icon : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Page Started , Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġsuper . on Page Started ( view , Ġurl ?. to Uri ()?. as Https . toString (), Ġfav icon ) ĊĠĠĠĠĠĠĠ Ġlistener ?. on Started Loading ( url ?. to Uri ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// On Received Error Ġindicates Ġno Ġconnection ĊĠĠĠ Ġoverride Ġfun Ġon Received Error ( ĊĠĠĠĠĠĠĠ Ġview : ĠWebView ?, ĊĠĠĠĠĠĠĠ Ġrequest : ĠWeb Resource Request ?, ĊĠĠĠĠĠĠĠ Ġerror : ĠWeb Resource Error ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Received Error ( view , Ġrequest , Ġerror ) ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Web view Ġerror : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġ// only Ġhandle Ġthe Ġmain Ġframe Ġbecause Ġwe Ġget Ġa Ġbunch Ġof Ġerrors Ġfrom Ġimages , Ġads Ġetc . ĊĠĠĠĠĠĠĠ Ġif Ġ( request ?. is For Main Frame Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . url . scheme Ġ== Ġ" http ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Try Ġto Ġredirect Ġto Ġhttps Ġlinks Ġif Ġpolicy Ġdoes Ġnot Ġallow Ġhttp . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload ( request . url . as Https ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. onError ( request . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// when Ġwe Ġencounter Ġa Ġlink Ġto Ġa Ġfile , Ġjust Ġopen Ġit Ġin Ġthe Ġbrowser , Ġlet Ġthe Ġsystem Ġhandle Ġit ĊĠĠĠ Ġoverride Ġfun Ġon Download Start ( ĊĠĠĠĠĠĠĠ Ġurl : ĠString ?, ĊĠĠĠĠĠĠĠ Ġuser Agent : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcontent Disposition : ĠString ?, ĊĠĠĠĠĠĠĠ Ġmime type : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcontent Length : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName : ĠString ? Ġ= ĠURL Util . guess FileName ( url , Ġcontent Disposition , Ġmime type ) ĊĠĠĠĠĠĠĠ Ġif Ġ( url ?. to Uri () Ġ!= Ġnull Ġ&& ĠfileName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Requested File Download ( url . to Uri (), ĠfileName , Ġmime type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprotected Ġconst Ġval ĠTAG Ġ= Ġ" Web Client " ĊĠĠĠ Ġ} Ċ } Ċ