1 package host.exp.exponent.utils
2 
3 import android.content.ContentProviderOperation
4 import android.provider.ContactsContract
5 import android.content.Context
6 import android.net.Uri
7 import java.lang.Exception
8 import java.lang.RuntimeException
9 import java.util.ArrayList
10 
11 object TestContacts {
12   fun add(context: Context) {
13     removeAllContacts(context)
14     addContact(context, "JESSE", "TEST", "1234567890", "[email protected]")
15     addContact(context, "BEN", "TEST", "1234567891", "[email protected]")
16     addContact(context, "JAMES", "TEST", "1234567892", "[email protected]")
17     addContact(context, "BRENT", "TEST", "1234567894", "[email protected]")
18   }
19 
20   private fun addContact(
21     context: Context,
22     firstName: String,
23     lastName: String,
24     phoneNumber: String,
25     email: String
26   ) {
27     val operationList = ArrayList<ContentProviderOperation>()
28     operationList.add(
29       ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
30         .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
31         .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
32         .build()
33     )
34 
35     // first and last names
36     operationList.add(
37       ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
38         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
39         .withValue(
40           ContactsContract.Data.MIMETYPE,
41           ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
42         )
43         .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName)
44         .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, lastName)
45         .build()
46     )
47     operationList.add(
48       ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
49         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
50         .withValue(
51           ContactsContract.Data.MIMETYPE,
52           ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
53         )
54         .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
55         .withValue(
56           ContactsContract.CommonDataKinds.Phone.TYPE,
57           ContactsContract.CommonDataKinds.Phone.TYPE_HOME
58         )
59         .build()
60     )
61     operationList.add(
62       ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
63         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
64         .withValue(
65           ContactsContract.Data.MIMETYPE,
66           ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
67         )
68         .withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
69         .withValue(
70           ContactsContract.CommonDataKinds.Email.TYPE,
71           ContactsContract.CommonDataKinds.Email.TYPE_WORK
72         )
73         .build()
74     )
75     try {
76       context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operationList)
77     } catch (e: Exception) {
78       throw RuntimeException(e)
79     }
80   }
81 
82   private fun removeAllContacts(context: Context) {
83     val cr = context.contentResolver
84     val cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null) ?: return
85     cursor.use {
86       while (it.moveToNext()) {
87         val id = it.getString(it.getColumnIndex(ContactsContract.Contacts._ID))
88         val cur1 = cr.query(
89           ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
90           ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", arrayOf(id), null
91         )
92         var shouldDelete = false
93         while (cur1!!.moveToNext()) {
94           val email =
95             cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))
96           if (email != null && email.endsWith("@testexpo.io")) {
97             shouldDelete = true
98             break
99           }
100         }
101         cur1.close()
102         if (shouldDelete) {
103           val lookupKey = it.getString(it.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY))
104           val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
105           cr.delete(uri, null, null)
106         }
107       }
108     }
109   }
110 }
111