/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠAutom ate ĠThe ĠPlan et ĠLtd . Ċ Ġ* ĠAuthor : ĠAnt on ĠAnge lov Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġsolutions . bell at rix . android . infrastructure Ċ Ċ import Ġsolutions . bell at rix . core . configuration . Configuration Service Ċ import Ġsolutions . bell at rix . core . plugins . Plugin Ċ import Ġsolutions . bell at rix . core . plugins . TestResult Ċ import Ġsolutions . bell at rix . core . utilities . User Home Path Normalizer Ċ import Ġsolutions . bell at rix . core . utilities . debug StackTrace Ċ import Ġsolutions . bell at rix . android . configuration . Android Settings Ċ import Ġjava . lang . reflect . Method Ċ Ċ class ĠApp Lifecycle Plugin Ġ: ĠPlugin () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent App Configuration : ĠThread Local < App Configuration > Ġ= ĠThread Local () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprevious App Configuration : ĠThread Local < App Configuration > Ġ= ĠThread Local () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġis App Started During Pre BeforeClass : ĠThread Local < Boolean > Ġ= ĠThread Local () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġis App Started Correct ly : ĠThread Local < Boolean > Ġ= ĠThread Local () ĊĊĠĠĠĠĠĠĠ Ġfun Ġof (): ĠApp Lifecycle Plugin Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApp Lifecycle Plugin () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre BeforeClass ( type : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent App Configuration . set ( get Execution App Class Level ( type )) ĊĠĠĠĠĠĠĠ Ġif Ġ( should Restart App ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart App () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġmaybe Ġwe Ġcan Ġsimplify Ġand Ġremove Ġthis Ġparameter . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis App Started During Pre BeforeClass . set ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis App Started During Pre BeforeClass . set ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . pre BeforeClass ( type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost After Class ( type : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġshutdown App () ĊĠĠĠĠĠĠĠ Ġis App Started During Pre BeforeClass . set ( false ) ĊĠĠĠĠĠĠĠ Ġsuper . pre After Class ( type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre Before Test ( test Result : ĠTest Result , Ġmember Info : ĠMethod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent App Configuration . set ( getApp Configuration ( member Info )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is App Started During Pre BeforeClass . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Restart App ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart App () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis App Started During Pre BeforeClass . set ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost After Test ( test Result : ĠTest Result , Ġmember Info : ĠMethod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current App Configuration . get (). lifecycle Ġ=== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLifecycle . RE START _ ON _ FAIL Ġ&& Ġtest Result Ġ=== ĠTest Result . FAILURE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshutdown App () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis App Started During Pre BeforeClass . set ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshutdown App () Ġ{ ĊĠĠĠĠĠĠĠ ĠDriver Service . close () ĊĠĠĠĠĠĠĠ Ġprevious App Configuration . set ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestart App () Ġ{ ĊĠĠĠĠĠĠĠ Ġshutdown App () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDriver Service . start ( current App Configuration . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis App Started Correct ly . set ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex . debug StackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis App Started Correct ly . set ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprevious App Configuration . set ( current App Configuration . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Restart App (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠIs App Started Correct ly Ġgetter ? ĊĠĠĠĠĠĠĠ Ġval Ġprevious Configuration Ġ= Ġprevious App Configuration . get () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Configuration Ġ= Ġcurrent App Configuration . get () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( previous Configuration Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is App Started Correct ly . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( previous Configuration Ġ!= Ġcurrent Configuration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Configuration . lifecycle Ġ=== ĠLifecycle . RE START _ E VERY _ TIME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget App Configuration ( member Info : ĠMethod ): ĠApp Configuration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠApp Configuration ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġclass App Type Ġ= Ġget Execution App Class Level ( member Info . decl aring Class ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod App Type Ġ= Ġget Execution App Method Level ( member Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( method App Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġmethod App Type ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( class App Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġclass App Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Execution App Method Level ( member Info : ĠMethod ): ĠApp Configuration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecution App Annotation Ġ= Ġmember Info . getDeclared Annotation ( Execution App :: class . java ) Ġas ĠExecution App ĊĠĠĠĠĠĠĠ Ġif Ġ( execution App Annotation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( execution App Annotation . is Mobile Web Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApp Configuration ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠApp Configuration ( execution App Annotation . lifecycle , Ġexecution App Annotation . android Version , Ġexecution App Annotation . device Name , Ġexecution App Annotation . app Path , Ġexecution App Annotation . app Package , Ġexecution App Annotation . app Activity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Execution App Class Level ( type : ĠClass < *> ): ĠApp Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexecution App Annotation Ġ= Ġtype . getDeclared Annotation ( Execution App :: class . java ) Ġas ĠExecution App ĊĠĠĠĠĠĠĠ Ġif Ġ( execution App Annotation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdefault App Path : ĠString Ġ= ĠConfiguration Service . get < Android Settings >(). default App Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault App Path Ġ= ĠUser Home Path Normalizer . normalize Path ( default App Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Lifecycle : ĠLifecycle Ġ= ĠLifecycle . from Text ( Configuration Service . get < Android Settings >(). default Life Cycle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault App Package : ĠString Ġ= ĠConfiguration Service . get < Android Settings >(). default App Package ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault App Activity : ĠString Ġ= ĠConfiguration Service . get < Android Settings >(). default App Package ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Android Version : ĠString Ġ= ĠConfiguration Service . get < Android Settings >(). default Android Version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Device Name : ĠString Ġ= ĠConfiguration Service . get < Android Settings >(). default Device Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApp Configuration ( default Lifecycle , Ġdefault Android Version , Ġdefault Device Name , Ġdefault App Path , Ġdefault App Package , Ġdefault App Activity ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( execution App Annotation . is Mobile Web Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApp Configuration ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠApp Configuration ( execution App Annotation . lifecycle , Ġexecution App Annotation . android Version , Ġexecution App Annotation . device Name , Ġexecution App Annotation . app Path , Ġexecution App Annotation . app Package , Ġexecution App Annotation . app Activity ) ĊĠĠĠ Ġ} Ċ }