File indexing completed on 2024-05-19 04:47:20

0001 package com.kde.maui.tools;
0002 
0003 import android.provider.ContactsContract;
0004 import android.database.Cursor;
0005 import android.app.Activity;
0006 import android.os.Build;
0007 import android.graphics.Bitmap;
0008 import android.graphics.BitmapFactory;
0009 import android.net.Uri;
0010 
0011 import java.util.ArrayList;
0012 import java.util.HashMap;
0013 import java.util.Map;
0014 import java.util.List;
0015 import java.io.ByteArrayInputStream;
0016 import java.io.InputStream;
0017 import java.text.SimpleDateFormat;
0018 import java.util.Date;
0019 
0020 import android.accounts.AccountManager;
0021 import android.accounts.Account;
0022 import android.content.ContentResolver;
0023 import android.content.ContentUris;
0024 import android.content.ContentValues;
0025 import android.content.ContentProviderOperation;
0026 import android.content.ContentProviderOperation.Builder;
0027 import android.content.Intent;
0028 import android.content.IntentFilter;
0029 import android.content.Context;
0030 import android.provider.CallLog.Calls;
0031 import android.provider.CallLog;
0032 
0033 import android.telephony.gsm.SmsManager;
0034 
0035 public class Union
0036 {
0037     enum KEY
0038     {
0039         N,
0040         TEL,
0041         TEL2,
0042         TEL3,
0043         EMAIL,
0044         EMAIL2,
0045         EMAIL3,
0046         PHOTO,
0047         ORG,
0048         TITLE,
0049         NICK
0050     }
0051 
0052     public Union() {}
0053 
0054     public static void sendSMS(Activity context, String tel, String subject, String message)
0055     {
0056         SmsManager smsManager = SmsManager.getDefault();
0057         smsManager.sendTextMessage(tel, null, message, null, null);
0058     }
0059 
0060     public static void call(Activity context, String tel)
0061     {
0062 //        Intent callIntent = new Intent(Intent.ACTION_CALL);
0063 //        callIntent.setData(Uri.parse("tel:" + tel));
0064 
0065 //        context.startActivity(callIntent);
0066 
0067 
0068 
0069         Intent callIntent = new Intent(Intent.ACTION_CALL);
0070 //        callIntent.setPackage("com.android.phone");          // force native dialer  (Android < 5)
0071         callIntent.setPackage("com.android.server.telecom"); // force native dialer  (Android >= 5)
0072         callIntent.setData(Uri.parse("tel:" + tel));
0073         callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
0074         context.startActivity(callIntent);
0075     }
0076 
0077 
0078 //      public static void contacts()
0079 //      {
0080 //                        Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
0081 //                        startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
0082 //      }
0083 
0084 
0085     public static HashMap<String, String> getContact(Context c, String id)
0086     {
0087         HashMap<String, String> res = new HashMap<String, String>();
0088 
0089         String email = "", org = "", title = "";
0090 
0091         ContentResolver cr = c.getContentResolver();
0092 
0093         //ADD E-MAIL DATA...
0094         Cursor emailCursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
0095                 null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
0096                 new String[]{id},
0097                 null);
0098 
0099         if (emailCursor != null)
0100             if (emailCursor.moveToFirst())
0101                 email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
0102 
0103 
0104         if (emailCursor != null)
0105             emailCursor.close();
0106 
0107         //ADD ORG DATA...
0108         Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI,
0109                 null, ContactsContract.Data.CONTACT_ID + " = ?",
0110                 new String[]{id},
0111                 null);
0112 
0113         if (orgCur != null)
0114             if (orgCur.moveToFirst())
0115             {
0116                 org = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)) == null ? "" : orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
0117                 title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)) == null ? "" : orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
0118             }
0119 
0120 //                    //ADD ADDRESS DATA...
0121 //                    Cursor addrCursor = c.getContentResolver().query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
0122 //                            null, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?",
0123 //                            new String[]{id},
0124 //                            null);
0125 
0126 //                    if (addrCursor != null)
0127 //                    {
0128 //                        int i = 0;
0129 
0130 //                        while (addrCursor.moveToNext())
0131 //                        {
0132 //                            if (i > 2) break;
0133 
0134 //                            String city = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
0135 //                            String state = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
0136 //                            String country = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
0137 
0138 //                            if (i == 0)
0139 //                                fetch += "<adr><city>" + city + "</city><state>" + state + "</state><country>" + country + "</country></adr>";
0140 //                            else
0141 //                                fetch += "<adr" + Integer.toString(i) + "><city>" + city + "</city><state>" + state + "</state><country>" + country + "</country></adr>";
0142 
0143 //                            i++;
0144 //                        }
0145 //                    }
0146 
0147 //                    if (addrCursor != null)
0148 //                        addrCursor.close();
0149 
0150         //Get Instant Messenger.........
0151 //                    String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
0152 //                    String[] imWhereParams = new String[]{id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
0153 //                    Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, null, imWhere, imWhereParams, null);
0154 
0155 //                    if (imCur.moveToFirst())
0156 //                    {
0157 //                        String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
0158 //                        String imType;
0159 //                        imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
0160 
0161 //                        fetch += "<im><nickname>" + imName + "</nickname><type>" + imType + "</type></im>";
0162 
0163 //                    }
0164 
0165 //                if (imCur != null)
0166 //                    imCur.close();
0167 
0168 
0169         res.put("email", email == null ? "" : email);
0170         res.put("org", org == null ? "" : org);
0171         res.put("title", title == null ? "" : title);
0172 
0173         return res;
0174     }
0175 
0176     public static Bitmap loadContactPhoto(Context c, String id)
0177     {
0178         System.out.println("GETTIGN CONTACT IMAGE " + id);
0179         ContentResolver cr = c.getContentResolver();
0180         Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
0181         InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
0182         if (input == null) {
0183             System.out.println("GETTIGN CONTACT IMAGE: NO IMAGE");
0184 
0185             return null;
0186         }
0187 
0188         System.out.println("GETTIGN CONTACT IMAGE: GOT IMAGE");
0189 
0190         return BitmapFactory.decodeStream(input);
0191     }
0192 
0193 
0194 //    private static String[] convertColumns(String columns)
0195 //    {
0196 ////        String[] res = new String[];
0197 
0198 ////        final HashMap<String, int> map = new HashMap<String, int>();
0199 ////        map.put("fav",  ContactsContract.Contacts.STARRED);
0200 ////        map.put("fav",  ContactsContract.Contacts.STARRED);
0201 ////        map.put("fav",  ContactsContract.Contacts.STARRED);
0202 
0203 ////        for(String value : columns.split(","))
0204 ////        {
0205 
0206 ////            }
0207 
0208 ////        return res;
0209 
0210 //        }
0211 
0212     private static List<Integer> getRawContactsIdList(Context c)
0213     {
0214         List<Integer> ret = new ArrayList<Integer>();
0215 
0216               ContentResolver contentResolver = c.getContentResolver();
0217 
0218               // Row contacts content uri( access raw_contacts table. ).
0219 //              Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI;
0220               Uri rawContactUri = ContactsContract.Contacts.CONTENT_URI;
0221               // Return _id column in contacts raw_contacts table.
0222               final String queryColumnArr[] = {ContactsContract.Contacts._ID};
0223               // Query raw_contacts table and return raw_contacts table _id.
0224 //              final String RAW_CONTACT_SELECTION = ContactsContract.RawContacts.DELETED + " = 0 ";
0225 
0226               Cursor cursor = contentResolver.query(rawContactUri,queryColumnArr, null, null, null);
0227               if(cursor!=null)
0228               {
0229                   cursor.moveToFirst();
0230                   do{
0231                       int idColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
0232                       int rawContactsId = cursor.getInt(idColumnIndex);
0233                       ret.add(new Integer(rawContactsId));
0234                   }while(cursor.moveToNext());
0235               }
0236 
0237               cursor.close();
0238 
0239               return ret;
0240     }
0241 
0242     public static List<HashMap<String, String>> fetchContacts(Context c)
0243     {
0244         System.out.println("FETCHING CONTACTS");
0245         List<HashMap<String,String>> res =  new ArrayList<HashMap<String, String>>();
0246 
0247 
0248 
0249         ContentResolver cr = c.getContentResolver();
0250 
0251             final String[] projection = new String[]
0252             {
0253                 ContactsContract.Contacts._ID,
0254                     ContactsContract.Contacts.DISPLAY_NAME,
0255                     ContactsContract.Contacts.STARRED,
0256                     ContactsContract.Contacts.PHOTO_URI
0257             };
0258 
0259         Cursor mainCursor = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, null);
0260         if (mainCursor != null)
0261                {
0262                    while (mainCursor.moveToNext())
0263                    {
0264     String tel = "", accountName = "" , accountType= "";
0265                        String id = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts._ID));
0266                        String fav = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.STARRED));
0267                        String name = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
0268   String photo = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));
0269 
0270 
0271                             //ADD ACCOUNT DATA...
0272 
0273                             final String[] accountProjection = new String[] {
0274                                     ContactsContract.RawContacts.ACCOUNT_NAME,
0275                                     ContactsContract.RawContacts.ACCOUNT_TYPE
0276                             };
0277                             Cursor accountCursor = cr.query(ContactsContract.RawContacts.CONTENT_URI,
0278                                     accountProjection,
0279                                     ContactsContract.RawContacts.CONTACT_ID + " = ?",
0280                                     new String[]{id},
0281                                     null);
0282 
0283                             if (accountCursor != null)
0284                                 if (accountCursor.moveToFirst())
0285                                 {
0286                                     accountName = accountCursor.getString(accountCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME));
0287                                     accountType = accountCursor.getString(accountCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));
0288                                 }
0289 
0290 
0291                             if (accountCursor != null)
0292                                 accountCursor.close();
0293 
0294        Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
0295        new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER},
0296                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
0297                        new String[]{id},
0298                        null);
0299 
0300                if (phoneCursor != null)
0301                    if (phoneCursor.moveToFirst())
0302                        tel = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
0303 
0304 
0305                if (phoneCursor != null)
0306                    phoneCursor.close();
0307 
0308 
0309 
0310                        HashMap<String, String> contact = new HashMap<String, String>();
0311                        contact.put("id", id);
0312                        contact.put("fav", fav == null ? "" : fav);
0313                        contact.put("tel", tel == null ? "" : tel);
0314        //                contact.put("email", email == null ? "" : email);
0315                        contact.put("n", name == null ? "" : name);
0316                        contact.put("account", accountName == null ? "" : accountName);
0317                        contact.put("type", accountType == null ? "" : accountType);
0318                        contact.put("photo", photo == null ? "" : photo);
0319        res.add(contact);
0320 
0321                        }
0322 
0323                    }
0324 
0325                            if (mainCursor != null)
0326                                mainCursor.close();
0327 
0328 
0329 //final String[] projection = new String[] {
0330 //    ContactsContract.Data.CONTACT_ID,
0331 //        ContactsContract.Data.MIMETYPE,
0332 //        ContactsContract.Contacts.DISPLAY_NAME,
0333 //        ContactsContract.Contacts.STARRED,
0334 //        ContactsContract.Contacts.PHOTO_URI,
0335 //        ContactsContract.CommonDataKinds.Phone.NUMBER,
0336 //        ContactsContract.RawContacts.ACCOUNT_NAME,
0337 //        ContactsContract.RawContacts.ACCOUNT_TYPE,
0338 //        ContactsContract.CommonDataKinds.Email.ADDRESS
0339 //};
0340 
0341 //        List<Integer> rawContactsIdList = getRawContactsIdList(c);
0342 //        final int contactListSize = rawContactsIdList.size();
0343 //        System.out.println("ACCOUNTS LIST SIZE:" + contactListSize);
0344 //        for(int i=0;i<contactListSize;i++)
0345 //        {
0346 //            // Get the raw contact id.
0347 //            Integer rawContactId = rawContactsIdList.get(i);
0348 //            final StringBuffer whereClauseBuf = new StringBuffer();
0349 //            whereClauseBuf.append(ContactsContract.Data.CONTACT_ID);
0350 //            whereClauseBuf.append("=");
0351 //            whereClauseBuf.append(rawContactId);
0352 
0353 //            Cursor mainCursor = cr.query(ContactsContract.Data.CONTENT_URI, projection, whereClauseBuf.toString(), null, null);
0354 
0355 //            if(mainCursor!=null && mainCursor.getCount() > 0)
0356 //            {
0357 
0358 //                mainCursor.moveToFirst();
0359 //                long contactId = mainCursor.getLong(mainCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID));
0360 //                String fav = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.STARRED));
0361 ////                String name = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
0362 //                String accountName = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME));
0363 //                String accountType = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE));
0364 ////                String tel = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
0365 ////                String email = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
0366 ////                String photo = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));
0367 
0368 //                HashMap<String, String> contact = new HashMap<String, String>();
0369 //                contact.put("id", Long.toString(contactId));
0370 //                contact.put("fav", fav == null ? "" : fav);
0371 ////                contact.put("tel", tel == null ? "" : tel);
0372 ////                contact.put("email", email == null ? "" : email);
0373 ////                contact.put("n", name == null ? "" : name);
0374 //                contact.put("account", accountName == null ? "" : accountName);
0375 //                contact.put("type", accountType == null ? "" : accountType);
0376 ////                contact.put("photo", photo == null ? "" : photo);
0377 
0378 //                            do
0379 //                            {
0380 //                                // First get mimetype column value.
0381 //                                String mimeType = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
0382 
0383 //                                contact.putAll(getColumnValueByMimetype(mainCursor, mimeType));
0384 
0385 
0386 //                            }while(mainCursor.moveToNext());
0387 
0388 //                res.add(contact);
0389 
0390 //            }
0391 
0392 //            if (mainCursor != null)
0393 //                mainCursor.close();
0394 
0395 //        }
0396         return res;
0397     }
0398 
0399     /*
0400      *  Get email type related string format value.
0401      * */
0402     private static String getEmailTypeString(int dataType)
0403     {
0404         String ret = "";
0405 
0406         if(ContactsContract.CommonDataKinds.Email.TYPE_HOME == dataType)
0407         {
0408             ret = "Home";
0409         }else if(ContactsContract.CommonDataKinds.Email.TYPE_WORK==dataType)
0410         {
0411             ret = "Work";
0412         }
0413         return ret;
0414     }
0415 
0416     /*
0417      *  Get phone type related string format value.
0418      * */
0419     private static String getPhoneTypeString(int dataType)
0420     {
0421         String ret = "";
0422 
0423         if(ContactsContract.CommonDataKinds.Phone.TYPE_HOME == dataType)
0424         {
0425             ret = "Home";
0426         }else if(ContactsContract.CommonDataKinds.Phone.TYPE_WORK==dataType)
0427         {
0428             ret = "Work";
0429         }else if(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE==dataType)
0430         {
0431             ret = "Mobile";
0432         }
0433         return ret;
0434     }
0435 
0436 
0437     private static HashMap<String, String> getColumnValueByMimetype(Cursor cursor, String mimeType)
0438     {
0439         HashMap<String, String> res = new HashMap<String, String>();
0440 
0441         switch (mimeType)
0442         {
0443             // Get email data.
0444 //            case ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE :
0445 //                // Email.ADDRESS == data1
0446 //                String emailAddress = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
0447 //                // Email.TYPE == data2
0448 //                int emailType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
0449 //                String emailTypeStr = getEmailTypeString(emailType);
0450 
0451 //                res.put("email", emailAddress);
0452 //                res.put("email_type", Integer.toString(emailType));
0453 //                res.put("email_str_type", emailTypeStr);
0454 //                break;
0455 
0456             // Get im data.
0457 //            case ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE:
0458 //                // Im.PROTOCOL == data5
0459 //                String imProtocol = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL));
0460 //                // Im.DATA == data1
0461 //                String imId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
0462 
0463 //                res.put("im", imProtocol);
0464 //                res.put("im_id", imId);
0465 //                break;
0466 
0467             // Get nickname
0468 //            case ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE:
0469 //                // Nickname.NAME == data1
0470 //                String nickName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));
0471 //                res.put("nickname", nickName);
0472 //                break;
0473 
0474 //            // Get organization data.
0475 //            case ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE:
0476 //                // Organization.COMPANY == data1
0477 //                String company = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY));
0478 //                // Organization.DEPARTMENT == data5
0479 //                String department = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT));
0480 //                // Organization.TITLE == data4
0481 //                String title = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
0482 //                // Organization.JOB_DESCRIPTION == data6
0483 //                String jobDescription = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION));
0484 //                // Organization.OFFICE_LOCATION == data9
0485 //                String officeLocation = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION));
0486 
0487 //                res.put("org", company);
0488 //                res.put("department", department);
0489 //                res.put("title", title);
0490 //                res.put("job_description", jobDescription);
0491 //                res.put("office_location", officeLocation);
0492 //                break;
0493 
0494             // Get phone number.
0495             case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE:
0496                 // Phone.NUMBER == data1
0497                 String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
0498                 // Phone.TYPE == data2
0499 //                int phoneTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
0500 //                String phoneTypeStr = getPhoneTypeString(phoneTypeInt);
0501 
0502                 res.put("tel", phoneNumber);/*
0503                 res.put("tel_type", Integer.toString(phoneTypeInt));
0504                 res.put("tel_str_type", phoneTypeStr);*/
0505                 break;
0506 
0507             // Get sip address.
0508 //            case ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE:
0509 //                // SipAddress.SIP_ADDRESS == data1
0510 //                String address = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS));
0511 //                // SipAddress.TYPE == data2
0512 //                int addressTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.TYPE));
0513 //                String addressTypeStr = getEmailTypeString(addressTypeInt);
0514 
0515 //                res.put("address", address);
0516 //                res.put("address_type", Integer.toString(addressTypeInt));
0517 //                res.put("address_str_type", addressTypeStr);
0518 //                break;
0519 
0520 //            // Get display name.
0521             case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE:
0522                 // StructuredName.DISPLAY_NAME == data1
0523                 String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
0524 //                // StructuredName.GIVEN_NAME == data2
0525 //                String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
0526 //                // StructuredName.FAMILY_NAME == data3
0527 //                String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
0528 
0529                 res.put("n", displayName);/*
0530                 res.put("name", givenName);
0531                 res.put("lastname", familyName);*/
0532                 break;
0533 
0534 //            // Get postal address.
0535 //            case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE:
0536 //                // StructuredPostal.COUNTRY == data10
0537 //                String country = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
0538 //                // StructuredPostal.CITY == data7
0539 //                String city = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
0540 //                // StructuredPostal.REGION == data8
0541 //                String region = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
0542 //                // StructuredPostal.STREET == data4
0543 //                String street = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
0544 //                // StructuredPostal.POSTCODE == data9
0545 //                String postcode = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
0546 //                // StructuredPostal.TYPE == data2
0547 //                int postType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
0548 //                String postTypeStr = getEmailTypeString(postType);
0549 
0550 //                res.put("country", country);
0551 //                res.put("city", city);
0552 //                res.put("region", region);
0553 //                res.put("street", street);
0554 //                res.put("postcode", postcode);
0555 //                res.put("postcode_type", Integer.toString(postType));
0556 //                res.put("postcode_str_type", postTypeStr);
0557 //                break;
0558 
0559 //            // Get identity.
0560 //            case ContactsContract.CommonDataKinds.Identity.CONTENT_ITEM_TYPE:
0561 //                // Identity.IDENTITY == data1
0562 //                String identity = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Identity.IDENTITY));
0563 //                // Identity.NAMESPACE == data2
0564 //                String namespace = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Identity.NAMESPACE));
0565 
0566 //                res.put("identity", identity);
0567 //                res.put("identity_namespace", namespace);
0568 //                break;
0569 
0570             // Get photo.
0571             case ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE:
0572                 // Photo.PHOTO == data15
0573                 String photo = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));
0574                 // Photo.PHOTO_FILE_ID == data14
0575 //                String photoFileId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID));
0576 
0577                 res.put("photo", photo);
0578 //                res.put("photo_file_id", photoFileId);
0579                 break;
0580 
0581 //            // Get group membership.
0582 //            case ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE:
0583 //                // GroupMembership.GROUP_ROW_ID == data1
0584 //                int groupId = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID));
0585 //                res.put("group", Integer.toString(groupId));
0586 //                break;
0587 
0588 //            // Get website.
0589 //            case ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE:
0590 //                // Website.URL == data1
0591 //                String websiteUrl = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL));
0592 //                // Website.TYPE == data2
0593 //                int websiteTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE));
0594 //                String websiteTypeStr = getEmailTypeString(websiteTypeInt);
0595 
0596 //                res.put("url", websiteUrl);
0597 //                res.put("url_type", Integer.toString(websiteTypeInt));
0598 //                res.put("url_str_type", websiteTypeStr);
0599 //                break;
0600 
0601 //            // Get note.
0602 //            case ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE:
0603 //                // Note.NOTE == data1
0604 //                String note = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
0605 //                res.put("note", note);
0606 //                break;
0607 
0608         }
0609 
0610         return res;
0611     }
0612 
0613     public static int APIVersion()
0614     {
0615         return Build.VERSION.SDK_INT;
0616 
0617     }
0618 
0619 
0620 
0621     public static void addContact(Context c,
0622                                   String name,
0623                                   String tel,
0624                                   String tel2,
0625                                   String tel3,
0626                                   String email,
0627                                   String title,
0628                                   String org,
0629                                   String photoUrl,
0630                                   String accountName,
0631                                   String accountType)
0632     {
0633 
0634         String DisplayName = name;
0635         String MobileNumber = tel;
0636         String HomeNumber = tel2;
0637         String WorkNumber = tel3;
0638         String emailID = email;
0639         String company = org;
0640         String jobTitle = title;
0641         String photo = photoUrl;
0642 
0643         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
0644 
0645         ops.add(ContentProviderOperation.newInsert(
0646                 ContactsContract.RawContacts.CONTENT_URI)
0647                 .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType)
0648                 .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName)
0649                 .build());
0650 
0651         //------------------------------------------------------ Names
0652         if (DisplayName != null)
0653         {
0654             ops.add(ContentProviderOperation.newInsert(
0655                     ContactsContract.Data.CONTENT_URI)
0656                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0657                     .withValue(ContactsContract.Data.MIMETYPE,
0658                             ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
0659                     .withValue(
0660                             ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
0661                             DisplayName).build());
0662         }
0663 
0664         //------------------------------------------------------ Photo
0665         if (photo != null)
0666         {
0667             ops.add(ContentProviderOperation.newInsert(
0668                     ContactsContract.Data.CONTENT_URI)
0669                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0670                     .withValue(ContactsContract.Data.MIMETYPE,
0671                             ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
0672                     .withValue(
0673                             ContactsContract.CommonDataKinds.Photo.PHOTO,
0674                             photo).build());
0675         }
0676 
0677         //------------------------------------------------------ Mobile Number
0678         if (MobileNumber != null)
0679         {
0680             ops.add(ContentProviderOperation.
0681                     newInsert(ContactsContract.Data.CONTENT_URI)
0682                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0683                     .withValue(ContactsContract.Data.MIMETYPE,
0684                             ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
0685                     .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, MobileNumber)
0686                     .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
0687                             ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
0688                     .build());
0689         }
0690 
0691         //------------------------------------------------------ Home Numbers
0692         if (HomeNumber != null)
0693         {
0694             ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
0695                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0696                     .withValue(ContactsContract.Data.MIMETYPE,
0697                             ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
0698                     .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, HomeNumber)
0699                     .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
0700                             ContactsContract.CommonDataKinds.Phone.TYPE_HOME)
0701                     .build());
0702         }
0703 
0704         //------------------------------------------------------ Work Numbers
0705         if (WorkNumber != null)
0706         {
0707             ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
0708                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0709                     .withValue(ContactsContract.Data.MIMETYPE,
0710                             ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
0711                     .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, WorkNumber)
0712                     .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
0713                             ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
0714                     .build());
0715         }
0716 
0717         //------------------------------------------------------ Email
0718         if (emailID != null)
0719         {
0720             ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
0721                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0722                     .withValue(ContactsContract.Data.MIMETYPE,
0723                             ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
0724                     .withValue(ContactsContract.CommonDataKinds.Email.DATA, emailID)
0725                     .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
0726                     .build());
0727         }
0728 
0729         //------------------------------------------------------ Organization
0730         if (!company.equals("") && !jobTitle.equals(""))
0731         {
0732             ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
0733                     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
0734                     .withValue(ContactsContract.Data.MIMETYPE,
0735                             ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
0736                     .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company)
0737                     .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK)
0738                     .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, jobTitle)
0739                     .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK)
0740                     .build());
0741         }
0742 
0743         // Asking the Contact provider to create a new contact
0744         try
0745         {
0746             c.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
0747         } catch (Exception e)
0748         {
0749             e.printStackTrace();
0750 //             Toast.makeText(myContext, "Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show();
0751         }
0752     }
0753 
0754     public static void updateContact(Context c, String id, String field, String value)
0755     {
0756 
0757         ContentResolver cr = c.getContentResolver();
0758 
0759         String firstname = "Contact's first name";
0760         String lastname = "Last name";
0761         String number = "000 000 000";
0762 
0763         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
0764 
0765         Builder builder;
0766         switch(field)
0767         {
0768 
0769             case "tel" :
0770             {
0771                 // Number
0772                 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
0773                 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?"+ " AND " + ContactsContract.CommonDataKinds.Organization.TYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)});
0774                 builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, value);
0775                 ops.add(builder.build());
0776                 break;
0777             }
0778 
0779             case "n":
0780             {
0781                 // Name
0782                 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
0783                 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE});
0784                 builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, value);
0785                 ops.add(builder.build());
0786                 break;
0787 
0788             }
0789 
0790             case "email":
0791             {
0792                 // Name
0793                 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
0794                 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE});
0795                 builder.withValue(ContactsContract.CommonDataKinds.Email.DATA, value);
0796                 ops.add(builder.build());
0797                 break;
0798 
0799             }
0800 
0801             case "fav":
0802             {
0803 
0804                 System.out.println("UPDATING CONTACT FAV " + field + " " + value);
0805                 // Name
0806                 builder = ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI);
0807                 builder.withSelection(ContactsContract.Contacts._ID + "=?", new String[]{id});
0808                 builder.withValue(ContactsContract.Contacts.STARRED, value);
0809                 ops.add(builder.build());
0810                 break;
0811 
0812             }
0813 
0814 
0815 
0816             default: return;
0817 
0818         }
0819 
0820         // Update
0821         try
0822         {
0823             cr.applyBatch(ContactsContract.AUTHORITY, ops);
0824         }
0825         catch (Exception e)
0826         {
0827             e.printStackTrace();
0828         }
0829     }
0830 
0831     public static void shareContact(Context c, String id)
0832     {
0833         String lookupKey = id;
0834         System.out.println("SHARING COINTACT WITH ID "+id);
0835         final Uri shareUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
0836         final Intent intent = new Intent(Intent.ACTION_SEND);
0837         intent.setType(ContactsContract.Contacts.CONTENT_VCARD_TYPE);
0838         intent.putExtra(Intent.EXTRA_STREAM, shareUri);
0839 
0840 
0841         c.startActivity(Intent.createChooser(intent, "Share contact"));
0842 
0843 
0844 
0845     }
0846 
0847     public static String getAccounts(Context c)
0848     {
0849         Account[] accountList = AccountManager.get(c).getAccounts();
0850 
0851         String accountSelection = "<root>";
0852 
0853         for (int i = 0; i < accountList.length; i++)
0854         {
0855             String accountName = accountList[i].name;
0856             String accountType = accountList[i].type;
0857 
0858             accountSelection += "<account><name>" + accountName + "</name><type>" + accountType + "</type></account>";
0859 
0860         }
0861 
0862         accountSelection += "</root>";
0863         return accountSelection;
0864     }
0865 
0866     public static List<HashMap<String, String>> callLogs(Context c)
0867     {
0868 
0869         System.out.println("GETTING CALL LOGS");
0870         List<HashMap<String,String>> res =  new ArrayList<HashMap<String, String>>();
0871         String[] projection = new String[] {
0872                 CallLog.Calls.CACHED_NAME,
0873                 CallLog.Calls.NUMBER,
0874                 CallLog.Calls.TYPE,
0875                 CallLog.Calls.DATE,
0876                 CallLog.Calls.DURATION,
0877                 CallLog.Calls._ID,
0878 
0879         };
0880         // String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
0881 
0882         Cursor cursor =  c.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, null);
0883         while (cursor.moveToNext())
0884         {
0885             String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
0886             String tel = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
0887             String type = cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE)); // https://developer.android.com/reference/android/provider/CallLog.Calls.html#TYPE
0888             long seconds = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); // epoch time - https://developer.android.com/reference/java/text/DateFormat.html#parse(java.lang.String
0889             String duration = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION));
0890             String id = cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID));
0891             String dir = null;
0892             switch (Integer.parseInt(type))
0893             {
0894                 case CallLog.Calls.OUTGOING_TYPE:
0895                     dir = "OUTGOING";
0896                     break;
0897 
0898                 case CallLog.Calls.INCOMING_TYPE:
0899                     dir = "INCOMING";
0900                     break;
0901 
0902                 case CallLog.Calls.MISSED_TYPE:
0903                     dir = "MISSED";
0904                     break;
0905             }
0906 
0907 
0908             SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm");
0909             String time = formatter.format(new Date(seconds));
0910 
0911             HashMap map = new HashMap<String, String>();
0912             map.put("n", name == null ? (tel == null ? "" : tel): name);
0913             map.put("tel", tel == null ? "" : tel);
0914             map.put("type", dir == null ? "" : dir);
0915             map.put("duration", duration == null ? "" : duration);
0916             map.put("id", id == null ? "" : id);
0917             map.put("date", time == null ? "" : time);
0918             res.add(map);
0919         }
0920         cursor.close();
0921 
0922         return res;
0923     }
0924 
0925 }