package Ġcom . s idd h ant k ush w aha . f alcon . common . util čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . pm . PackageManager č Ċ import Ġandroid . provider . Settings č Ċ import Ġandroidx . core . app . Activity Compat č Ċ import Ġcom . google . i 1 8 n . phon en umbers . Number ParseException č Ċ import Ġcom . google . i 1 8 n . phon en umbers . PhoneNumber Util č Ċ import Ġjava . security . Message Digest č Ċ import Ġjava . time . Instant č Ċ import Ġjava . time . format . DateTime Formatter č Ċ import Ġjava . util .* čĊčĊč Ċ object ĠCommon Util Ġ{ čĊĠĠĠ Ġpublic Ġfun Ġget DeviceId ( context : ĠContext ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠSettings . Secure . getString ( context . content Resolver , ĠSettings . Secure . ANDROID _ ID ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun Ġget Hash ( data : ĠString , Ġalgorithm : ĠString Ġ= Ġ" SHA - 2 5 6 "): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠMessage Digest . getInstance ( algorithm ). digest ( data . toByteArray ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ("", Ġ{ Ġstr , Ġit Ġ-> Ġstr Ġ+ Ġ"% 0 2 x ". format ( it ) Ġ}) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun ĠisValid PhoneNumber ( number : ĠString ): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠphoneNumber Util Ġ= ĠPhone Number Util . getInstance () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Phone Ġ= ĠphoneNumber Util . parse ( number , Ġ" IN ") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Util . isValid Number ( parsed Phone ) čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠNumber ParseException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun Ġnormalize PhoneNumber ( number : ĠString ): ĠString ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠphoneNumber Util Ġ= ĠPhone Number Util . getInstance () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Phone Ġ= ĠphoneNumber Util . parse ( number , Ġ" IN ") čĊĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Util . format ( parsed Phone , ĠPhone Number Util . PhoneNumber Format . E 1 6 4 ) čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠNumber ParseException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun Ġformat Timestamp ( timestamp : ĠLong , Ġformat : ĠString ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġtime Zone Id Ġ= ĠTime Zone . getDefault (). to Zone Id () čĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠInstant . of Epoch Milli ( timestamp ). at Zone ( time Zone Id ) čĊĠĠĠĠĠĠĠ Ġreturn ĠDateTime Formatter . of Pattern ( format ). format ( date ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun ĠgetString For Timestamp ( timestamp : ĠLong ): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġcurr Timestamp Ġ= ĠInstant . now (). to Epoch Milli () čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ(( curr Timestamp Ġ- Ġtimestamp ) Ġ/ Ġ( 2 4 Ġ* Ġ 3 6 0 0 0 0 0 )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Timestamp ( timestamp , Ġ" hh : mm Ġa ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊč ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 L Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Y esterday " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊč ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 L , Ġ 3 L , Ġ 4 L , Ġ 5 L , Ġ 6 L , Ġ 7 L Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Timestamp ( timestamp , Ġ" EEE ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Timestamp ( timestamp , Ġ" dd / MM / yy ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun Ġcheck Permissions ( context : ĠContext , Ġpermissions : ĠArray < String >): ĠArray < String > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġpermissions . filter Ġ{ Ġpermission Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . check Self Permission ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED čĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġpublic Ġfun Ġdecode Base 6 4 ( data : ĠString ): ĠByteArray Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 . get Decoder (). decode ( data ) čĊĠĠĠ Ġ} č Ċ }