/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* Ġ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 Ġim . vector . app . features . login 2 Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . http . Ssl Error Ċ import Ġandroid . os . Build Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . webkit . Ssl ErrorHandler Ċ import Ġandroid . webkit . Web Resource Request Ċ import Ġandroid . webkit . Web Resource Response Ċ import Ġandroid . webkit . WebView Ċ import Ġandroid . webkit . WebView Client Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . air bnb . mv rx . args Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġim . vector . app . R Ċ import Ġim . vector . app . core . utils . Asset Reader Ċ import Ġim . vector . app . databinding . Fragment Login Captcha Binding Ċ import Ġim . vector . app . features . login . Javascript Response Ċ import Ġim . vector . app . features . login . Login Captcha Fragment Argument Ċ import Ġorg . matrix . android . sdk . api . util . Matrix Json Parser Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . net . URL Decoder Ċ import Ġjava . util . Formatter Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠIn Ġthis Ġscreen , Ġthe Ġuser Ġis Ġasked Ġto Ġconfirm Ġhe Ġis Ġnot Ġa Ġrobot . Ċ Ġ*/ Ċ class ĠLogin Captcha Fragment 2 Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġasset Reader : ĠAsset Reader Ċ ) Ġ: ĠAbstract Login Fragment 2 < Fragment Login Captcha Binding >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Binding ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?): ĠFragment Login Captcha Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFragment Login Captcha Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġparams : ĠLogin Captcha Fragment Argument Ġby Ġargs () ĊĊĠĠĠ Ġprivate Ġvar Ġis WebView Loaded Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Suppress Lint (" Set JavaScript Enabled ") ĊĠĠĠ Ġprivate Ġfun Ġsetup WebView ( state : ĠLogin ViewState 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġviews . login Captcha We v View . settings . java Script Enabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġre Captcha Page Ġ= Ġasset Reader . read Asset File (" re Captcha Page . html ") Ġ?: Ġerror (" missing Ġasset Ġre Captcha Page . html ") ĊĊĠĠĠĠĠĠĠ Ġval Ġhtml Ġ= ĠFormatter (). format ( re Captcha Page , Ġparams . site Key ). toString () ĊĠĠĠĠĠĠĠ Ġval Ġmime Ġ= Ġ" text / html " ĊĠĠĠĠĠĠĠ Ġval Ġencoding Ġ= Ġ" utf - 8 " ĊĊĠĠĠĠĠĠĠ Ġval Ġhome Server Url Ġ= Ġstate . home Server Url Ġ?: Ġerror (" missing Ġurl Ġof Ġhome server ") ĊĠĠĠĠĠĠĠ Ġviews . login Captcha We v View . load Data With Base URL ( home Server Url , Ġhtml , Ġmime , Ġencoding , Ġnull ) ĊĠĠĠĠĠĠĠ Ġviews . login Captcha We v View . request Layout () ĊĊĠĠĠĠĠĠĠ Ġviews . login Captcha We v View . web View Client Ġ= Ġobject Ġ: ĠWebView Client () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Started ( view : ĠWebView ?, Ġurl : ĠString ?, Ġfav icon : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Page Started ( view , Ġurl , Ġfav icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShow Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews . login Captcha Progress . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Finished ( view : ĠWebView , Ġurl : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Page Finished ( view , Ġurl ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviews . login Captcha Progress . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Received Ssl Error ( view : ĠWebView , Ġhandler : ĠS sl ErrorHandler , Ġerror : ĠS sl Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## Ġon Received Ssl Error () Ġ: Ġ${ error . certificate }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( require Activity ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . ssl _ could _ not _ verify ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . ssl _ trust ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## Ġon Received Ssl Error () Ġ: Ġthe Ġuser Ġtrusted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . proceed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . ssl _ do _ not _ trust ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## Ġon Received Ssl Error () Ġ: Ġthe Ġuser Ġdid Ġnot Ġtrust ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Key Listener ( DialogInterface . On Key Listener Ġ{ Ġdialog , ĠkeyCode , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠKeyEvent . ACTION _ UP Ġ&& ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ BACK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ## Ġon Received Ssl Error () Ġ: Ġthe Ġuser Ġdis mis ses Ġthe Ġtrust Ġdialog .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Key Listener Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcommon Ġerror Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠonError ( errorMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" ## ĠonError () Ġ: Ġ$ errorMessage ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToast . makeText ( this @ Account Creation Captcha Activity , ĠerrorMessage , ĠToast . LENGTH _ LONG ). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġerror Ġcase , Ġclose Ġthis Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrun On Ui Thread ( Runnable Ġ{ Ġfinish () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" New Api ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Received Http Error ( view : ĠWebView , Ġrequest : ĠWeb Resource Request , Ġerror Response : ĠWeb Resource Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Received Http Error ( view , Ġrequest , Ġerror Response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . url . toString (). endsWith (" favicon . ico ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġthis Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( error Response . reason Phrase ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( error Response . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Deprecated (" Deprecated Ġin ĠJava ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Received Error ( view : ĠWebView , ĠerrorCode : ĠInt , Ġdescription : ĠString , Ġfailing Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Received Error ( view , ĠerrorCode , Ġdescription , Ġfailing Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Deprecated (" Deprecated Ġin ĠJava ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Override Url Loading ( view : ĠWebView ?, Ġurl : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url ?. startsWith (" js :") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson Ġ= Ġurl . substring ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjavascript Response : ĠJavascript Response ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠURL Ġdecode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Ġ= ĠURL Decoder . decode ( json , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjavascript Response Ġ= ĠMatrix Json Parser . getM oshi (). adapter ( Javascript Response :: class . java ). fromJson ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e , Ġ" ## Ġshould Override Url Loading (): Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġjavascript Response ?. response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( javascript Response ?. action Ġ== Ġ" verify Callback " Ġ&& Ġresponse Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin ViewModel . handle ( Login Action 2 . Captcha Done ( response )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogin ViewModel . handle ( Login Action 2 . Reset Signup ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate With State ( state : ĠLogin ViewState 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is WebView Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup WebView ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis WebView Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ