package Ġker ala . super hero . app . utils Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . text . Editable Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . text . is Digits Only Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . kar umi . dex ter . Dex ter Ċ import Ġcom . kar umi . dex ter . Multiple Permissions Report Ċ import Ġcom . kar umi . dex ter . Permission Token Ċ import Ġcom . kar umi . dex ter . listener . Permission Request Ċ import Ġcom . kar umi . dex ter . listener . multi . Multiple Permissions Listener Ċ import Ġker ala . super hero . app . Build Config Ċ import Ġorg . jetbrains . ank o . alert Ċ import Ġorg . jetbrains . ank o . run On Ui Thread Ċ import Ġorg . jetbrains . ank o . toast Ċ import Ġker ala . super hero . app . Constants Ċ import Ġker ala . super hero . app . R Ċ import Ġker ala . super hero . app . data . Result Wrapper Ċ import Ġker ala . super hero . app . data . Service Request Ċ import Ġker ala . super hero . app . on boarding . On Board ing Activity Ċ import Ġker ala . super hero . app . prefs Ċ Ċ fun ĠAny ?. log d ( key : ĠString Ġ= ĠConstants . TAG ) Ġ= ĊĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĠLog . d ( key , Ġthis . toString ()) Ġelse ĠLog . d ( ĊĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠ Ġ" Logging Ġis Ġpro hibited Ġin Ġproduction " ĊĠĠĠ Ġ) Ċ Ċ fun ĠEdit able . is A Valid In dian PhoneNumber () Ġ= Ġis Digits Only () Ġ&& Ġlength Ġ== Ġ 1 0 Ċ Ċ fun ĠActivity . check G ps Status (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġlocation Manager Ġ= Ġget System Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ĊĠĠĠ Ġreturn Ġlocation Manager . is Provider Enabled ( Location Manager . GPS _ PROVIDER ) Ċ } ĊĊ Ċ @ Suppress Lint (" Missing Permission ") Ċ fun ĠActivity . call Request er ( support Contact : ĠString ?) Ġ{ ĊĠĠĠ Ġif Ġ( has Call Permission ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( Intent . ACTION _ CALL , ĠUri . parse (" tel :$ support Contact "))) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Call Phone Permission () ĊĠĠĠĠĠĠĠ Ġtoast ( getString ( R . string . call _ phone _ permission _ required )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity . launch Maps Intent ( service Request : ĠService Request , Ġignore Destination : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdestination Address Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore Destination Ġ|| Ġservice Request . pick ed _ up ) Ġservice Request . address _ 1 Ġelse Ġservice Request . address _ 0 ĊĠĠĠĠĠĠĠ Ġval Ġdestination Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore Destination Ġ|| Ġservice Request . pick ed _ up ) Ġservice Request . location _ 1 Ġelse Ġservice Request . location _ 0 ĊĠĠĠĠĠĠĠ Ġval Ġg mm Intent Uri : ĠUri Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" geo : 0 , 0 ? q =${ if Ġ( destination Location Ġ!= Ġnull ) Ġ"${ destination Location . coordinates [ 0 ]}, ${ destination Location . coordinates [ 1 ]}" Ġelse Ġ" 0 , 0 "} (${ destination Address }) ") ĊĠĠĠĠĠĠĠ Ġval Ġmap Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , Ġg mm Intent Uri ) ĊĠĠĠĠĠĠĠ Ġmap Intent . set Package (" com . google . android . apps . maps ") ĊĠĠĠĠĠĠĠ ĠstartActivity ( map Intent ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoast ( getString ( R . string . navigation _ failed _ reason )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity . request Location Services () Ġ{ ĊĠĠĠ Ġalert Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . location _ off ) ĊĠĠĠĠĠĠĠ Ġmessage Ġ= ĠgetString ( R . string . location _ off _ description ) ĊĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġpositive Button (" Turn ĠOn ĠLocation ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Settings . ACTION _ LOCATION _ SOURCE _ SETTINGS ). let (:: startActivity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. show () Ċ } Ċ Ċ fun ĠContext ?. handle Network Error ( callback : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġthis ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠgetString ( R . string . network _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( if Ġ( callback Ġ!= Ġnull ) ĠgetString ( R . string . retry ) Ġelse ĠgetString ( R . string . ok )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠWindow Manager . Bad Token Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore d Ġsince Ġsource Ġof Ġerror Ġis Ġknown Ġand Ġhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity . request Call Phone Permission () Ġ{ ĊĠĠĠ Ġval Ġpermissions Array Ġ= Ġmutable ListOf ( Manifest . permission . CALL _ PHONE ) ĊĠĠĠ Ġval Ġshould Provide R ationale Ġ= ĠActivity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ ĠManifest . permission . CALL _ PHONE ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġif Ġ(! should Provide R ationale ) Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions Array . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 9 9 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity . has Call Permission (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġpermission State Ġ= ĠActivity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ ĠManifest . permission . CALL _ PHONE ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġpermission State Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ċ } Ċ Ċ fun ĠActivity ?. handle Generic Error ( ĊĠĠĠ Ġerror : ĠResult Wrapper . Generic Error , ĊĠĠĠ Ġignore 4 0 1 : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġcallback : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġif Ġ( error . code Ġ== Ġ 4 0 1 Ġ&& Ġ! ignore 4 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Session Expired Response () ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġerror . log d () ĊĊĠĠĠ Ġthis ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġerror . error . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( if Ġ( callback Ġ!= Ġnull ) ĠgetString ( R . string . retry ) Ġelse ĠgetString ( R . string . ok )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠWindow Manager . Bad Token Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore d Ġsince Ġsource Ġof Ġerror Ġis Ġknown Ġand Ġhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity ?. handle Session Expired Response () Ġ{ ĊĠĠĠ Ġthis ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalso Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Theme ( android . R . style . Theme Overlay _ Material _ Dark ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠgetString ( R . string . session _ expired ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cancel able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( getString ( R . string . ok )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠWindow Manager . Bad Token Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore d Ġsince Ġsource Ġof Ġerror Ġis Ġknown Ġand Ġhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠActivity . logout () Ġ{ ĊĠĠĠ Ġprefs . clear () ĊĠĠĠ ĠIntent ( this , ĠOn Board ing Activity :: class . java ). let (:: startActivity ) ĊĠĠĠ Ġfinish Affinity () Ċ } ĊĊ Ċ inline Ġfun ĠActivity . check Permissions And Do ( ĊĠĠĠ Ġpermissions : ĠList < String >, ĊĠĠĠ Ġr ationale : ĠString , ĊĠĠĠ Ġcross inline Ġcallback : Ġ( message : ĠString ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠDex ter . with Activity ( this ). with Permissions ( permissions ) ĊĠĠĠĠĠĠĠ Ġ. with Listener ( object Ġ: ĠMultiple Permissions Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Permissions Checked ( report : ĠMultiple Permissions Report ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( are All Permissions Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Ġ= ĠAlertDialog . Builder ( this @ check Permissions And Do ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert . setTitle ( R . string . app _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( ration ale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . grant ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Affinity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen AppSettings () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Permission R ationale ShouldBe Shown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠMutable List < Permission Request > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken : ĠPermission Token ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this @ check Permissions And Do ). setTitle ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( ration ale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( getString ( R . string . grant )) Ġ{ Ġdialog , Ġ_ Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen AppSettings () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . continue Permission Request () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). check () Ċ } Ċ Ċ fun ĠActivity . open AppSettings () Ġ{ ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠ Ġintent . action Ġ= ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ĊĠĠĠ Ġval Ġuri Ġ= ĠUri . from Parts ( ĊĠĠĠĠĠĠĠ Ġ" package ", ĊĠĠĠĠĠĠĠ ĠBuild Config . APPLICATION _ ID , Ġnull ĊĠĠĠ Ġ) ĊĠĠĠ Ġintent . data Ġ= Ġuri Ċ // ĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠ ĠstartActivity ( intent ) Ċ }