From 576e8df643873d811af470314b5327b1cd352c79 Mon Sep 17 00:00:00 2001 From: Rohan Pawar Date: Wed, 7 Mar 2018 16:50:01 +0530 Subject: [PATCH] Updated RxJava to RxJava 2 in core rx-contact lib Added Read contact permission in example Added lambda support in example app --- app/build.gradle | 11 ++- .../rxcontacts/app/ContactAdapter.java | 12 +-- .../rxcontacts/app/MainActivity.java | 90 ++++++++++--------- build.gradle | 6 +- rx-contacts/build.gradle | 4 +- rx-contacts/src/main/AndroidManifest.xml | 5 +- .../de/ulrichraab/rxcontacts/RxContacts.java | 49 +++++----- 7 files changed, 96 insertions(+), 81 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 90c3471..ea624b7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,14 +20,19 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - compile project(":rx-contacts") + implementation project(":rx-contacts") - compile "com.android.support:appcompat-v7:$rootProject.ext.androidSupportVersion" - compile "com.android.support:recyclerview-v7:$rootProject.ext.androidSupportVersion" + implementation "com.android.support:appcompat-v7:$rootProject.ext.androidSupportVersion" + implementation "com.android.support:recyclerview-v7:$rootProject.ext.androidSupportVersion" + implementation 'pub.devrel:easypermissions:1.1.3' // Testing testCompile "junit:junit:$rootProject.ext.junitVersion" diff --git a/app/src/main/java/de/ulrichraab/rxcontacts/app/ContactAdapter.java b/app/src/main/java/de/ulrichraab/rxcontacts/app/ContactAdapter.java index b61ada6..149ef6a 100644 --- a/app/src/main/java/de/ulrichraab/rxcontacts/app/ContactAdapter.java +++ b/app/src/main/java/de/ulrichraab/rxcontacts/app/ContactAdapter.java @@ -2,7 +2,6 @@ import android.support.v7.widget.RecyclerView; -import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; @@ -24,13 +23,10 @@ public class ContactAdapter extends RecyclerView.Adapter { + if (callback != null) { + Contact contact = ((ContactView) v).getContact(); + callback.onClick(contact); } }); // Create and return the view holder diff --git a/app/src/main/java/de/ulrichraab/rxcontacts/app/MainActivity.java b/app/src/main/java/de/ulrichraab/rxcontacts/app/MainActivity.java index c4e8b35..0147033 100644 --- a/app/src/main/java/de/ulrichraab/rxcontacts/app/MainActivity.java +++ b/app/src/main/java/de/ulrichraab/rxcontacts/app/MainActivity.java @@ -1,45 +1,64 @@ package de.ulrichraab.rxcontacts.app; +import android.Manifest; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.List; -import de.ulrichraab.rxcontacts.Contact; import de.ulrichraab.rxcontacts.RxContacts; -import rx.Observer; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Func1; -import rx.functions.Func2; -import rx.schedulers.Schedulers; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import pub.devrel.easypermissions.AfterPermissionGranted; +import pub.devrel.easypermissions.EasyPermissions; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { + private static final int RC_PERMISSION_CONTACTS = 1254; private ContactAdapter contactAdapter; @Override - protected void onCreate (Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initializeRecyclerView(); - requestContacts(); + callPermission(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + } + + @AfterPermissionGranted(RC_PERMISSION_CONTACTS) + private void callPermission() { + String[] perms = {Manifest.permission.READ_CONTACTS}; + if (EasyPermissions.hasPermissions(this, perms)) { + requestContacts(); + } else { + + EasyPermissions.requestPermissions(this, "Grant all permissions", RC_PERMISSION_CONTACTS, perms); + } } - private void initializeRecyclerView () { + private void initializeRecyclerView() { ContactAdapter contactAdapter = getContactAdapter(); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); - RecyclerView rv = (RecyclerView) findViewById(R.id.recyclerView_contacts); + RecyclerView rv = findViewById(R.id.recyclerView_contacts); if (rv != null) { rv.setAdapter(contactAdapter); rv.setLayoutManager(linearLayoutManager); } } - private ContactAdapter getContactAdapter () { + private ContactAdapter getContactAdapter() { if (contactAdapter != null) { return contactAdapter; } @@ -47,36 +66,27 @@ private ContactAdapter getContactAdapter () { return contactAdapter; } - private void requestContacts () { - RxContacts - .fetch(this) - .filter(new Func1() { - @Override - public Boolean call (Contact contact) { - return contact.inVisibleGroup == 1; - } - }) - .toSortedList(new Func2() { - @Override - public Integer call (Contact lhs, Contact rhs) { - return lhs.displayName.compareTo(rhs.displayName); - } - }) - .observeOn(Schedulers.io()) - .subscribeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override - public void onCompleted () {} - - @Override - public void onError (Throwable e) {} - - @Override - public void onNext (List contacts) { + private void requestContacts() { + + RxContacts.fetch(this) + .filter(contact -> contact.inVisibleGroup == 1) + .toSortedList((lhs, rhs) -> lhs.displayName.compareTo(rhs.displayName)) + .observeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(contacts -> { ContactAdapter adapter = getContactAdapter(); adapter.setContacts(contacts); adapter.notifyDataSetChanged(); - } - }); + }); + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + requestContacts(); + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + } } diff --git a/build.gradle b/build.gradle index a90e335..64df747 100644 --- a/build.gradle +++ b/build.gradle @@ -42,9 +42,9 @@ ext { targetSdkVersion = 27 // dependencies - androidSupportVersion = '27.0.2' - rxAndroidVersion = '1.2.1' - rxJavaVersion = '1.1.9' + androidSupportVersion = '27.1.0' + rxAndroidVersion = '2.0.1' + rxJavaVersion = '2.1.3' // testing junitVersion = '4.12' diff --git a/rx-contacts/build.gradle b/rx-contacts/build.gradle index 2ec8ffb..6b0cb18 100644 --- a/rx-contacts/build.gradle +++ b/rx-contacts/build.gradle @@ -40,8 +40,8 @@ publish { dependencies { compile "com.android.support:appcompat-v7:$rootProject.ext.androidSupportVersion" - compile "io.reactivex:rxandroid:$rootProject.ext.rxAndroidVersion" - compile "io.reactivex:rxjava:$rootProject.ext.rxJavaVersion" + compile "io.reactivex.rxjava2:rxandroid:$rootProject.ext.rxAndroidVersion" + compile "io.reactivex.rxjava2:rxjava:$rootProject.ext.rxJavaVersion" // Testing testCompile "junit:junit:$rootProject.ext.junitVersion" } diff --git a/rx-contacts/src/main/AndroidManifest.xml b/rx-contacts/src/main/AndroidManifest.xml index 06755b2..d8cf1f7 100644 --- a/rx-contacts/src/main/AndroidManifest.xml +++ b/rx-contacts/src/main/AndroidManifest.xml @@ -1,9 +1,10 @@ + package="de.ulrichraab.rxcontacts"> + + android:supportsRtl="true" /> diff --git a/rx-contacts/src/main/java/de/ulrichraab/rxcontacts/RxContacts.java b/rx-contacts/src/main/java/de/ulrichraab/rxcontacts/RxContacts.java index 3f7f67e..e6f59b3 100644 --- a/rx-contacts/src/main/java/de/ulrichraab/rxcontacts/RxContacts.java +++ b/rx-contacts/src/main/java/de/ulrichraab/rxcontacts/RxContacts.java @@ -23,8 +23,9 @@ import android.support.annotation.NonNull; import android.util.LongSparseArray; -import rx.Observable; -import rx.Subscriber; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; import static de.ulrichraab.rxcontacts.ColumnMapper.mapDisplayName; import static de.ulrichraab.rxcontacts.ColumnMapper.mapEmail; @@ -37,42 +38,44 @@ /** * Android contacts as rx observable. + * * @author Ulrich Raab */ public class RxContacts { private static final String[] PROJECTION = { - ContactsContract.Data.CONTACT_ID, - ContactsContract.Data.DISPLAY_NAME_PRIMARY, - ContactsContract.Data.STARRED, - ContactsContract.Data.PHOTO_URI, - ContactsContract.Data.PHOTO_THUMBNAIL_URI, - ContactsContract.Data.DATA1, - ContactsContract.Data.MIMETYPE, - ContactsContract.Data.IN_VISIBLE_GROUP + ContactsContract.Data.CONTACT_ID, + ContactsContract.Data.DISPLAY_NAME_PRIMARY, + ContactsContract.Data.STARRED, + ContactsContract.Data.PHOTO_URI, + ContactsContract.Data.PHOTO_THUMBNAIL_URI, + ContactsContract.Data.DATA1, + ContactsContract.Data.MIMETYPE, + ContactsContract.Data.IN_VISIBLE_GROUP }; private ContentResolver resolver; /** * Fetches all contacts from the contacts apps and social networking apps. + * * @param context The context. * @return Observable that emits contacts on success. */ - public static Observable fetch (@NonNull final Context context) { - return Observable.create(new Observable.OnSubscribe() { + public static Observable fetch(@NonNull final Context context) { + return Observable.create(new ObservableOnSubscribe() { @Override - public void call (Subscriber subscriber) { - new RxContacts(context).fetch(subscriber); + public void subscribe(ObservableEmitter e) throws Exception { + new RxContacts(context).fetch(e); } }); } - private RxContacts (@NonNull Context context) { + private RxContacts(@NonNull Context context) { resolver = context.getContentResolver(); } - private void fetch (Subscriber subscriber) { + private void fetch(ObservableEmitter subscriber) { LongSparseArray contacts = new LongSparseArray<>(); // Create a new cursor and go to the first position Cursor cursor = createCursor(); @@ -125,16 +128,16 @@ private void fetch (Subscriber subscriber) { for (int i = 0; i < contacts.size(); i++) { subscriber.onNext(contacts.valueAt(i)); } - subscriber.onCompleted(); + subscriber.onComplete(); } - private Cursor createCursor () { + private Cursor createCursor() { return resolver.query( - ContactsContract.Data.CONTENT_URI, - PROJECTION, - null, - null, - ContactsContract.Data.CONTACT_ID + ContactsContract.Data.CONTENT_URI, + PROJECTION, + null, + null, + ContactsContract.Data.CONTACT_ID ); } }