package com.moez.QKSMS.data;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import com.moez.QKSMS.common.TypefaceManager;
import com.moez.QKSMS.common.utils.Units;
import com.moez.QKSMS.ui.ThemeManager;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static android.provider.ContactsContract.CommonDataKinds.Phone;
public class ContactHelper {
private static final String TAG = "ContactHelper";
public static Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
public static class Favorites {
public static String SELECTION = ContactsContract.Contacts.STARRED + "='1'";
public static String[] PROJECTION = new String[]{
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.STARRED,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
ContactsContract.Contacts.PHOTO_THUMBNAIL_URI};
public static final int ID = 0;
public static final int DISPLAY_NAME = 1;
public static final int STARRED = 2;
public static final int HAS_PHONE_NUMBER = 3;
public static final int PHOTO_THUMBNAIL_URI = 4;
}
public static String getName(Context context, String address) {
if (address == null || address.isEmpty() || validateEmail(address))
return address;
Cursor cursor;
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
ContentResolver contentResolver = context.getContentResolver();
String name = address;
try {
cursor = contentResolver.query(uri, new String[]{BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor.moveToNext())
name = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
cursor.close();
} catch (Exception e) {
Log.d(TAG, "Failed to find name for address " + address);
e.printStackTrace();
}
return name;
}
/**
* Get the phone number of a contact given their id
* TODO: The logic for picking the best phone number could be better
*/
public static String getPhoneNumber(Context context, String contactId) {
String number = "";
Cursor cursor;
try {
cursor = context.getContentResolver().query(Phone.CONTENT_URI, null,
Phone.CONTACT_ID + " = " + contactId, null, null);
while (cursor.moveToNext()) {
number = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
int type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE));
switch (type) {
case Phone.TYPE_MOBILE:
// Return right away if it's a mobile number
cursor.close();
return number;
}
}
cursor.close();
} catch (SQLiteException e) {
e.printStackTrace();
}
// Return whatever number we found last, since we don't know which is best
return number;
}
public static boolean validateEmail(String email) {
Pattern pattern;
Matcher matcher;
String EMAIL_PATTERN = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b";
pattern = Pattern.compile(EMAIL_PATTERN);
matcher = pattern.matcher(email);
return matcher.matches();
}
public static Uri getUri(String address) {
return Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
}
public static long getId(Context context, String address) {
if (address == null || address.isEmpty() || validateEmail(address))
return 0;
Cursor cursor;
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
ContentResolver contentResolver = context.getContentResolver();
long id = 0;
try {
cursor = contentResolver.query(uri, new String[]{BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor.moveToNext())
id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID));
cursor.close();
} catch (Exception e) {
Log.d(TAG, "Failed to find ID for address " + address);
e.printStackTrace();
}
return id;
}
public static Uri getPhotoUri(Context context, Uri contactUri) {
Cursor cursor = context.getContentResolver().query(contactUri, Favorites.PROJECTION, null, null, null);
String photoUriString = null;
if (cursor.moveToFirst()) {
photoUriString = cursor.getString(Favorites.PHOTO_THUMBNAIL_URI);
}
return photoUriString == null ? null : Uri.parse(photoUriString);
}
public static Drawable getDrawable(Context context, long id) {
return new BitmapDrawable(context.getResources(), getBitmap(context, id));
}
public static Bitmap getOwnerPhoto(Context context) {
final String[] SELF_PROJECTION = new String[]{Phone._ID};
Cursor cursor = context.getContentResolver().query(ContactsContract.Profile.CONTENT_URI, SELF_PROJECTION, null, null, null);
cursor.moveToFirst();
if (cursor.getCount() > 0) return getBitmap(context, cursor.getLong(0));
return null;
}
public static Bitmap getBitmap(Context context, long id) {
Bitmap bitmap = null;
try {
Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), contactUri, true);
if (input == null) {
return null;
}
BufferedInputStream buf = new BufferedInputStream(input);
bitmap = BitmapFactory.decodeStream(buf);
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
public static Bitmap blankContact(Context context, String name) {
String text = name == null || PhoneNumberUtils.isWellFormedSmsAddress(PhoneNumberUtils.stripSeparators(name)) || name.length() == 0 ? "#" : "" + name.toUpperCase().charAt(0);
int length = Units.dpToPx(context, 64);
Bitmap bitmap = Bitmap.createBitmap(length, length, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(ThemeManager.getColor());
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.WHITE);
paint.setTypeface(TypefaceManager.obtainTypeface(context, TypefaceManager.Typefaces.ROBOTO_LIGHT));
paint.setTextSize(length / 2);
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
int x = (bitmap.getWidth() - bounds.width()) / 2;
int y = (bitmap.getHeight() + bounds.height()) / 2;
canvas.drawText(text, x, y, paint);
return bitmap;
}
}