/* Ċ Ġ* ĠVo IP . ms ĠSMS Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 5 - 2 0 1 9 ĠMichael ĠK our las Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnet . k our las . vo ip ms _ sms . utils Ċ Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . Color . rgb Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Outline Provider Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġnet . k our las . vo ip ms _ sms . R Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠApplies Ġa Ġcircular Ġmask Ġto Ġa Ġbitmap . Ċ Ġ*/ Ċ fun Ġapply Circular Mask ( bitmap : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġoutput Ġ= ĠBitmap . create Bitmap ( bitmap . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( output ) ĊĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠ Ġval Ġrect Ġ= ĠRect ( 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height ) ĊĊĠĠĠ Ġcanvas . draw ARGB ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġcanvas . draw Circle (( bitmap . width Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( bitmap . height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( bitmap . width Ġ/ Ġ 2 ). toFloat (), Ġpaint ) ĊĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠ Ġpaint . xfer mode Ġ= ĠPort er D uff X fer mode ( Port er D uff . Mode . SRC _ IN ) ĊĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġrect , Ġrect , Ġpaint ) ĊĠĠĠ Ġreturn Ġoutput Ċ } Ċ Ċ /** Ċ Ġ* ĠApplies Ġa Ġcircular Ġmask Ġto Ġa Ġview . Ċ Ġ*/ Ċ fun Ġapply Circular Mask ( view : ĠView ) Ġ{ ĊĠĠĠ Ġview . outline Provider Ġ= Ġget O val View Outline Provider () ĊĠĠĠ Ġview . clip To Outline Ġ= Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġa Ġview Ġoutline Ġprovider Ġfor Ġo vals . Ċ Ġ*/ Ċ private Ġfun Ġget O val View Outline Provider (): ĠView Outline Provider Ġ= ĊĠĠĠ Ġobject Ġ: ĠView Outline Provider () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Outline ( view : ĠView , Ġoutline : ĠOut line ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutline . set O val ( 0 , Ġ 0 , Ġview . width , Ġview . height ) ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠApplies Ġa Ġrect angular Ġrounded Ġcorners Ġmask Ġto Ġa Ġview . Ċ Ġ*/ Ċ fun Ġapply Rounded C orners Mask ( view : ĠView ) Ġ{ ĊĠĠĠ Ġview . outline Provider Ġ= Ġget Round Rect View Outline Provider () ĊĠĠĠ Ġview . clip To Outline Ġ= Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġa Ġview Ġoutline Ġprovider Ġfor Ġrounded Ġrect angles . Ċ Ġ*/ Ċ private Ġfun Ġget Round Rect View Outline Provider (): ĠView Outline Provider Ġ= ĊĠĠĠ Ġobject Ġ: ĠView Outline Provider () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Outline ( view : ĠView , Ġoutline : ĠOut line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= ĠTyped Value . apply Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ DIP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . context . resources . display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutline . set Round Rect ( 0 , Ġ 0 , Ġview . width , Ġview . height , Ġpixels ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠShows Ġan Ġalert Ġdialog Ġwith Ġthe Ġspecified Ġtitle , Ġtext , Ġand Ġbuttons . Ċ Ġ*/ Ċ fun Ġshow AlertDialog ( activity : ĠFragment Activity , Ġtitle : ĠString ?, Ġtext : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive ButtonText : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button Action : ĠDialog Interface . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative ButtonText : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button Action : ĠDialog Interface . OnClickListener ? Ġ= Ġnull ): ĠAlertDialog ? Ġ{ ĊĠĠĠ Ġif Ġ(! activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage ( text ) ĊĠĠĠĠĠĠĠ Ġbuilder . setTitle ( title ) ĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( positive ButtonText , Ġpositive Button Action ) ĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( negative ButtonText , Ġnegative Button Action ) ĊĠĠĠĠĠĠĠ Ġbuilder . set Cancel able ( false ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . show () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġgeneric Ġsn ackbar . Ċ Ġ*/ Ċ fun Ġshow Snackbar ( activity : ĠFragment Activity , Ġview Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext : ĠString , Ġlength : ĠInt Ġ= ĠSn ackbar . LENGTH _ LONG ): ĠSn ackbar ? Ġ{ ĊĠĠĠ Ġif Ġ(! activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġactivity . findViewById < View >( view Id ) ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( view , Ġtext , Ġlength ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠĠĠĠĠ Ġreturn Ġsn ackbar ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġgeneric Ġsn ackbar Ġwith Ġa Ġbutton . Ċ Ġ*/ Ċ fun Ġshow Snackbar ( activity : ĠFragment Activity , Ġview Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Text : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Action : ĠView . OnClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlength : ĠInt Ġ= ĠSn ackbar . LENGTH _ LONG ): ĠSn ackbar ? Ġ{ ĊĠĠĠ Ġif Ġ(! activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġactivity . findViewById < View >( view Id ) ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( view , Ġtext , Ġlength ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( button Text , Ġbutton Action ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠĠĠĠĠ Ġreturn Ġsn ackbar ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġsn ackbar Ġrequesting Ġa Ġpermission Ġwith Ġa Ġbutton Ġlinking Ġto Ġthe Ċ Ġ* Ġapplication Ġsettings Ġpage . Ċ Ġ*/ Ċ fun Ġshow Permission Snackbar ( activity : ĠAppCompatActivity , Ġview Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext : ĠString ): ĠSn ackbar ? Ġ{ ĊĠĠĠ Ġif Ġ( activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġactivity . findViewById < View >( view Id ) ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( view , Ġtext , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( R . string . settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NO _ HISTORY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ EXCL UDE _ FROM _ REC ENTS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from Parts (" package ", Ġactivity . packageName , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . data Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠĠĠĠĠ Ġreturn Ġsn ackbar ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠShows Ġa Ġtoast Ġwith Ġthe Ġvalue Ġof Ġthe Ġspecified Ġexception Ġand Ġabort s Ġthe Ċ Ġ* Ġspecified Ġactivity . Ċ Ġ*/ Ċ fun Ġabort Activity ( activity : ĠFragment Activity , Ġex : ĠException , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration : ĠInt Ġ= ĠToast . LENGTH _ SHORT ) Ġ{ ĊĠĠĠ Ġlog Exception ( ex ) ĊĠĠĠ ĠToast . makeText ( activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . getString ( R . string . toast _ error , Ġex . message ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration ). show () ĊĠĠĠ Ġactivity . finish () Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġa Ġdeterministic ally Ġselected Ġmaterial Ġdesign Ġcolour Ġassociated Ġwith Ċ Ġ* Ġthe Ġspecified Ġphone Ġnumber . Ċ Ġ*/ Ċ fun Ġget Material Design Colour ( phoneNumber : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġcolo urs Ġ= ĠlistOf ( rgb ( 0 xd 5 , Ġ 0 x 0 0 , Ġ 0 x 0 0 ), Ġrgb ( 0 xc 5 , Ġ 0 x 1 1 , Ġ 0 x 6 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 xaa , Ġ 0 x 0 0 , Ġ 0 xff ), Ġrgb ( 0 x 6 2 , Ġ 0 x 0 0 , Ġ 0 xea ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 3 0 , Ġ 0 x 4 f , Ġ 0 xfe ), Ġrgb ( 0 x 2 9 , Ġ 0 x 6 2 , Ġ 0 xff ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 0 0 , Ġ 0 x 9 1 , Ġ 0 xea ), Ġrgb ( 0 x 0 0 , Ġ 0 xb 8 , Ġ 0 xd 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 0 0 , Ġ 0 xbf , Ġ 0 xa 5 ), Ġrgb ( 0 x 0 0 , Ġ 0 xc 8 , Ġ 0 x 5 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 6 4 , Ġ 0 xdd , Ġ 0 x 1 7 ), Ġrgb ( 0 xae , Ġ 0 xea , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 xff , Ġ 0 xd 6 , Ġ 0 x 0 0 ), Ġrgb ( 0 xff , Ġ 0 xab , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 xff , Ġ 0 x 6 d , Ġ 0 x 0 0 ), Ġrgb ( 0 xdd , Ġ 0 x 2 c , Ġ 0 x 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 3 e , Ġ 0 x 2 7 , Ġ 0 x 2 3 ), Ġrgb ( 0 x 2 1 , Ġ 0 x 2 1 , Ġ 0 x 2 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrgb ( 0 x 2 6 , Ġ 0 x 3 2 , Ġ 0 x 3 8 )) ĊĠĠĠ Ġreturn Ġcolo urs [ abs ( phoneNumber . hashCode ()) Ġ% Ġcolo urs . size ] Ċ } Ċ