package Ġcat . xo jan . random 1 . feature . medi ap lay back Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . Package Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Process Ċ import Ġandroid . util . Log Ċ Ċ class ĠPackage Validator Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠPackage Validator :: class . java . simple Name ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġfalse Ġif Ġthe Ġcaller Ġis Ġnot Ġauthorized Ġto Ġget Ġdata Ġfrom Ġthis ĠMedia Browser Service ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Caller Allowed ( context : ĠContext , Ġcalling Package : ĠString , Ġcalling Uid : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġallow Ġcalls Ġfrom Ġthe Ġframework , Ġself Ġapp Ġor Ġdevelopment Ġenvironment . ĊĠĠĠĠĠĠĠ Ġif Ġ( Process . SYSTEM _ UID Ġ== Ġcalling Uid Ġ|| ĠProcess . my Uid () Ġ== Ġcalling Uid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Platform Signed ( context , Ġcalling Package )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Info Ġ= Ġget Package Info ( context , Ġcalling Package ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( package Info . signatures . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Caller Ġdoes Ġnot Ġhave Ġexactly Ġone Ġsignature Ġcertificate !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġinstalled Ġpackage Ġsignature Ġmatches Ġthe Ġplatform Ġsignature . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Platform Signed ( context : ĠContext , Ġpkg Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplatform Package Info Ġ= Ġget Package Info ( context , Ġ" android ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠShould Ġnever Ġhappen . ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Package Info ?. signatures Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġplatform Package Info . signatures . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Package Info Ġ= Ġget Package Info ( context , Ġpkg Name ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( client Package Info ?. signatures Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġclient Package Info . signatures . isNotEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform Package Info . signatures [ 0 ] Ġ== Ġclient Package Info . signatures [ 0 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Package Info ] Ġfor Ġthe Ġpackage Ġname Ġor Ġnull Ġif Ġit 's Ġnot Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Package Info ( context : ĠContext , Ġpkg Name : ĠString ): ĠPackage Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpm . get Package Info ( pkg Name , ĠPackage Manager . GET _ SIGNATURE S ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Package Ġmanager Ġcan 't Ġfind Ġpackage : Ġ$ pkg Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ