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