package Ġcom . code po ka . call _ with _ whats app čĊč Ċ import Ġandroid . Manifest č Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . content . pm . PackageManager č Ċ import Ġandroid . net . Uri č Ċ import Ġandroid . provider . Contacts Contract č Ċ import Ġandroidx . core . app . Activity Compat č Ċ import Ġandroidx . core . content . Context Compat č Ċ import Ġio . flutter . plugin . common . MethodCall č Ċ import Ġio . flutter . plugin . common . Method Channel č Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler č Ċ import Ġio . flutter . plugin . common . Method Channel . Result č Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar čĊč Ċ class ĠCall With Wh ats app Plugin ( private Ġval Ġchannel : ĠMethod Channel , Ġprivate Ġval Ġregist rar : ĠRegist rar ) Ġ: ĠMethod Call Handler Ġ{ čĊĠ Ġprivate Ġvar Ġ_ result : ĠResult ? Ġ= Ġnull čĊčĊĠ Ġinit Ġ{ čĊĠĠĠ Ġregist rar . add Request Permissions Result Listener Ġ{ Ġrequest Code , Ġpermissions , Ġgrant Results Ġ-> čĊĠĠĠĠĠĠĠ Ġif ( request Code Ġ== Ġ 2 0 3 ){ čĊĠĠĠĠĠĠĠĠĠ Ġif ( grant Results . any { Ġr Ġ-> Ġr Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ} ){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// NOT ĠG RAN TED ĠALL čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ result ?. success (" PERMISSION _ DEN IED ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġnull č Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . invoke Method (" on Request Permissions Result "," PERMISSION _ DEN IED ") čĊĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠ Ġelse { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ALL ĠG RAN TED čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ result ?. success (" PERMISSION _ GRAN TED ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġnull č Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . invoke Method (" on Request Permissions Result "," PERMISSION _ GRAN TED ") čĊĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn @ add Request Permissions Result Listener Ġtrue čĊĠĠĠĠĠ Ġ} čĊĠĠĠ Ġregist rar . add Activity Result Listener Ġ{ Ġrequest Code , ĠresultCode , Ġdata Ġ-> čĊĠĠĠĠĠ Ġprint ( request Code ) čĊĠĠĠĠĠ Ġ// request Ġcode Ġ- 1 Ġ&& Ġdata Ġ!= Ġnull čĊĠĠĠĠĠ Ġif ( request Code Ġ== Ġ 2 0 2 ){ čĊĠĠĠĠĠĠĠ Ġ// Contact Ġcreation Ġresult čĊĠĠĠĠĠĠĠ Ġif ( result Code Ġ== Ġ- 1 Ġ&& Ġdata Ġ!= Ġnull ){ čĊĠĠĠĠĠĠĠĠĠ Ġ// contact Ġcreation Ġsuccess čĊĠĠĠĠĠĠĠĠĠ Ġ_ result ?. success (" SUCCESS ") čĊĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġnull č Ċ // ĠĠĠĠĠĠĠĠĠ Ġchannel . invoke Method (" onCreate Contact Result "," SUCCESS ") čĊĠĠĠĠĠĠĠ Ġ} Ġelse { čĊĠĠĠĠĠĠĠĠĠ Ġ// Ġcontact Ġnot Ġre ated čĊĠĠĠĠĠĠĠĠĠ Ġ_ result ?. success (" C ANCE LED ") čĊĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġnull č Ċ // ĠĠĠĠĠĠĠĠĠ Ġchannel . invoke Method (" onCreate Contact Result "," C ANCE LED ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠ Ġreturn @ add Activity Result Listener Ġtrue čĊĠĠĠ Ġ} čĊĠ Ġ} čĊĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠ Ġ@ Jvm Static čĊĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ{ čĊĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( regist rar . messenger (), Ġ" call _ with _ whats app ") čĊĠĠĠĠĠ Ġchannel . set MethodCall Handler ( Call With Wh ats app Plugin ( channel , regist rar )) čĊĠĠĠ Ġ} čĊĠ Ġ} čĊčĊĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ čĊĠĠĠ Ġwhen Ġ( call . method ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ" call With Wh ats app " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġresult . success ( init iate Call ( call . argument < String >(" number ") !! )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ" open Play Store " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġresult . success ( open Play store ( regist rar . active Context (), " com . whats app ")) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ" request Permissions " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġresult čĊĠĠĠĠĠĠĠĠĠ Ġrequest Permissions () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ" create Contact " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġ_ result Ġ= Ġresult čĊĠĠĠĠĠĠĠĠĠ Ġcreate New Contact ( call . argument < String >(" name ") !! , call . argument < String >(" number ") !! ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠ Ġ} čĊčĊĠ Ġprivate Ġfun Ġinitiate Call ( number : ĠString ): String { čĊĠĠĠ Ġval Ġcont ec xt Ġ= Ġregist rar . activity () čĊĠĠĠ Ġval Ġwh ats app Pack Ġ=" com . whats app " čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ Ġreturn Ġif Ġ( is App Installed ( cont ec xt , whats app Pack )) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( is App Enabled ( cont ec xt , whats app Pack )) Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Permissions ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Id Ġ= Ġcontact Id By PhoneNumber ( number ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contact Id Ġ!= Ġnull Ġ&& Ġcontact Id . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwh ats appId Ġ= Ġhas Wh ats app ( contact Id ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( whats appId Ġ!= Ġnull Ġ&& Ġwh ats appId . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall With Wh ats app ( whats appId ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SUCCESS " čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ" NO _ WH ATS APP " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ" NO _ CONTACT " čĊĠĠĠĠĠĠĠĠĠ Ġ} else Ġ" PERMISSION _ DEN IED " čĊĠĠĠĠĠĠĠ Ġ} else Ġ" DISABLED " čĊĠĠĠĠĠ Ġ} else Ġ" NOT _ INST ALLED " čĊĠĠĠ Ġ} catch Ġ( e : Exception ){ čĊĠĠĠĠĠ Ġreturn Ġ" ERROR " čĊĠĠĠ Ġ} čĊĠ Ġ} čĊčĊĠ Ġprivate Ġfun Ġcontact Id By PhoneNumber ( number : ĠString ): ĠString ? Ġ{ čĊĠĠĠ Ġvar Ġcontact Id : ĠString ? Ġ= Ġnull čĊĠĠĠ Ġval ĠphoneNumber Ġ= Ġnumber . replace ("+ ", Ġ""). replace (" Ġ", Ġ"") čĊĠĠĠ Ġif Ġ( phoneNumber . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠ Ġval Ġcontent Resolver Ġ= Ġregist rar . activity (). content Resolver čĊĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . with App ended Path ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Phone Lookup . CONTENT _ FILTER _ URI , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . encode ( phoneNumber ) čĊĠĠĠĠĠ Ġ) čĊĠĠĠĠĠ Ġval Ġprojection Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Contacts Contract . Phone Lookup ._ ID ) čĊĠĠĠĠĠ Ġval Ġcursor Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . query ( uri , Ġprojection , Ġnull , Ġnull , Ġnull ) čĊĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠ Ġcontact Id Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex OrThrow ( Contacts Contract . Phone Lookup ._ ID )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġcursor . close () čĊĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠ Ġreturn Ġcontact Id čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġhas Wh ats app ( contact Id : String ): String ? Ġ{ čĊĠĠĠ Ġvar Ġwh ats appId : String ? Ġ= Ġnull čĊĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data ._ ID , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . CONTACT _ ID , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . DISPLAY _ NAME , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . MIME TYPE , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" account _ type " čĊĠĠĠ Ġ) čĊĠĠĠ Ġval Ġselection Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Raw Contacts . CONTACT _ ID Ġ+ Ġ" Ġ= Ġ? ĠAND Ġ" Ġ+ ĠContact s Contract . Data . MIME TYPE Ġ+ Ġ" Ġ= ? Ġand Ġaccount _ type = ?" čĊĠĠĠ Ġval Ġselection Args Ġ= ĠarrayOf ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Id , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" vnd . android . cursor . item / vnd . com . whats app . video . call ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . whats app " čĊĠĠĠ Ġ) čĊĠĠĠ Ġval Ġcursor Ġ= Ġregist rar . activity (). content Resolver . query ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . CONTENT _ URI , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection , Ġselection , Ġselection Args , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Contacts . DISPLAY _ NAME čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġ// ID ĠQUERY ĠSECTION čĊĠĠĠ Ġwhile Ġ( cursor !!. moveTo Next ()) Ġ{ čĊĠĠĠĠĠ Ġwh ats appId Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( Contacts Contract . Data ._ ID )). toString () čĊĠĠĠ Ġ} čĊĠĠĠ Ġreturn Ġwh ats appId čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġcall With Wh ats app ( profile Id : String ) Ġ{ čĊĠĠĠ Ġ// ĠCALL ĠSECTION čĊĠĠĠ Ġval Ġintent Ġ= ĠIntent () čĊĠĠĠ Ġintent . action Ġ= ĠIntent . ACTION _ VIEW čĊĠĠĠ Ġintent . setData And Type ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" content :// com . android . contacts / data /$ profile Id "), čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" vnd . android . cursor . item / vnd . com . whats app . video . call " čĊĠĠĠ Ġ) čĊĠĠĠ Ġintent . set Package (" com . whats app ") čĊĠĠĠ Ġregist rar . active Context (). startActivity ( intent ) čĊĠ Ġ} čĊčĊĠ Ġprivate Ġfun Ġis App Installed ( context : ĠContext , ĠpackageName : ĠString ): ĠBoolean Ġ{ čĊĠĠĠ Ġval Ġpm : ĠPackage Manager Ġ= Ġcontext . package Manager čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ Ġpm . get Package Info ( packageName , ĠPackage Manager . GET _ ACTIV ITIES ) čĊĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠ Ġ} čĊĠĠĠ Ġcatch Ġ( ignored : ĠPackage Manager . Name NotFoundException ) Ġ{ čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġreturn Ġfalse čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġis App Enabled ( context : ĠContext , ĠpackageName : ĠString ): ĠBoolean Ġ{ čĊĠĠĠ Ġvar Ġapp Status Ġ= Ġfalse čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ Ġval Ġai Ġ= Ġcontext . package Manager . getApplication Info ( packageName , Ġ 0 ) čĊĠĠĠĠĠ Ġapp Status Ġ= Ġai . enabled čĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ čĊĠĠĠĠĠ Ġe . printStackTrace () čĊĠĠĠ Ġ} čĊĠĠĠ Ġreturn Ġapp Status čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġcheck Permissions (): Boolean { čĊĠĠĠ Ġval Ġpermission Ġ= ĠContext Compat . check Self Permission ( regist rar . activity (), ĠManifest . permission . READ _ CONTACT S ) čĊĠĠĠ Ġval Ġpermission 1 Ġ= ĠContext Compat . check Self Permission ( regist rar . activity (), ĠManifest . permission . CALL _ PHONE ) čĊĠĠĠ Ġreturn Ġ!( permission Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ|| čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission 1 Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) čĊĠ Ġ} čĊčĊĠ Ġprivate Ġfun Ġopen Play store ( my Context : ĠContext , ĠpackageName : ĠString ): String Ġ{ čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ Ġval Ġmarket Uri Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" market :// details ? id =$ packageName ") čĊĠĠĠĠĠ Ġval Ġmy Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , Ġmarket Uri ) čĊĠĠĠĠĠ Ġmy Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK čĊĠĠĠĠĠ Ġmy Context . startActivity ( my Intent ) čĊĠĠĠĠĠ Ġreturn Ġ" SUCCESS " čĊĠĠĠ Ġ} catch Ġ(_ : Exception ){} čĊĠĠĠ Ġreturn Ġ" ERROR " čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġrequest Permissions (){ čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ ĠActivity Compat . request Permissions ( regist rar . activity (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . READ _ CONTACT S , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . CALL _ PHONE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), 2 0 3 ) čĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊĠĠĠĠĠ Ġchannel . invoke Method (" on Request Permissions Result "," ERROR ") čĊĠĠĠ Ġ} čĊĠ Ġ} čĊĠ Ġprivate Ġfun Ġcreate New Contact ( name : String , Ġnumber : String ){ čĊĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠ Ġ// ĠCreates Ġa Ġnew ĠIntent Ġto Ġinsert Ġa Ġcontact čĊĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Contacts Contract . Intent s . Insert . ACTION ). apply Ġ{ čĊĠĠĠĠĠĠĠ Ġtype Ġ= ĠContact s Contract . Raw Contacts . CONTENT _ TYPE čĊĠĠĠĠĠ Ġ} čĊĠĠĠĠĠ Ġintent . apply Ġ{ čĊĠĠĠĠĠĠĠ Ġput Extra ( Contacts Contract . Intent s . Insert . NAME , name ) čĊĠĠĠĠĠĠĠ Ġput Extra ( Contacts Contract . Intent s . Insert . PHONE , number ) čĊĠĠĠĠĠ Ġ} čĊĠĠĠĠ Ġregist rar . activity (). startActivity For Result Ġ( intent , 2 0 2 ) čĊĠĠĠ Ġ} catch Ġ( e : Exception ){ čĊĠĠĠĠĠ Ġchannel . invoke Method (" onCreate Contact Result "," ERROR ") čĊĠĠĠ Ġ} čĊĠ Ġ} č Ċ } čĊ