/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 Ġ- Ġpresent ĠIn structure , ĠInc . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* ĠĠĠĠ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* ĠĠĠĠ Ġthe ĠFree ĠSoftware ĠFoundation , Ġversion Ġ 3 Ġof Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* ĠĠĠĠ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* ĠĠĠĠ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* ĠĠĠĠ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . Ġ ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . in structure . p anda utils . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . google . firebase . crash ly t ics . Firebase Crash ly t ics Ċ import Ġcom . in structure . canvas api 2 . managers . OAuth Manager Ċ import Ġcom . in structure . canvas api 2 . models . Authenticated Session Ċ import Ġcom . in structure . canvas api 2 . utils . we ave . await Api Ċ import Ġcom . in structure . p anda utils . R Ċ import Ġcom . in structure . p anda utils . discussion s . Dis cussion Html Templates Ċ import Ġcom . in structure . p anda utils . views . Canvas WebView Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* ĠClass Ġthat Ġhandles Ġdifferent Ġkind Ġof Ġhtml Ġcontent Ġmodifications , Ġin Ġcase Ġwe Ġhave ĠIf rame s , Ċ Ġ* Ġbecause Ġthe ĠAndroid ĠWebView Ġcan 't Ġhandle Ġit Ġwell . ĠImplementation Ġis Ġbased Ġon Ġthe Ġ[ Web W iew Extensions . kt ] Ċ Ġ*/ Ċ class ĠHtml Content Formatter ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġcrash ly t ics : ĠFirebase Crash ly t ics , ĊĠĠĠ Ġprivate Ġval Ġo Auth Manager : ĠOAuth Manager Ċ ) Ġ{ ĊĊĠĠĠ Ġsuspend Ġfun Ġformat Html With I frames ( html : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( html . contains ("< iframe ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew HTML : ĠString Ġ= Ġhtml ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġneed Ġto Ġfind ĠLT Is Ġby Ġlooking Ġfor Ġiframe s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiframe Matcher Ġ= ĠPattern . compile ("< iframe ( .| \\ n )* ? iframe > "). matcher ( html ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iframe Matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiframe Ġ= Ġiframe Matcher . group ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfound Ġan Ġiframe , Ġwe Ġneed Ġto Ġdo Ġa Ġfew Ġthings ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠPattern . compile (" src =\" ([ ^\ "] +)\ "" ). matcher ( iframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġfind Ġthe Ġsrc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSn ag Ġthat Ġsrc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Url Ġ= Ġmatcher . group ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Url . contains (" external _ tools ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġthe ĠL TI Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew I frame Ġ= Ġexternal Tool I frame ( src Url , Ġiframe , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġnew HTML . replace ( iframe , Ġnew I frame ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( iframe . contains (" id =\" cn vs _ content \"" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġthe Ġcn vs _ content Ġspecial Ġcase Ġfor Ġsome Ġsch ools ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthenticated Url Ġ= Ġauthenticate L TI Url ( src Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew I frame Ġ= Ġiframe . replace ( src Url , Ġauthenticated Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġnew HTML . replace ( iframe , Ġnew I frame ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iframe . contains (" overflow : Ġscroll ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew I frame Ġ= Ġiframe With Link ( src Url , Ġiframe , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġnew HTML . replace ( iframe , Ġnew I frame ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠDis cussion Html Templates . get Topic Header ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Tablet Ġ= Ġcontext . resources . getBoolean ( R . bool . is Device Tablet ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġdocument . replace ("__ HEADER _ CONTENT __", Ġnew HTML ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġnew HTML . replace ("__ L TI _ BUTTON _ WIDTH __", Ġif Ġ( is Tablet ) Ġ" 3 2 0 px " Ġelse Ġ" 1 0 0 % ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġnew HTML . replace ("__ L TI _ BUTTON _ M ARGIN __", Ġif Ġ( is Tablet ) Ġ" 0 px " Ġelse Ġ" auto ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCanvas WebView . apply Work Around For Double Sl ashes As Url Source ( new HTML ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhtml ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrash ly t ics . record Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhtml ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġexternal Tool I frame ( src Url : ĠString , Ġiframe : ĠString , Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġauthenticate Ġthe Ġsrc Ġurl Ġand Ġreplace Ġit Ġwithin Ġthe Ġiframe ĊĠĠĠĠĠĠĠ Ġval Ġl ti Url Ġ= ĠURL Encoder . encode ( src Url , Ġ" UTF - 8 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġauthenticated Url Ġ= Ġauthenticate L TI Url ( src Url ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġneed Ġto Ġreplace Ġthe Ġiframe s Ġsrc Ġurl Ġwith Ġthe Ġauthenticated Ġurl ĊĠĠĠĠĠĠĠ Ġval Ġnew I frame Ġ= Ġiframe . replace ( src Url , Ġauthenticated Url ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWith Ġthat Ġdone , Ġwe Ġneed Ġto Ġmake Ġthe ĠL TI Ġlaunch Ġbutton ĊĠĠĠĠĠĠĠ Ġval Ġbutton Ġ= Ġ"</ br >< p >< div Ġclass =\" lt i _ button \" ĠonClick =\" on L ti Tool Button Pressed ('% s ') \"> % s </ div ></ p >" ĊĠĠĠĠĠĠĠ Ġval Ġhtml Button Ġ= ĠString . format ( button , Ġl ti Url , Ġcontext . resources . getString ( R . string . utils _ launch External Tool )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġadd Ġthe Ġlaunch Ġbutton Ġalong Ġwith Ġthe Ġnew Ġiframe Ġwith Ġthe Ġupdated ĠURL ĊĠĠĠĠĠĠĠ Ġreturn Ġnew I frame Ġ+ Ġhtml Button ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġauthenticate L TI Url ( lt i Url : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġawait Api < Authenticated Session > Ġ{ Ġo Auth Manager . get Authenticated Session ( lt i Url , Ġit ) Ġ}. session Url ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġiframe With Link ( src Url : ĠString , Ġiframe : ĠString , Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbutton Text Ġ= Ġcontext . getString ( R . string . load Full Content ) ĊĠĠĠĠĠĠĠ Ġval Ġhtml Button Ġ= Ġ"</ br >< p >< div Ġclass =\" lt i _ button \" ĠonClick =\" location . href =\' $ src Url \' \"> $ button Text </ div ></ p >" ĊĊĠĠĠĠĠĠĠ Ġreturn Ġiframe Ġ+ Ġhtml Button ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Authenticated L ti Url ( html : ĠString , Ġauthenticated Session Url : ĠString ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( authenticated Session Url Ġ== Ġnull ) Ġreturn Ġhtml ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġneed Ġto Ġswap Ġout Ġpart Ġof Ġthe Ġold Ġurl Ġfor Ġthis Ġnew Ġauthenticated Ġurl ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠPattern . compile (" src =\" ([^ ; ]+) "). matcher ( html ) ĊĠĠĠĠĠĠĠ Ġvar Ġnew HTML : ĠString Ġ= Ġhtml ĊĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġwant Ġto Ġchange Ġthe Ġurls Ġthat Ġare Ġpart Ġof Ġan Ġexternal Ġtool , Ġnot Ġeverything Ġ( like Ġav atars ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. matcher . group Count ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Url Ġ= Ġmatcher . group ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Url . contains (" external _ tools ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew HTML Ġ= Ġhtml . replace ( new Url , Ġauthenticated Session Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew HTML ĊĠĠĠ Ġ} Ċ }