package Ġsa ar land . cis pa . frontmatter . resolvers Ċ Ċ import Ġmu . K Logging Ċ import Ġsa ar land . cis pa . frontmatter . Activity Class Ċ import Ġsa ar land . cis pa . frontmatter . Activity Or Fragment Class Ċ import Ġsa ar land . cis pa . frontmatter . App Model Ċ import Ġsa ar land . cis pa . frontmatter . Call chain Walker Ċ import Ġsa ar land . cis pa . frontmatter . Resolver Ċ import Ġsa ar land . cis pa . frontmatter . Resource Parser Ċ import Ġsa ar land . cis pa . frontmatter . UIElement WithContext Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Activity Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Android Class Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Android Method Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Dummy Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Fragment Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is From Lib Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is Real Ċ import Ġsa ar land . cis pa . frontmatter . Utils . is System Method Ċ import Ġsa ar land . cis pa . frontmatter . cg . Inter pro ced ural CFG Wrapper Ċ import Ġsa ar land . cis pa . frontmatter . data . Stmt Site Ċ import Ġsa ar land . cis pa . frontmatter . startActivity For Result Sub signatures Ċ import Ġsa ar land . cis pa . frontmatter . startActivity Sub signatures Ċ import Ġso ot . Local Ċ import Ġso ot . Ref Type Ċ import Ġso ot . Scene Ċ import Ġso ot . S oot Class Ċ import Ġso ot . S oot Method Ċ import Ġso ot . j imple . Instance Invoke Expr Ċ import Ġso ot . j imple . Stmt Ċ Ċ data Ġclass ĠTransition ( val Ġsrc : ĠS oot Class , Ġval Ġtrigger : ĠSet < UIElement WithContext >, Ġval Ġdest : ĠS oot Class , Ġval Ġwith Return : ĠBoolean ) Ċ class ĠTransition Resolver ( scene V : ĠScene , Ġval Ġapp Model : ĠApp Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġic fg : ĠInter pro ced ural CFG Wrapper , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġvalue Resolver : ĠValue Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources : ĠResource Parser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent Filters : ĠMap < String , ĠSet < String >>) Ġ: ĠResolver ( scene V ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () ĊĊĠĠĠ Ġprivate Ġval Ġintent Resolver Ġ= ĠIntent Resolver ( scene V , Ġvalue Resolver , Ġintent Filters , Ġresources ) ĊĠĠĠ Ġ// ĠTODO : Ġmay Ġbe Ġalso Ġother Ġclasses Ġlike ĠApplication ĊĊĠĠĠ Ġvar ĠstartActivity Stmt Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġcall chain Walker : ĠCall chain Walker Ġ= ĠCall chain Walker ( scene V , Ġapp Model , Ġvalue Resolver ) ĊĊĠĠĠ Ġfun Ġresolve () Ġ{ ĊĠĠĠĠĠĠĠ Ġresolve Transitions To ( app Model . transitions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Transitions To ( activity Transitions : ĠMutable Set < Transition >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( activity Ġin Ġapp Model . activities ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity . is From Lib ()) Ġcontinue Ġ// Ġignore Ġactivities Ġfrom Ġcommon Ġlibs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity . is Android Class ()) Ġ// Ġignore Ġdefault Ġactivities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! activity . is Real ()) Ġ// Ġignore Ġdefault Ġactivities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" => ĠRes olving Ġtransitions Ġfor Ġactivity Ġ$ activity ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransitions Ġ= Ġresolve Transitions From ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Transitions . addAll ( transitions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Transitions From ( activity : ĠActivity Or Fragment Class ): ĠList < Transition > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreachable Methods Ġ= Ġget Reach able Methods Of Activity ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Concrete Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is System Method () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is Android Method () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . is Dummy () Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠstartActivity Sites Ġ= Ġreachable Methods ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfind Start Activity Sites ( it ). as Sequence () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġreturn ĠstartActivity Sites . flatMap Ġ{ Ġresolve Start Activity Call Site ( it , Ġactivity ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Start Activity Sites ( method : ĠS oot Method ): ĠList < Stmt Site > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( method . is Concrete ) ĊĠĠĠĠĠĠĠ Ġval Ġactive Body Ġ= Ġmethod . retrieve Active Body () ĊĠĠĠĠĠĠĠ Ġreturn Ġactive Body . units . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Stmt >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . contains Invoke Expr () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . invoke Expr . method . sub Signature Ġin ĠstartActivity Sub signatures Ġ&& Ġ! it . invoke Expr . method . is Static Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠStmt Site ( it , Ġmethod ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcall Site : ĠstartActivity (...) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġresolve Start Activity Call Site ( call Site : ĠStmt Site , Ġactivity : ĠActivity Or Fragment Class ): ĠList < Transition > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġget Start Activity Source ( call Site , Ġactivity ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġfind Target ( call Site ) ĊĠĠĠĠĠĠĠ Ġval Ġtriggers Ġ= Ġget Trigger ( call Site , Ġactivity ) ĊĠĠĠĠĠĠĠ Ġval Ġwith Return Ġ= Ġis Start Activity With Result ( call Site ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget . map Ġ{ ĠTransition ( source , Ġtriggers , Ġit , Ġwith Return ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Start Activity With Result ( call Site : ĠStmt Site ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcall Site . get Invoke Expr Sub signature () Ġin ĠstartActivity For Result Sub signatures ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Target ( call Site : ĠStmt Site ): ĠSet < Activity Class > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Allocation Sites Ġ= Ġvalue Resolver . resolve Arg ( call Site , Ġ 0 , Ġnull ) Ġ// resolver Ġreturns Ġnot Ġthe ĠIntent , Ġbut Ġstring ĊĠĠĠĠĠĠĠ Ġif Ġ( intent Allocation Sites . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" @@ @ ĠIntent Ġat Ġ$ call Site Ġin Ġ${ call Site . method } Ġcannot Ġbe Ġresolved ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtargets Ġ= Ġintent Allocation Sites . map NotNull Ġ{ Ġintent Resolver . get Targets From Intent ( it ) Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġreturn Ġtargets ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Trigger ( startActivity Call Site : ĠStmt Site , Ġactivity : ĠActivity Or Fragment Class ): ĠSet < UIElement WithContext > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġui Elements WithContext Ġ= Ġcall chain Walker . get UIT rigger Of Call ( startActivity Call Site ) ĊĠĠĠĠĠĠĠ Ġreturn Ġui Elements WithContext . filter Ġ{ Ġit . context Ġ== Ġactivity Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Start Activity Source ( startActivity Call Site : ĠStmt Site , Ġactivity : ĠActivity Or Fragment Class ): ĠActivity Or Fragment Class Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstmt Ġ= ĠstartActivity Call Site . stmt ĊĠĠĠĠĠĠĠ Ġval Ġinvoke Expr Ġ= Ġstmt . invoke Expr ĊĠĠĠĠĠĠĠ Ġrequire ( invoke Expr Ġis ĠInstance Invoke Expr ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġ( invoke Expr . base . type Ġas ĠRef Type ). so ot Class ĊĠĠĠĠĠĠĠ Ġif Ġ(! context . is Android Class () Ġ&& Ġ! context . is Abstract ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠĠĠĠĠ Ġval Ġtyped Context Ġ= Ġget Base Class ( startActivity Call Site ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! typed Context . is Android Class () Ġ&& Ġ! typed Context . is Abstract ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtyped Context ĊĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= ĠstartActivity Call Site . method . decl aring Class ĊĠĠĠĠĠĠĠ Ġif Ġ( caller . is Inner Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Call ers Ġ= Ġresolve Inner Caller ( caller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inner Call ers Ġ!= Ġnull ) Ġreturn Ġinner Call ers ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . warn (" Default Ġstart Ġactivity : Ġ$ activity Ġfor Ġtransition Ġ@ Ġ$ startActivity Call Site ") ĊĠĠĠĠĠĠĠ Ġreturn Ġactivity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Inner Caller ( caller : ĠS oot Class ): ĠActivity Or Fragment Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( caller . is Inner Class ) ĊĠĠĠĠĠĠĠ Ġvar Ġclass ToCheck Ġ= Ġcaller ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ToCheck Ġ= Ġclass ToCheck . outer Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class ToCheck . is Activity () Ġ|| Ġclass ToCheck . is Fragment ()) Ġreturn Ġclass ToCheck ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( class ToCheck . is Inner Class ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Base Class ( call Site : ĠStmt Site ): ĠS oot Class Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvoke Expr Ġ= Ġcall Site . stmt . invoke Expr Ġas ĠInstance Invoke Expr ĊĠĠĠĠĠĠĠ Ġval Ġbase Box Ġ= Ġinvoke Expr . base Box ĊĠĠĠĠĠĠĠ Ġval Ġbase Local Ġ= Ġbase Box . value Ġas ĠLocal ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġcall Site . method ĊĠĠĠĠĠĠĠ Ġreturn Ġ( method . active Body . locals . first Ġ{ Ġit Ġ== Ġbase Local Ġ}. type Ġas ĠRef Type ). so ot Class ĊĠĠĠ Ġ} Ċ Ċ } Ċ