ReactiveFB

Additional

Language
Java
Version
v0.1.0-alpha.1 (Oct 11, 2016)
Created
Sep 29, 2016
Updated
Apr 24, 2017 (Retired)
Owner
Wassim Beltaief (WassimBenltaief)
Contributors
Niklas Baudy (vanniktech)
Wassim Beltaief (WassimBenltaief)
2
Activity
Badge
Generate
Download
Source code

ReactiveFB

ReactiveFB provides an API that bridges the reactive world of RxJava 2.0 with the callback-style of Facebook-SDK. The aim of the library is to :

  • make the use of the facebook api easy and less boilerplate.
  • expose the facebook api methods to the possibilities of the reactive world like transformations, filtering, composition.

Download :

Add this dependency to your app build.gradle file :

compile 'com.beltaief.reactivefb:reactivefb:0.1.0-beta-1'

and these lines to your project build.gradle file :

allprojects {
    repositories {
        maven {
            url 'https://dl.bintray.com/wassimbenltaief/maven/'
        }
    }
}

This lib depends on :

  • facebook-android-sdk:4.15.0
  • rxjava:2.0.0
  • rxandroid:2.0.0

How to use it ?

First initialize the lib :

ReactiveFB.sdkInitialize(this);

then you can use one of the methods provided by ReactiveFB :

Login :

// Login with LoginManager
Maybe<LoginResult> loginResult = ReactiveLogin.login(activityInstance);

// Login with LoginButton from an activity
Observable<LoginResult> loginResult = ReactiveLogin.loginWithButton(loginButtonInstance);

// Login with LoginButton from a fragment
Observable<LoginResult> loginResult = ReactiveLogin.loginWithButton(loginButtonInstance, fragmentInstance);

Note that you still have to add onActivityResult to intercept the facebook callbacks :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    ReactiveLogin.onActivityResult(requestCode, resultCode, data);
}

Login with additional permisisons

Check if permission is granted :

boolean permissionIsGranted = ReactiveFB.checkPermission(PermissionHelper.USER_PHOTOS);

if a specific permission was not granted, ask for it with an additional permission call :

MaybeObserver<LoginResult> loginResult = ReactiveLogin.requestAdditionalPermission(permissions, activityInstance);

Note you still have to pass a list of Permission to ask for additional permissions. Permission is an enum of facebook permissions.

Example :

List<PermissionHelper> permissions = new ArrayList<>();
permissions.add(PermissionHelper.USER_PHOTOS);
permissions.add(PermissionHelper.USER_FRIENDS);
permissions.add(PermissionHelper.PUBLISH_ACTION);
permissions.add(PermissionHelper.RSVP_EVENT);

ReactiveLogin.requestAdditionalPermission(permissions, activityInstance).subscribe(...)

Alternatively, you can configure the permissions when initializing the lib. Provide a configuration and a list of permissions and set it just after initialization :

// define list of permissions
Permission[] permissions = new Permission[]{
        PermissionHelper.USER_ABOUT_ME,
        PermissionHelper.EMAIL,
        PermissionHelper.USER_PHOTOS,
        PermissionHelper.USER_EVENTS,
        PermissionHelper.USER_ACTIONS_MUSIC,
        PermissionHelper.USER_FRIENDS,
        PermissionHelper.USER_GAMES_ACTIVITY,
        PermissionHelper.USER_BIRTHDAY,
        PermissionHelper.USER_TAGGED_PLACES,
        PermissionHelper.USER_MANAGED_GROUPS,
        PermissionHelper.PUBLISH_ACTION};

// add permission to a configuration
SimpleFacebookConfiguration configuration = new SimpleFacebookConfiguration.Builder()
        .setAppId(String.valueOf(R.string.facebook_app_id))
        .setPermissions(permissions)
        .setDefaultAudience(DefaultAudience.FRIENDS)
        .setAskForAllPermissionsAtOnce(false)
        .build();

// init lib
ReactiveFB.sdkInitialize(this);
ReactiveFB.setConfiguration(configuration);

Graph Api Requests

The GraphAPI requests returns a java Single<GraphResponse> and let you provide a json mapping strategy by your own.

// Get the profile of the logged in user
Single<GraphResponse> me = ReactiveRequest.getMe();
Single<GraphResponse> me = ReactiveRequest.getMe(fields);

// Get the list of the friends of the logged in user
Single<GraphResponse> friends = ReactiveRequest.getFriends();
Single<GraphResponse> friends = ReactiveRequest.getFriends(fields);
Single<GraphResponse> friends = ReactiveRequest.getFriends(fields, limit);

// Get a user profile by providing his facebookId
Single<GraphResponse> profile = ReactiveRequest.getProfile(profileId);
Single<GraphResponse> profile = ReactiveRequest.getProfile(profileId, fields);
Single<GraphResponse> profile = ReactiveRequest.getProfile(profileId, fields, limits);

// Get a list of albums of the logged in user
Single<GraphResponse> albums = ReactiveRequest.getMyAlbums();
Single<GraphResponse> albums = ReactiveRequest.getMyAlbums(fields);
Single<GraphResponse> albums = ReactiveRequest.getMyAlbums(fields, limit);

// Get a list of albums of a user
Single<GraphResponse> albums = ReactiveRequest.getAlbums(userId);
Single<GraphResponse> albums = ReactiveRequest.getAlbums(userId, fields);
Single<GraphResponse> albums = ReactiveRequest.getAlbums(userId, fields, limit);

// Get a photo of a user, album, page, event ..
Single<GraphResponse> photo = ReactiveRequest.getPhoto(photoId);
Single<GraphResponse> photo = ReactiveRequest.getPhoto(photoId, fields);

// Get list of photos of the logged in user
Single<GraphResponse> photos = ReactiveRequest.getMyPhotos();
Single<GraphResponse> photos = ReactiveRequest.getMyPhotos(fields);
Single<GraphResponse> photos = ReactiveRequest.getMyPhotos(fields, limit);

// Get list of photos of a user
Single<GraphResponse> photos = ReactiveRequest.getPhotos();
Single<GraphResponse> photos = ReactiveRequest.getPhotos(fields);
Single<GraphResponse> photos = ReactiveRequest.getPhotos(fields, limit);

You can compose with rx operators to get to your goal faster and efficiently. For example if you wants to get the logged in user albums and every photo of an album, in one block :

ReactiveRequest
    .getMyAlbums(albumFields) // get albums
    .map(this::parseAlbums) // parse json to list of Album
    .flatMapObservable(Observable::fromIterable) // iterate throw collection
    .flatMap(album -> ReactiveRequest.getPhoto(album.getCover().getId(), photoFields).toObservable()) // get one alb. photo
    .doOnError(throwable -> Observable.empty()) // return Observable.empty if error occured
    .map(this::parsePhoto)// transform json to Photo
    .subscribe(
            photo -> {
                Log.d(TAG, "onNext");
                addPhoto(photo);
            },
            throwable -> Log.d(TAG, "onError " + throwable.getMessage()),
            () -> Log.d(TAG, "onComplete")
    );

private void addPhoto(Photo photo) {
  // add item
  mAdapter.addItem(photo);

  // notify inserted
  ...
}

More examples :

Check the sample project for more examples.

Todo

  • Implement more GraphAPI requests.
  • Pagination
  • ..

Credits

This library is based on a fork of simple-facebook by sromku. All credits of the graph api GetAction class and Facebook entities returns to the nice work of sromku.

License

Copyright 2016 Wassim Beltaief

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.