// ĠCopyright Ġ 2 0 1 7 ĠS our cer er ĠInc . ĠAll ĠRights ĠReserved . Ċ // ĠAuthor : ĠAn at oly ĠK is lov Ġ( an at oly @ s our cer er . io ) Ċ Ċ package Ġapp Ċ Ċ import Ġcom . github . kit tin un f . fuel . core . Fuel Error Ċ import Ġcom . github . kit tin un f . fuel . core . Fuel Manager Ċ import Ġcom . github . kit tin un f . fuel . core . Method Ċ import Ġcom . github . kit tin un f . fuel . core . Request Ċ import Ġcom . google . protobuf . InvalidProtocolBufferException Ċ import Ġjava . security . Invalid Parameter Exception Ċ Ċ type alias ĠParam Ġ= ĠPair < String , ĠString > Ċ Ċ /** Ċ Ġ* ĠGoogle ĠAnalytics Ġevents Ġtracking . Ċ Ġ*/ Ċ object ĠAnalytics Ġ{ ĊĠĠĠ Ġprivate Ġval ĠIS _ ENABLED Ġ= ĠBuild Config . IS _ GA _ ENABLED ĊĠĠĠ Ġprivate Ġval ĠBASE _ PATH Ġ= ĠBuild Config . GA _ BASE _ PATH ĊĠĠĠ Ġprivate Ġval ĠBASE _ URL Ġ= Ġ"/ virtual / app /" ĊĠĠĠ Ġprivate Ġval ĠPROTO COL _ VERSION Ġ= Ġ" 1 " ĊĠĠĠ Ġprivate Ġval ĠTR ACK ING _ ID Ġ= ĠBuild Config . GA _ TRACK ING _ ID ĊĠĠĠ Ġprivate Ġval ĠDATA _ SOURCE Ġ= Ġ" app " ĊĊĠĠĠ Ġprivate Ġval ĠH IT _ PAGE VIEW Ġ= Ġ" page view " ĊĠĠĠ Ġprivate Ġval ĠH IT _ EXCEPTION Ġ= Ġ" exception " ĊĊĠĠĠ Ġprivate Ġval Ġfuel Manager Ġ= ĠF uel Manager () ĊĊĠĠĠ Ġvar Ġuuid : ĠString Ġ= Ġ"" Ġ Ġ// ĠShould Ġbe Ġset Ġon Ġstart Ġof Ġthe Ġapp . ĊĠĠĠ Ġvar Ġusername : ĠString Ġ= Ġ"" Ġ Ġ// ĠShould Ġbe Ġset Ġon Ġsuccessful Ġauthorization . ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfuel Manager . basePath Ġ= ĠBASE _ PATH ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost ( params : ĠList < Param >): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfuel Manager . request ( Method . POST , Ġ"/ collect ", Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGoogle ĠAnalytics ĠMeasurement ĠProtocol Ġis Ġused Ġto Ġtrack Ġevents . ĊĠĠĠĠ Ġ* ĠUser Ġiteration Ġdata Ġis Ġsent Ġto ĠGA Ġendpoint Ġvia ĠPOST Ġrequest . ĊĠĠĠĠ Ġ* ĠEvents Ġ( or Ġhits ) Ġmapped Ġto Ġvirtual Ġurls Ġwith Ġ" Data ĠSource " Ġparameter . ĊĠĠĠĠ Ġ* ĠUsed Ġparameters : ĊĠĠĠĠ Ġ* Ġ- Ġv : ĠProtocol ĠVersion Ġ( Required ) ĊĠĠĠĠ Ġ* Ġ- Ġtid : ĠTracking ĠID Ġ- Ġused Ġto Ġspecify ĠGA Ġaccount Ġ( Required ) ĊĠĠĠĠ Ġ* Ġ- Ġcid : ĠClient ĠID Ġ- Ġanonymous Ġclient Ġid Ġ( UUID Ġtype Ġ 4 ) ĊĠĠĠĠ Ġ* Ġ- Ġuid : ĠUser ĠID Ġ- Ġusername ĊĠĠĠĠ Ġ* Ġ- Ġt : ĠHit ĠType Ġ- Ġtype Ġof Ġevent ĊĠĠĠĠ Ġ* Ġ- Ġdp : ĠDocument ĠPath Ġ- Ġvirtual Ġurl ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrack Event ( event : ĠString , Ġparams : ĠList < Param > Ġ= ĠlistOf ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! IS _ ENABLED Ġ|| Ġ( username . isEmpty () Ġ&& Ġuuid . isEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġid Params Ġ= Ġmutable ListOf < Param >() ĊĠĠĠĠĠĠĠ Ġif Ġ( uuid . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Params . add (" cid " Ġto Ġuuid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( username . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Params . add (" uid " Ġto Ġusername ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Params Ġ= ĠlistOf (" v " Ġto ĠPROTO COL _ VERSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tid " Ġto ĠTR ACK ING _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ds " Ġto ĠDATA _ SOURCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" t " Ġto ĠH IT _ PAGE VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dp " Ġto ĠBASE _ URL Ġ+ Ġevent ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġevent Ġto ĠGA Ġwith Ġunit ed Ġparams . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġ_, Ġresult ) Ġ= Ġpost ( params Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Params . filter Ġ{ Ġ! params . contains ( it ) Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Params ). response String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġe ) Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ!= Ġnull ) Ġ{ Ġthrow Ġe Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . error ( e , Ġ" Error Ġwhile Ġsending ĠGA Ġreport ", Ġlog Only Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrack Error ( e : ĠThrowable ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( e Ġ!= Ġnull ) Ġget Error Url ( e ) Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġif Ġ( url . isNotEmpty ()) Ġ"/" Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġtrack Event (" error " Ġ+ Ġseparator Ġ+ Ġurl , ĠlistOf (" t " Ġto ĠH IT _ EXCEPTION )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Error Url ( e : ĠThrowable ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMapping Ġfor Ġrequest Ġexceptions . ĊĠĠĠĠĠĠĠ Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF uel Error Ġ-> Ġreturn Ġ" request " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid Parameter Exception Ġ-> Ġreturn Ġ" request / parsing " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid ProtocolBufferException Ġ-> Ġreturn Ġ" request / parsing " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġconcrete Ġclass Ġof Ġexception Ġname Ġremoving Ġall Ġcommon Ġparts . ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġe . java Class . simple Name . replace (" Exception ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" Error ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" Throwable ", Ġ"") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name . length Ġ== Ġ 0 Ġ|| Ġname . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDiv ide ĠCamel Case d Ġwords Ġin Ġclass Ġname Ġby Ġdas hes . ĊĠĠĠĠĠĠĠ Ġval Ġname Capital ized Ġ= Ġname . toUpperCase () ĊĠĠĠĠĠĠĠ Ġvar Ġurl Ġ= Ġname [ 0 ]. toString () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. name . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name [ i ] Ġ== Ġname Capital ized [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ+= Ġ"-" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ+= Ġname [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġurl . toLowerCase () ĊĠĠĠ Ġ} Ċ } Ċ