package Ġcom . auth 0 . android . request . internal Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . core . os . Handler Compat Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . Executors Ċ Ċ /** Ċ Ġ* ĠThe Ġmaximum Ġconcurrent Ġthreads Ġto Ġexecute Ċ Ġ* Ġin Ġthe Ġbackground . ĠValue Ġtaken Ġfrom Ġthe ĠAndroid Ġdocs . Ċ Ġ* Ġ@ see Ġ< a Ġhref =" https :// developer . android . com / guide / background / threading # creating - multiple - threads "> Android : Ġcreating - multiple - threads </ a > Ċ Ġ*/ Ċ private Ġconst Ġval ĠMAX _ CON CURRENT _ THREADS Ġ= Ġ 4 Ċ Ċ /** Ċ Ġ* ĠThread ĠSwitch er Ġthat Ġmakes Ġuse Ġof Ġthe ĠMain ĠL ooper Ċ Ġ* Ġand Ġa Ġbackground Ġthread ĠExecutor . Ċ Ġ* Ġ@ param Ġbackground Executor ĠThe Ġexecutor Ġthat Ġen queues Ġtasks Ġto Ġbe Ġrun Ġin Ġthe Ġbackground . Ċ Ġ*/ Ċ internal Ġclass ĠDefault Thread Switch er ( ĊĠĠĠ Ġprivate Ġval Ġbackground Executor : ĠExecutor Ġ= ĠExec utors . new Fixed ThreadPool ( MAX _ CON CURRENT _ THREADS ) Ċ ) Ġ: ĠThread Switch er Ġ{ ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġmain Handler : ĠHandler ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġmain Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain Handler Ġ?: Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Handler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler Ġ= Ġcreate Async ( Looper . get Main Looper ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmain Handler ?. post ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbackground Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Executor . execute ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Async ( lo oper : ĠL ooper ): ĠHandler Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHandler Compat . create Async ( lo oper ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCommon Ġimplementation Ġfor Ġclasses Ġthat Ġexposes Ġmethods Ġto Ġexecute Ġtasks Ġin Ġthe Ġbackground Ċ Ġ* Ġor Ġpost Ġtasks Ġin Ġthe ĠMain Ġ/ ĠUI Ġthread . Ċ Ġ*/ Ċ public Ġinterface ĠThread Switch er Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPosts Ġthe Ġtask Ġin Ġthe ĠMain Ġ/ ĠUI Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġmain Thread ( run nable : ĠRunnable ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn queues Ġthe Ġtask Ġto Ġbe Ġrun Ġon Ġa Ġbackground Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġbackground Thread ( run nable : ĠRunnable ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ ĠImplementation Ġof Ġ[ Thread Switch er ] Ġthat Ġallows Ġusers Ġto Ġset Ġtheir Ġown Ġtask Ġexecutor , Ċ Ġ* Ġ Ġaside Ġfrom Ġthe ĠL ooper - based ĠDefault Thread Switch er Ġthat Ġit Ġuses Ġas Ġdefault Ġfor Ġtask Ġexecution . Ċ Ġ*/ Ċ public Ġclass ĠCommon Thread Switch er ( ĊĠĠĠ Ġprivate Ġval Ġdefault Thread Switch er : ĠThread Switch er Ċ ) Ġ: ĠThread Switch er Ġ{ ĊĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠVis ible ForTesting . PRIVATE ) ĊĠĠĠ Ġinternal Ġvar Ġdelegate Thread Switch er : ĠThread Switch er ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġa Ġdelegate Ġthread Ġswitch er Ġinstead Ġof Ġthe ĠDefault Thread Switch er , ĊĠĠĠĠ Ġ* Ġshould Ġyou Ġwish Ġto Ġhave Ġyour Ġown Ġobject Ġthat Ġhandles Ġtask Ġexecution . ĊĠĠĠĠ Ġ* ĠIf Ġset Ġto Ġ` null `, Ġthe Ġdefault ĠL ooper - based Ġ[ Default Thread Switch er ] Ġwill Ġbe Ġused . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġuseful Ġfor Ġunit Ġtests Ġwhen Ġyou Ġdon 't Ġwant Ġto Ġuse Ġthe Ġactual Ġmain Ġlo oper . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġset Delegate ( thread Switch er : ĠThread Switch er ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate Thread Switch er Ġ= Ġthread Switch er Ġ?: Ġdefault Thread Switch er ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmain Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate Thread Switch er . main Thread ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbackground Thread ( run nable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate Thread Switch er . background Thread ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠCommon Thread Switch er ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun ĠgetInstance (): ĠCommon Thread Switch er Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠCommon Thread Switch er ( Default Thread Switch er ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate Thread Switch er Ġ= Ġdefault Thread Switch er ĊĠĠĠ Ġ} Ċ Ċ } Ċ