package Ġcom . md zz . hook Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġcom . md zz . hook . base . Base Hook Ċ import Ġcom . md zz . hook . util . X Shared Pref Util Ċ import Ġde . rob v . android . x posed . XC _ Method Hook Ċ import Ġde . rob v . android . x posed . X posed Helpers Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠH K Dialog Ġ: ĠBase Hook () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" HK Dialog " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbegin Hook () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! X Shared Pref Util . getBoolean ( MAKE _ DIALOG _ CANCEL ABLE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Class Ġ= Ġclass Loader . load Class ( DIALOG _ CLASS ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX posed Helpers . find And Hook Method ( dialog Class , Ġ" set Cancel able ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . java Primitive Type , ĠMy Set True Method Hook ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX posed Helpers . find And Hook Method ( dialog Class , Ġ" set Canceled On Touch Outside ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class . java Primitive Type , ĠMy Set True Method Hook ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠX posed Helpers . find And Hook Method ( dialog Class , Ġ" setOn Cancel Listener ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . content . DialogInterface \$ On Cancel Listener ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Cancel Listener Method Hook ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( X Shared Pref Util . getBoolean ( PRE VENT _ DIALOG )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX posed Helpers . find And Hook Method ( dialog Class , Ġ" show ", ĠMy Show Method Hook ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" run : Ġæ¨¡ åĿĹ ${ number } å·¥ä½ľ æŃ£å¸¸ ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( th : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" run : Ġæ¨¡ åĿĹ ${ number } åĩº éĶĻ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠMy Set True Method Hook Ġ: ĠX C _ Method Hook () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore Hook ed Method ( param : ĠMethod Hook Param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġparam . this Object :: class . java . name Ġ+ Ġ": Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġparam . method . name Ġ+ Ġ" Ġ${ param . args [ 0 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . args [ 0 ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠMy Cancel Listener Method Hook Ġ: ĠX C _ Method Hook () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore Hook ed Method ( param : ĠMethod Hook Param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġparam . this Object :: class . java . name Ġ+ Ġ": Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġparam . method . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġparam . args [ 0 ]:: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . args [ 0 ] Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠMy Show Method Hook Ġ: ĠX C _ Method Hook () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Need Prevent Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdialog Key Words ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠX Shared Pref Util . getString Set ( KEY _ WORDS ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore Hook ed Method ( param : ĠMethod Hook Param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ"${ param . this Object :: class . java . name }: Ġ${ param . method . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġ" run : Ġ æĪĲåĬŁ æĭ ¦ æĪª å¼¹ çªĹ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isNot Bottom Sheet Dialog ( param . this Object )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġm Decor : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Window Ġ= Ġparam . this Object :: class . java . getMethod (" getWindow ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Window Ġ= Ġget Window . invoke ( param . this Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Decor View Ġ= Ġm Window :: class . java . getMethod (" get Decor View ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Decor Ġ= Ġget Decor View . invoke ( m Window ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( th : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Decor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Visibility Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Decor !! :: class . java . getMethod (" setVisibility ", ĠInt :: class . java Primitive Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( th : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Visibility ?. invoke ( m Decor , Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Need Prevent Ġ= Ġshould Prevent ( it Ġas ĠViewGroup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Visibility ?. invoke ( m Decor , Ġif Ġ( m Need Prevent ) Ġ 8 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Hook ed Method ( param : ĠMethod Hook Param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Need Prevent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdismiss Ġ= Ġparam . this Object :: class . java . getMethod (" dismiss ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss . invoke ( param . this Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġshould Prevent ( decor View : ĠViewGroup ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġview Ġ= Ġdecor View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Views Ġ= ĠArrayList < TextView >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Groups Ġ= ĠLinkedList < ViewGroup >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Groups . add ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( view Groups . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġview Groups . poll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġview . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġview . getChild At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Groups . add ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( v Ġis ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Views . add ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Views . forEach Ġ{ Ġtv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Key Words . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tv . text . contains ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( TAG , Ġit :: class . java . name Ġ+ Ġ" Ġtext Ġ= Ġ${ tv . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Not Bottom Sheet Dialog ( dialog : ĠAny ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġdialog :: class . java . name Ġ!= Ġ" android . support . design . widget . Bottom Sheet Dialog " ĊĠĠĠ Ġ} Ċ }