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	private static class NotThrowCursorLoader extends CursorLoader {
 86
 87		public NotThrowCursorLoader(Context c, Uri u, String[] p, String s, String[] sa, String so) {
 88			super(c, u, p, s, sa, so);
 89		}
 90
 91		@Override
 92		public Cursor loadInBackground() {
 93
 94			try {
 95				return (super.loadInBackground());
 96			} catch (Throwable e) {
 97				return(null);
 98			}
 99		}
100
101	}
102
103	public static Uri getSelfiUri(Context context) {
104		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
105				&& context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
106			return null;
107		}
108		String[] mProjection = new String[]{Profile._ID, Profile.PHOTO_URI};
109		Cursor mProfileCursor = context.getContentResolver().query(
110				Profile.CONTENT_URI, mProjection, null, null, null);
111
112		if (mProfileCursor == null || mProfileCursor.getCount() == 0) {
113			return null;
114		} else {
115			mProfileCursor.moveToFirst();
116			String uri = mProfileCursor.getString(1);
117			mProfileCursor.close();
118			if (uri == null) {
119				return null;
120			} else {
121				return Uri.parse(uri);
122			}
123		}
124	}
125
126	public static String getVersionName(Context context) {
127		final String packageName = context == null ? null : context.getPackageName();
128		if (packageName != null) {
129			try {
130				return context.getPackageManager().getPackageInfo(packageName, 0).versionName;
131			} catch (final PackageManager.NameNotFoundException | RuntimeException e) {
132				return "unknown";
133			}
134		} else {
135			return "unknown";
136		}
137	}
138}