PhoneHelper.java

  1package eu.siacs.conversations.utils;
  2
  3import android.Manifest;
  4import android.content.Context;
  5import android.content.CursorLoader;
  6import android.content.Loader;
  7import android.content.Loader.OnLoadCompleteListener;
  8import android.content.pm.PackageManager;
  9import android.database.Cursor;
 10import android.net.Uri;
 11import android.os.Build;
 12import android.os.Bundle;
 13import android.provider.ContactsContract;
 14import android.provider.ContactsContract.Profile;
 15
 16import java.util.List;
 17import java.util.concurrent.RejectedExecutionException;
 18
 19public class PhoneHelper {
 20
 21	public static void loadPhoneContacts(Context context, final List<Bundle> phoneContacts, final OnPhoneContactsLoadedListener listener) {
 22		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
 23				&& context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
 24			listener.onPhoneContactsLoaded(phoneContacts);
 25			return;
 26		}
 27		final String[] PROJECTION = new String[]{ContactsContract.Data._ID,
 28				ContactsContract.Data.DISPLAY_NAME,
 29				ContactsContract.Data.PHOTO_URI,
 30				ContactsContract.Data.LOOKUP_KEY,
 31				ContactsContract.CommonDataKinds.Im.DATA};
 32
 33		final String SELECTION = "(" + ContactsContract.Data.MIMETYPE + "=\""
 34				+ ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
 35				+ "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
 36				+ "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
 37				+ "\")";
 38
 39		CursorLoader mCursorLoader = new NotThrowCursorLoader(context,
 40				ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
 41				null);
 42		mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
 43
 44			@Override
 45			public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
 46				if (cursor != null) {
 47					while (cursor.moveToNext()) {
 48						Bundle contact = new Bundle();
 49						contact.putInt("phoneid", cursor.getInt(cursor
 50								.getColumnIndex(ContactsContract.Data._ID)));
 51						contact.putString(
 52								"displayname",
 53								cursor.getString(cursor
 54										.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
 55						contact.putString("photouri", cursor.getString(cursor
 56								.getColumnIndex(ContactsContract.Data.PHOTO_URI)));
 57						contact.putString("lookup", cursor.getString(cursor
 58								.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)));
 59
 60						contact.putString(
 61								"jid",
 62								cursor.getString(cursor
 63										.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)));
 64						phoneContacts.add(contact);
 65					}
 66					cursor.close();
 67				}
 68
 69				if (listener != null) {
 70					listener.onPhoneContactsLoaded(phoneContacts);
 71				}
 72			}
 73		});
 74		try {
 75			mCursorLoader.startLoading();
 76		} catch (RejectedExecutionException e) {
 77			if (listener != null) {
 78				listener.onPhoneContactsLoaded(phoneContacts);
 79			}
 80		}
 81	}
 82
 83	private static class NotThrowCursorLoader extends CursorLoader {
 84
 85		public NotThrowCursorLoader(Context c, Uri u, String[] p, String s, String[] sa, String so) {
 86			super(c, u, p, s, sa, so);
 87		}
 88
 89		@Override
 90		public Cursor loadInBackground() {
 91
 92			try {
 93				return (super.loadInBackground());
 94			} catch (SecurityException e) {
 95				return(null);
 96			}
 97		}
 98
 99	}
100
101	public static Uri getSefliUri(Context context) {
102		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
103				&& context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
104			return null;
105		}
106		String[] mProjection = new String[]{Profile._ID, Profile.PHOTO_URI};
107		Cursor mProfileCursor = context.getContentResolver().query(
108				Profile.CONTENT_URI, mProjection, null, null, null);
109
110		if (mProfileCursor == null || mProfileCursor.getCount() == 0) {
111			return null;
112		} else {
113			mProfileCursor.moveToFirst();
114			String uri = mProfileCursor.getString(1);
115			mProfileCursor.close();
116			if (uri == null) {
117				return null;
118			} else {
119				return Uri.parse(uri);
120			}
121		}
122	}
123
124	public static String getVersionName(Context context) {
125		final String packageName = context == null ? null : context.getPackageName();
126		if (packageName != null) {
127			try {
128				return context.getPackageManager().getPackageInfo(packageName, 0).versionName;
129			} catch (final PackageManager.NameNotFoundException | RuntimeException e) {
130				return "unknown";
131			}
132		} else {
133			return "unknown";
134		}
135	}
136}