package Ġcustom . lint . rules Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . tools . lint . client . api . TYPE _ INT Ċ import Ġcom . android . tools . lint . detector . api .* Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Field Ċ import Ġorg . jetbrains . u ast .* Ċ Ċ class ĠActivity Result Detector Ġ: ĠDetector (), ĠSource Code Scanner Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠISS UE Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Activity Result Detector ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Result Ġcode Ġcomparing Ġto Ġrequest Ġcode ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Request Ġcode Ġin Ġon Activity Result Ġshould Ġnot Ġbe Ġcompared Ġto Ġresult Ġcodes ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCategory . CORRECT NESS , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImplementation ( Activity Result Detector :: class . java , ĠScope . JAVA _ FILE _ SCOPE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTARGET _ CLASSES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS dk Constants . CLASS _ ACTIVITY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . fragment . app . Fragment ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS dk Constants . CLASS _ FRAGMENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Applicable Reference Names (): ĠList < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf (" RESULT _ OK ", Ġ" RESULT _ C ANCE LED ", Ġ" RESULT _ FIRST _ USER ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Reference ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠJava Context , ĊĠĠĠĠĠĠĠ Ġreference : ĠU Reference Expression , ĊĠĠĠĠĠĠĠ Ġreferenced : ĠPsi Element ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( referenced Ġ! is ĠPsi Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! context . evaluator . is Member In Class ( referenced , ĠS dk Constants . CLASS _ ACTIVITY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġ' referenced ' Ġis Ġused Ġin Ġon Activity Result Ġmethod ĊĠĠĠĠĠĠĠ Ġval Ġmethod : ĠU Method Ġ= Ġreference . getParent OfType ( U Method :: class . java ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Target ( context , Ġmethod )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġfind Ġexpression , Ġe . g . Ġ( request Code Ġ== ĠActivity . RESULT _ OK ) ĊĠĠĠĠĠĠĠ Ġval Ġcomparison : ĠU Binary Expression Ġ= Ġreference . getParent OfType ( UB inary Expression :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġanother Ġargument Ġof Ġcomparison Ġexpression ĊĠĠĠĠĠĠĠ Ġval Ġanother Operand Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comparison . left Operand . get Qualified Parent Or This () Ġ== Ġreference . get Qualified Parent Or This ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparison . right Operand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomparison . left Operand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġoperand Ġshould Ġbe Ġreference Ġto Ġa Ġparameter ĊĠĠĠĠĠĠĠ Ġif Ġ( another Operand Ġ! is ĠU Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparam Request Code Ġ= Ġmethod . u ast Parameters [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( another Operand . resolve ToU Element () Ġ== Ġparam Request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam ResultCode Ġ= Ġmethod . u ast Parameters [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfix Ġ= Ġfix (). replace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. text ( param Request Code . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( param ResultCode . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠISS UE , Ġcontext . getLocation ( comparison ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"` ${ param Request Code . name }` Ġshould Ġnot Ġbe Ġcompared Ġto Ġ`${ referenced . name }` ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġmethod Ġis Ġone Ġof Ġon Activity Result Ġmethods Ġdeclared Ġin Ġ[ TARGET _ CLASSES ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Target ( context : ĠJava Context , Ġmethod : ĠU Method ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( target Class Ġin ĠTARGET _ CLASSES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . evaluator . method Matches ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod , Ġtarget Class , Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTYPE _ INT , ĠTYPE _ INT , ĠS dk Constants . CLASS _ INT ENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ