/* Ċ Ġ* ĠAndroid ĠSDK Ġfor ĠM atom o Ċ Ġ* Ċ Ġ* Ġ@ link Ġhttps :// github . com / mat omo - org / mat omo - android - sdk Ċ Ġ* Ġ@ license Ġhttps :// github . com / mat omo - org / mat omo - sdk - android / blob / master / LICENSE ĠBSD - 3 ĠClause Ċ Ġ*/ Ċ package Ġorg . mat omo . sdk Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġorg . mat omo . sdk . dispatcher . Dispatch Mode Ċ import Ġorg . mat omo . sdk . dispatcher . Dispatch Mode . Companion . fromString Ċ import Ġorg . mat omo . sdk . dispatcher . Dispatcher Ċ import Ġorg . mat omo . sdk . dispatcher . Packet Ċ import Ġorg . mat omo . sdk . tools . Objects . equals Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . Date Ċ import Ġjava . util . Linked HashSet Ċ import Ġjava . util . Locale Ċ import Ġjava . util . Random Ċ import Ġjava . util . UUID Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* ĠMain Ġtracking Ġclass Ċ Ġ* ĠThis Ġclass Ġis Ġthread safe . Ċ Ġ*/ Ċ class ĠTracker ( val Ġmat omo : ĠM atom o , Ġconfig : ĠTracker Builder ) Ġ{ ĊĠĠĠ Ġval Ġapi Url : ĠString Ġ= Ġconfig . api Url ĊĠĠĠ Ġval Ġsite Id : ĠInt Ġ= Ġconfig . site Id ĊĠĠĠ Ġprivate Ġval Ġm Default Application BaseUrl : ĠString Ġ= Ġconfig . application BaseUrl ĊĠĠĠ Ġprivate Ġval Ġm Tracking Lock Ġ= ĠAny () ĊĠĠĠ Ġprivate Ġval Ġm Dispatcher : ĠDispatcher ĊĠĠĠ Ġval Ġname : ĠString Ġ= Ġconfig . tracker Name ĊĠĠĠ Ġprivate Ġval Ġm Random Anti Caching Value Ġ= ĠRandom ( Date (). time ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠM atom o Ġwill Ġuse Ġthe Ġcontent Ġof Ġthis Ġobject Ġto Ġfill Ġin Ġmissing Ġvalues Ġbefore Ġany Ġtransmission . ĊĠĠĠĠ Ġ* ĠWhile Ġyou Ġcan Ġmodify Ġit 's Ġvalues , Ġyou Ġcan Ġalso Ġjust Ġset Ġthem Ġin Ġyour Ġ[ Track Me ] Ġobject Ġas Ġalready Ġset Ġvalues Ġwill Ġnot Ġbe Ġoverwritten . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġdefault ĠTrack Me Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdefault Track Me Ġ= ĠTrack Me () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġtesting Ġpurposes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġquery Ġof Ġthe Ġevent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġlast Event X : ĠTrack Me ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġis Ġ 3 0 min Ġ( 3 0 * 6 0 * 1 0 0 0 ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġsession Ġtimeout Ġvalue Ġin Ġmil ise conds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsession Timeout Ġ= Ġ( 3 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ). to Long () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġm Session StartTime : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Opt Out : ĠBoolean ĊĠĠĠ Ġprivate Ġval Ġm Tracking Callbacks Ġ= ĠLinked HashSet < Callback >() ĊĠĠĠ Ġprivate Ġvar Ġm Dispatch Mode : ĠDispatch Mode ? Ġ= Ġnull ĊĠĠĠ Ġfun Ġadd Tracking Callback ( callback : ĠCallback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tracking Callbacks . add ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Tracking Callback ( callback : ĠCallback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Tracking Callbacks . remove ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġto Ġdisable Ġthis ĠTracker , Ġe . g . Ġif Ġthe Ġuser Ġopt ed Ġout Ġof Ġtracking . ĊĠĠĠĠ Ġ* ĠThe ĠTracker Ġwill Ġpersist Ġthe Ġchoice Ġand Ġremain Ġdisable Ġon Ġnext Ġinstance Ġcreation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Opt Out : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Opt Out ĊĠĠĠĠĠĠĠ Ġset ( opt Out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Opt Out Ġ= Ġopt Out ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Boolean ( PRE F _ KEY _ TRACK ER _ OP TO UT , Ġopt Out ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatcher . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart New Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Tracking Lock ) Ġ{ Ġm Session StartTime Ġ= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Session Timeout ( milliseconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Tracking Lock ) Ġ{ Ġsession Timeout Ġ= Ġmilliseconds . to Long () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġall Ġqueued Ġevents Ġin Ġbackground Ġthread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdispatch () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Opt Out ) Ġreturn ĊĠĠĠĠĠĠĠ Ġm Dispatcher . force Dispatch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġall Ġqueued Ġevents Ġand Ġblock Ġuntil Ġprocessing Ġis Ġcomplete ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdispatch Blocking () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Opt Out ) Ġreturn ĊĠĠĠĠĠĠĠ Ġm Dispatcher . force Dispatch Blocking () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġinterval Ġto Ġ 0 Ġto Ġdispatch Ġevents Ġas Ġsoon Ġas Ġthey Ġare Ġqueued . ĊĠĠĠĠ Ġ* ĠIf Ġa Ġnegative Ġvalue Ġis Ġused Ġthe Ġdispatch Ġtimer Ġwill Ġnever Ġrun , Ġa Ġmanual Ġdispatch Ġmust Ġbe Ġused . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdispatch Interval Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Dispatch Interval ( dispatch Interval : ĠLong ): ĠTracker Ġ{ ĊĠĠĠĠĠĠĠ Ġm Dispatcher . dispatch Interval Ġ= Ġdispatch Interval ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġif Ġwhen Ġdis patched , Ġposted ĠJSON Ġmust Ġbe ĠG z ipped . ĊĠĠĠĠ Ġ* ĠNeed Ġto Ġbe Ġhandle Ġfrom Ġweb Ġserver Ġside Ġwith Ġmod _ def late / APACHE Ġlua _ zlib / N GINX . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdispatch Gz ipped Ġboolean ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Dispatch Gz ipped ( dispatch Gz ipped : ĠBoolean ): ĠTracker Ġ{ ĊĠĠĠĠĠĠĠ Ġm Dispatcher . dispatch Gz ipped Ġ= Ġdispatch Gz ipped ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġdispatch Interval : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Dispatcher . dispatch Interval ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSee Ġ[. set Offline Cache Age ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġmaximum Ġcache Ġage Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġhow Ġlong Ġevents Ġshould Ġbe Ġstored Ġif Ġthey Ġcould Ġnot Ġbe Ġsend . ĊĠĠĠĠ Ġ* ĠEvents Ġolder Ġthan Ġthe Ġset Ġlimit Ġwill Ġbe Ġdiscarded Ġon Ġthe Ġnext Ġdispatch Ġattempt .< br ></ br > ĊĠĠĠĠ Ġ* ĠThe ĠM atom o Ġbackend Ġaccepts Ġback dated Ġevents Ġfor Ġup Ġto Ġ 2 4 Ġhours Ġby Ġdefault . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ& gt ; 0 Ġ= Ġlimit Ġin Ġms < br ></ br > ĊĠĠĠĠ Ġ* Ġ 0 Ġ= Ġun limited < br ></ br > ĊĠĠĠĠ Ġ* Ġ- 1 Ġ= Ġdisabled Ġoffline Ġcache < br ></ br > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġoffline Cache Age : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpreferences . getLong ( PRE F _ KEY _ OFF LINE _ CACHE _ AGE , Ġ( 2 4 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ). to Long ()) ĊĠĠĠĠĠĠĠ Ġset ( age ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Long ( PRE F _ KEY _ OFF LINE _ CACHE _ AGE , Ġage ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaximum Ġsize Ġthe Ġoffline Ġcache Ġis Ġallowed Ġto Ġgrow Ġto . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġsize Ġin Ġbyte ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHow Ġlarge Ġthe Ġoffline Ġcache Ġmay Ġbe . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġlimit Ġis Ġreached Ġthe Ġoldest Ġfiles Ġwill Ġbe Ġdeleted Ġfirst . ĊĠĠĠĠ Ġ* ĠEvents Ġolder Ġthan Ġthe Ġset Ġlimit Ġwill Ġbe Ġdiscarded Ġon Ġthe Ġnext Ġdispatch Ġattempt .< br ></ br > ĊĠĠĠĠ Ġ* ĠThe ĠM atom o Ġbackend Ġaccepts Ġback dated Ġevents Ġfor Ġup Ġto Ġ 2 4 Ġhours Ġby Ġdefault . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ& gt ; 0 Ġ= Ġlimit Ġin Ġbyte < br ></ br > ĊĠĠĠĠ Ġ* Ġ 0 Ġ= Ġun limited < br ></ br > ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġoffline Cache Size : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpreferences . getLong ( PRE F _ KEY _ OFF LINE _ CACHE _ SIZE , Ġ( 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ). to Long ()) ĊĠĠĠĠĠĠĠ Ġset ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Long ( PRE F _ KEY _ OFF LINE _ CACHE _ SIZE , Ġsize ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġdispatch Ġbehavior . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠDispatch Mode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġdispatch Ġmode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see ĠDispatch Mode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġdispatch Mode : ĠDispatch Mode ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Dispatch Mode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġpreferences . getString ( PRE F _ KEY _ DISPATCH ER _ MODE , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatch Mode Ġ= Ġfrom String ( raw ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Dispatch Mode Ġ== Ġnull ) Ġm Dispatch Mode Ġ= ĠDispatch Mode . ALWAYS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Dispatch Mode !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatch Mode Ġ= Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ!== ĠDispatch Mode . EXCEPTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( PRE F _ KEY _ DISPATCH ER _ MODE , Ġmode . toString ()). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatcher . dispatch Mode Ġ= Ġmode ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefines Ġthe ĠUser ĠID Ġfor Ġthis Ġrequest . ĊĠĠĠĠ Ġ* ĠUser ĠID Ġis Ġany Ġnon Ġempty Ġunique Ġstring Ġidentifying Ġthe Ġuser Ġ( such Ġas Ġan Ġemail Ġaddress Ġor Ġa Ġusername ). ĊĠĠĠĠ Ġ* ĠTo Ġaccess Ġthis Ġvalue , Ġusers Ġmust Ġbe Ġlogged - in Ġin Ġyour Ġsystem Ġso Ġyou Ġcan ĊĠĠĠĠ Ġ* Ġfetch Ġthis Ġuser ĠID Ġfrom Ġyour Ġsystem , Ġand Ġpass Ġit Ġto ĠM atom o . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġspecified , Ġthe ĠUser ĠID Ġwill Ġbe Ġ" en forced ". ĊĠĠĠĠ Ġ* ĠThis Ġmeans Ġthat Ġif Ġthere Ġis Ġno Ġrecent Ġvisit Ġwith Ġthis ĠUser ĠID , Ġa Ġnew Ġone Ġwill Ġbe Ġcreated . ĊĠĠĠĠ Ġ* ĠIf Ġa Ġvisit Ġis Ġfound Ġin Ġthe Ġlast Ġ 3 0 Ġminutes Ġwith Ġyour Ġspecified ĠUser ĠID , ĊĠĠĠĠ Ġ* Ġthen Ġthe Ġnew Ġaction Ġwill Ġbe Ġrecorded Ġto Ġthis Ġexisting Ġvisit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId Ġpassing Ġnull Ġwill Ġdelete Ġthe Ġcurrent Ġuser - id . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset UserId ( userId : ĠString ?): ĠTracker Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . USER _ ID ] Ġ= ĠuserId ĊĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( PRE F _ KEY _ TRACK ER _ USER ID , ĠuserId ). apply () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġuser - id Ġstring , Ġeither Ġthe Ġone Ġyou Ġset Ġor Ġthe Ġone ĠM atom o Ġgenerated Ġfor Ġyou . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval ĠuserId : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdefault Track Me [ QueryParams . USER _ ID ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġunique Ġvisitor ĠID , Ġmust Ġbe Ġa Ġ 1 6 Ġcharacters Ġhexadecimal Ġstring . ĊĠĠĠĠ Ġ* ĠEvery Ġunique Ġvisitor Ġmust Ġbe Ġassigned Ġa Ġdifferent ĠID Ġand Ġthis ĠID Ġmust Ġnot Ġchange Ġafter Ġit Ġis Ġassigned . ĊĠĠĠĠ Ġ* ĠIf Ġthis Ġvalue Ġis Ġnot Ġset ĠM atom o Ġwill Ġstill Ġtrack Ġvis its , Ġbut Ġthe Ġunique Ġvisitor s Ġmetric Ġmight Ġbe Ġless Ġaccurate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġset Visitor Id ( visitor Id : ĠString ): ĠTracker Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( confirm Visitor Id Format ( visitor Id )) Ġdefault Track Me [ QueryParams . VIS ITOR _ ID ] Ġ= Ġvisitor Id ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvisitor Id : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdefault Track Me [ QueryParams . VIS ITOR _ ID ] ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġconfirm Visitor Id Format ( visitor Id : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( PATTERN _ VIS ITOR _ ID . matcher ( visitor Id ). matches ()) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Visitor Id : Ġ" Ġ+ Ġvisitor Id Ġ+ Ġ" Ġis Ġnot Ġof Ġvalid Ġformat , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġthe Ġformat Ġmust Ġmatch Ġthe Ġregular Ġexpression : Ġ" Ġ+ ĠP ATTERN _ VIS ITOR _ ID . pattern ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThere Ġparameters Ġare Ġonly Ġinteresting Ġfor Ġthe Ġvery Ġfirst Ġquery . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinject Initial Params ( track Me : ĠTrack Me ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Visit Time : ĠLong ĊĠĠĠĠĠĠĠ Ġvar Ġvisit Count : ĠLong ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Visit : ĠLong ĊĊĠĠĠĠĠĠĠ Ġ// ĠProtected Ġagainst ĠTrack ers Ġon Ġother Ġthreads Ġtrying Ġto Ġdo Ġthe Ġsame Ġthing . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġworks Ġbecause Ġthey Ġwould Ġuse Ġthe Ġsame Ġpreference Ġobject . ĊĠĠĠĠĠĠĠ Ġsynchronized ( preferences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Count Ġ= Ġ 1 Ġ+ Ġpreferences . getLong ( PRE F _ KEY _ TRACK ER _ VISIT COUNT , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Long ( PRE F _ KEY _ TRACK ER _ VISIT COUNT , Ġvisit Count ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( preferences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Visit Time Ġ= Ġpreferences . getLong ( PRE F _ KEY _ TRACK ER _ FIRST VISIT , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Visit Time Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Visit Time Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Long ( PRE F _ KEY _ TRACK ER _ FIRST VISIT , Ġfirst Visit Time ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( preferences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Visit Ġ= Ġpreferences . getLong ( PRE F _ KEY _ TRACK ER _ PREVIOUS VISIT , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Long ( PRE F _ KEY _ TRACK ER _ PREVIOUS VISIT , ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġtry Set Ġbecause Ġthe Ġdeveloper Ġcould Ġhave Ġmod ded Ġthese Ġafter Ġcreating Ġthe ĠTracker ĊĠĠĠĠĠĠĠ Ġdefault Track Me . try Set ( QueryParams . FIRST _ VISIT _ TIMESTAMP , Ġfirst Visit Time ) ĊĠĠĠĠĠĠĠ Ġdefault Track Me . try Set ( QueryParams . TOTAL _ NUMBER _ OF _ VIS ITS , Ġvisit Count ) ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Visit Ġ!= Ġ- 1 L ) Ġdefault Track Me . try Set ( QueryParams . PREVIOUS _ VISIT _ TIMESTAMP , Ġprevious Visit ) ĊĠĠĠĠĠĠĠ Ġtrack Me !!. try Set ( QueryParams . SESSION _ START , Ġdefault Track Me [ QueryParams . SESSION _ START ]) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . FIRST _ VISIT _ TIMESTAMP , Ġdefault Track Me [ QueryParams . FIRST _ VISIT _ TIMESTAMP ]) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . TOTAL _ NUMBER _ OF _ VIS ITS , Ġdefault Track Me [ QueryParams . TOTAL _ NUMBER _ OF _ VIS ITS ]) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . PREVIOUS _ VISIT _ TIMESTAMP , Ġdefault Track Me [ QueryParams . PREVIOUS _ VISIT _ TIMESTAMP ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThese Ġparameters Ġare Ġrequired Ġfor Ġall Ġqueries . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinject Base Params ( track Me : ĠTrack Me ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrack Me !!. try Set ( QueryParams . SITE _ ID , Ġsite Id ) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . RECORD , ĠDEFAULT _ RECORD _ VALUE ) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . API _ VERSION , ĠDEFAULT _ API _ VERSION _ VALUE ) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . RANDOM _ NUMBER , Ġm Random Anti Caching Value . nextInt ( 1 0 0 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . DATETIME _ OF _ REQUEST , ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss Z ", ĠLocale . US ). format ( Date ())) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . SEND _ IMAGE , Ġ" 0 ") ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . VIS ITOR _ ID , Ġdefault Track Me [ QueryParams . VIS ITOR _ ID ]) ĊĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . USER _ ID , Ġdefault Track Me [ QueryParams . USER _ ID ]) ĊĠĠĠĠĠĠĠ Ġvar Ġurl Path Ġ= Ġtrack Me [ QueryParams . URL _ PATH ] ĊĠĠĠĠĠĠĠ Ġif Ġ( urlPath Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Path Ġ= Ġdefault Track Me [ QueryParams . URL _ PATH ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! VALID _ URL S . matcher ( urlPath ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Builder Ġ= ĠStringBuilder ( m Default Application BaseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Default Application BaseUrl . endsWith ("/") Ġ&& Ġ! urlPath . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Builder . append ("/") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Default Application BaseUrl . endsWith ("/") Ġ&& Ġurl Path . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Path Ġ= Ġurl Path . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Path Ġ= Ġurl Builder . append ( urlPath ). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / mat omo - org / mat omo - sdk - android / issues / 9 2 ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . URL _ PATH ] Ġ= Ġurl Path ĊĠĠĠĠĠĠĠ Ġtrack Me [ QueryParams . URL _ PATH ] Ġ= Ġurl Path ĊĠĠĠĠĠĠĠ Ġif Ġ( last Event X Ġ== Ġnull Ġ|| Ġ! equals ( track Me [ QueryParams . USER _ ID ], Ġlast Event X ?. get ( QueryParams . USER _ ID ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / mat omo - org / mat omo - sdk - android / issues / 2 0 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . SCREEN _ RESOL UTION , Ġdefault Track Me [ QueryParams . SCREEN _ RESOL UTION ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . USER _ AGENT , Ġdefault Track Me [ QueryParams . USER _ AGENT ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Me . try Set ( QueryParams . LANGUAGE , Ġdefault Track Me [ QueryParams . LANGUAGE ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrack ( track Me : ĠTrack Me ): ĠTracker Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnew Track Me : ĠTrack Me ? Ġ= Ġtrack Me ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Tracking Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Session Ġ= ĠSystem . currentTimeMillis () Ġ- Ġm Session StartTime Ġ> Ġsession Timeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Session StartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinject Initial Params ( new Track Me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinject Base Params ( new Track Me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġm Tracking Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Track Me Ġ= Ġnew Track Me ?. run Ġ{ Ġcallback . on Track ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Track Me Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event X Ġ= Ġnew Track Me ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Opt Out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatcher . submit ( new Track Me ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpreferences : ĠSharedPreferences Ġby Ġlazy Ġ{ Ġmat omo . get Tracker Preferences ( this ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull Ġ|| Ġjava Class Ġ!= Ġother . java Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġtracker Ġ= Ġother Ġas ĠTracker ĊĠĠĠĠĠĠĠ Ġif Ġ( site Id Ġ!= Ġtracker . site Id ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( api Url Ġ!= Ġtracker . api Url ) Ġfalse Ġelse Ġname Ġ== Ġtracker . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġapi Url . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġsite Id ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġname . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġwe Ġare Ġin Ġdry - run Ġmode Ġthen Ġthis Ġwill Ġreturn Ġa Ġdata structure . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġdata structure Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġa Ġdata Ġstructure Ġhere Ġto Ġput Ġthe ĠDispatcher Ġinto Ġdry - run - mode . ĊĠĠĠĠ Ġ* ĠData Ġwill Ġbe Ġprocessed Ġbut Ġat Ġthe Ġlast Ġstep Ġjust Ġstored Ġinstead Ġof Ġtransmitted . ĊĠĠĠĠ Ġ* ĠSet Ġit Ġto Ġnull Ġto Ġdisable Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġdry Run Target : ĠMutable List < Packet >? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Dispatcher . dry Run Target ĊĠĠĠĠĠĠĠ Ġset ( dry Run Target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Dispatcher . dry Run Target Ġ= Ġdry Run Target ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġbe Ġcalled Ġafter Ġparameter Ġinjection Ġand Ġbefore Ġtransmission Ġwithin Ġ[ Tracker . track ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠBlock ing Ġwithin Ġthis Ġmethod Ġwill Ġblock Ġtracking . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtrack Me ĠThe Ġ` Track Me ` Ġthat Ġwas Ġpassed Ġto Ġ[ Tracker . track ] Ġafter Ġall Ġdata Ġhas Ġbeen Ġinjected . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġ` Track Me ` Ġthat Ġwill Ġbe Ġsend , Ġreturning ĠNULL Ġhere Ġwill Ġabort Ġtransmission . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Track ( track Me : ĠTrack Me ): ĠTrack Me ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠM atom o Ġdefault Ġparameter Ġvalues ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ UNKNOWN _ VALUE Ġ= Ġ" unknown " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TRUE _ VALUE Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ RECORD _ VALUE Ġ= ĠDEFAULT _ TRUE _ VALUE ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ API _ VERSION _ VALUE Ġ= Ġ" 1 " ĊĊĠĠĠĠĠĠĠ Ġ// ĠShared preference Ġkeys Ġfor Ġpersisted Ġvalues ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ OP TO UT Ġ= Ġ" tracker . opt out " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ USER ID Ġ= Ġ" tracker . userid " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ VIS ITOR ID Ġ= Ġ" tracker . visitor id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ FIRST VISIT Ġ= Ġ" tracker . first visit " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ VISIT COUNT Ġ= Ġ" tracker . visit count " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ TRACK ER _ PREVIOUS VISIT Ġ= Ġ" tracker . previous visit " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ KEY _ OFF LINE _ CACHE _ AGE Ġ= Ġ" tracker . cache . age " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ KEY _ OFF LINE _ CACHE _ SIZE Ġ= Ġ" tracker . cache . size " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP REF _ KEY _ DISPATCH ER _ MODE Ġ= Ġ" tracker . dispatcher . mode " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠVALID _ URL S Ġ= ĠPattern . compile ("^ (\\ w + )( ? :: // )( .+ ? )$ ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ATTERN _ VIS ITOR _ ID Ġ= ĠPattern . compile ("^ [ 0 - 9 a - f ]{ 1 6 }$ ") ĊĠĠĠĠĠĠĠ Ġfun Ġmake Random Visitor Id (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUUID . randomUUID (). toString (). replace ("- ". to Regex (), Ġ""). substring ( 0 , Ġ 1 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Dispatch Timeout (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Dispatcher . connection TimeOut ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Dispatch Timeout ( timeout : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Dispatcher . connection TimeOut Ġ= Ġtimeout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Opt Out Ġ= Ġpreferences . getBoolean ( PRE F _ KEY _ TRACK ER _ OP TO UT , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġm Dispatcher Ġ= Ġmat omo . dispatcher Factory . build ( this ) ĊĠĠĠĠĠĠĠ Ġm Dispatcher . dispatch Mode Ġ= Ġdispatch Mode ĊĠĠĠĠĠĠĠ Ġval ĠuserId Ġ= Ġpreferences . getString ( PRE F _ KEY _ TRACK ER _ USER ID , Ġnull ) ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . USER _ ID ] Ġ= ĠuserId ĊĠĠĠĠĠĠĠ Ġvar Ġvisitor Id Ġ= Ġpreferences . getString ( PRE F _ KEY _ TRACK ER _ VIS ITOR ID , Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( visitor Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor Id Ġ= Ġmake Random Visitor Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( PRE F _ KEY _ TRACK ER _ VIS ITOR ID , Ġvisitor Id ). apply () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . VIS ITOR _ ID ] Ġ= Ġvisitor Id ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . SESSION _ START ] Ġ= ĠDEFAULT _ TRUE _ VALUE ĊĠĠĠĠĠĠĠ Ġvar Ġresolution Ġ= ĠDEFAULT _ UNKNOWN _ VALUE ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġmat omo . device Helper . resolution ĊĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġnull ) Ġresolution Ġ= ĠString . format ("% sx % s ", Ġres [ 0 ], Ġres [ 1 ]) ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . SCREEN _ RESOL UTION ] Ġ= Ġresolution ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . USER _ AGENT ] Ġ= Ġmat omo . device Helper . userAgent ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . LANGUAGE ] Ġ= Ġmat omo . device Helper . user Language ĊĠĠĠĠĠĠĠ Ġdefault Track Me [ QueryParams . URL _ PATH ] Ġ= Ġconfig . application BaseUrl ĊĠĠĠ Ġ} Ċ }