// ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠTwitter , ĠInc . Ċ // ĠLicensed Ġunder Ġthe ĠMo Pub ĠSDK ĠLicense ĠAgreement Ċ // Ġhttps :// www . m op ub . com / legal / sdk - license - agreement / Ċ Ċ package Ġcom . m op ub . network Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Looper Ċ import Ġandroid . webkit . Web Settings Ċ Ċ import Ġandroidx . collection . L ru Cache Ċ Ċ import Ġcom . m op ub . common . Constants Ċ import Ġcom . m op ub . common . Visible ForTesting Ċ import Ġcom . m op ub . common . logging . Mo Pub Log Ċ import Ġcom . m op ub . common . logging . Mo Pub Log . Sdk Log Event . CUSTOM Ċ import Ġcom . m op ub . common . util . Device Utils Ċ Ċ import Ġjava . io . File Ċ Ċ object ĠNetwork ing Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠCACHE _ DIRECTORY _ NAME Ġ= Ġ" m op ub - vol ley - cache " ĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ USER _ AGENT : ĠString ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġua Ġ: ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġua Ġ= ĠSystem . getProperty (" http . agent ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMo Pub Log . log ( CUSTOM , Ġ" Unable Ġto Ġget Ġsystem Ġuser Ġagent .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠDEFAULT _ USER _ AGENT Ġ= Ġua Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThese Ġare Ġvolatile Ġso Ġthat Ġdouble - checked Ġlocking Ġworks . ĊĠĠĠ Ġ// ĠSee Ġhttps :// en . wikipedia . org / wiki / Double - checked _ lock ing # Usage _ in _ Java ĊĠĠĠ Ġ// Ġfor Ġmore Ġinformation . ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġ@ get : Visible ForTesting ĊĠĠĠ Ġvar Ġrequest Queue : ĠMo Pub Request Queue ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġuser Agent : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġimage Loader : ĠMo Pub Image Loader ? Ġ= Ġnull ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġvar Ġurl Rew riter Ġ: ĠMo Pub Url Rew riter ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġpreviously Ġcached ĠWebView Ġuser Ġagent . ĠThis Ġreturns Ġthe Ġdefault Ġuser Agent Ġif Ġthe ĊĠĠĠĠ Ġ* ĠWebView Ġuser Ġagent Ġhas Ġnot Ġbeen Ġinitialized Ġyet . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBest - eff ort ĠString ĠWebView Ġuser Ġagent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġval Ġcached UserAgent : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġuser Agent Ġ?: ĠDEFAULT _ USER _ AGENT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġthe Ġscheme Ġthat Ġshould Ġbe Ġused Ġfor Ġall Ġurls . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ" https " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġval Ġscheme : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠConstants . HTTPS ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Request Queue ( context : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠDouble - check Ġlocking Ġto Ġinitialize . ĊĠĠĠĠĠĠĠ Ġrequest Queue Ġ?: Ġsynchronized ( Networking :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Queue Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Factory Ġ= ĠCustom SS LS ocket Factory . getDefault ( Constants . TEN _ SECONDS _ M ILL IS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Agent Ġ= ĠgetUser Agent ( context . application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvol ley Cache Dir Ġ= ĠFile ( context . cacheDir . path Ġ+ ĠFile . separator Ġ+ ĠCACHE _ DIRECTORY _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Rew riter ?. let Ġ{ Ġmo Pub Url Rew riter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĠMo Pub Request Queue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Agent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmo Pub Url Rew riter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvol ley Cache Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Queue Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġurl Ġre writer Ġis Ġnull , Ġreturn Ġa Ġrequest Ġqueue Ġwith Ġthe Ġdefault Ġurl Ġre writer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġstart Ġit . ĠThis Ġrequest Ġqueue Ġis Ġun usable . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Url Rew riter Ġ= Ġobject Ġ: ĠMo Pub Url Rew riter Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĠMo Pub Request Queue ( userAgent , Ġsocket Factory , Ġtemp Url Rew riter , Ġvol ley Cache Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetImage Loader ( context : ĠContext ) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠDouble - check Ġlocking Ġto Ġinitialize . ĊĠĠĠĠĠĠĠ Ġimage Loader Ġ?: Ġsynchronized ( Networking :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġget Request Queue ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Size Ġ= ĠDevice Utils . memory Cache Size Bytes ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Cache Ġ= Ġobject Ġ: ĠL ru Cache < String , ĠBitmap >( cache Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsize Of ( key : ĠString , Ġvalue : ĠBitmap ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvalue . row Bytes Ġ* Ġvalue . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMo Pub Image Loader ( queue , Ġobject Ġ: ĠMo Pub Image Loader . Image Cache Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Bitmap ( key : ĠString ) Ġ= Ġimage Cache . get ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġput Bitmap ( key : ĠString , Ġbitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Cache . put ( key , Ġbitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCache s Ġand Ġreturns Ġthe ĠWebView Ġuser Ġagent Ġto Ġbe Ġused Ġacross Ġall ĠSDK Ġrequests . ĠThis Ġis ĊĠĠĠĠ Ġ* Ġimportant Ġbecause Ġadvert is ers Ġexpect Ġthe Ġsame Ġuser Ġagent Ġacross Ġall Ġrequest , Ġimp ression , Ġand ĊĠĠĠĠ Ġ* Ġclick Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetUser Agent ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvolatile UserAgent Copy Ġ= Ġuser Agent ĊĠĠĠĠĠĠĠ Ġif Ġ(! volatile UserAgent Copy . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvolatile UserAgent Copy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWeb Views Ġmay Ġonly Ġbe Ġinstantiated Ġon Ġthe ĠUI Ġthread . ĠIf Ġanything Ġgoes ĊĠĠĠĠĠĠĠ Ġ// Ġwrong Ġwith Ġgetting Ġa Ġuser Ġagent , Ġuse Ġthe Ġsystem - specific Ġuser Ġagent . ĊĠĠĠĠĠĠĠ Ġif Ġ( Looper . my Looper () Ġ!= ĠL ooper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSince Ġwe Ġare Ġnot Ġon Ġthe Ġmain Ġthread , Ġreturn Ġthe Ġdefault Ġuser Ġagent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġnow . ĠDe fer Ġto Ġwhen Ġthis Ġis Ġrun Ġon Ġthe Ġmain Ġthread Ġto Ġactually ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġuser Ġagent . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDEFAULT _ USER _ AGENT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSome Ġcustom ĠROM s Ġmay Ġfail Ġto Ġget Ġa Ġuser Ġagent . ĠIf Ġthat Ġhappens , Ġreturn ĊĠĠĠĠĠĠĠ Ġ// Ġthe ĠAndroid Ġsystem Ġuser Ġagent . ĊĠĠĠĠĠĠĠ Ġvar Ġtemp UserAgent Ġ= ĠDEFAULT _ USER _ AGENT ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp UserAgent Ġ= ĠWeb Settings . getDefault UserAgent ( context ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMo Pub Log . log ( CUSTOM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġget Ġa Ġuser Ġagent . ĠDefault ing Ġto Ġthe Ġsystem Ġuser Ġagent .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġtemp UserAgent ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp UserAgent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġclear ForTesting () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Queue Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġimage Loader Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġuser Agent Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġset Request Queue ForTesting ( queue : ĠMo Pub Request Queue ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . request Queue Ġ= Ġqueue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġset Image Loader ForTesting ( image Loader : ĠMo Pub Image Loader ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . image Loader Ġ= Ġimage Loader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġset UserAgent ForTesting ( userAgent : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . userAgent Ġ= Ġuser Agent ĊĠĠĠ Ġ} Ċ } Ċ