RxActivityResults

Additional

Language
Java
Version
N/A
Created
Aug 27, 2017
Updated
Sep 3, 2017
Owner
Mohamad Amin Mohamadi (mohamad-amin)
Contributor
Mohamad Amin Mohamadi (mohamad-amin)
1
Activity
Badge
Generate
Download
Source code
APK file

Announcement

RxActivityResults

This library uses the power of RxJava to wrap an Observable android Activity#onActivityResult() method so you can easily request something from other activities and have the result right there in your observabale's subscribe() method.

Main Benifits

  • Don't Break The Chain: Prevents you to split your code between the permission request and the result handling. Currently without this library you have to request in one place and handle the result in Activity#onActivityResult().
  • Reactive: All what RX provides about transformation, filter, chaining...

If you have any issues or need more features, you can submit an issue in the issue tracker or make a pull request.

Importing

Add this line to your module's build.gradle file:

dependencies {
    compile 'com.mohamadamin.rxactivityresults:rxactivityresults:0.1'
}

Usage

First you need to create an instance of RxActivityResults in your Activity:

RxActivityResults rxActivityResults;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    rxActivityResults = new RxActivityResults(this);
    ...
}

Then you can use this instance to start an activity for result and have it's result in your observer like this:

Intent intent = new Intent(this, LoginActivity.class);
rxActivityResults.start(loginIntent)
                .subscribe(activityResult -> {
                    // Checking if the result's resultCode is Activity.RESULT_OK
                    if (activityResult.isOk()) {
                        Intent responseData = activityResult.getData();
                        // Do some other things with the response data
                   }
                });
      

Reactive Results

You can use RxActivityResults#composer(Intent intent) method to have an ObservableTransformer to chain your observables together and avoid from breaking the reactive chain:

(Note: we used RxBinding library to turn view clicks into an observable)

Disposable disposable = RxView.clicks(loginButton)
        // Fire an intent when the user clicks on the button
        .compose(rxActivityResults.composer(getLoginIntent()))
        // Filter the activity results which their resultCode is Activity.RESULT_OK
        .filter(activityResult -> activityResult.isOk())
        // Extract the data intent of the activity result
        .map(ActivityResult::getData)
        .subscribe(intent -> {

            String firstName = intent.getStringExtra(LoginActivity.FIRST_NAME);
            String lastName = intent.getStringExtra(LoginActivity.LAST_NAME);
            String emailAddress = intent.getStringExtra(LoginActivity.EMAIL_ADDRESS);

            String result = getString(R.string.first_name) + ": " + firstName + "\n"
                    + getString(R.string.last_name) + ": " + lastName + "\n"
                    + getString(R.string.email_address) + ": " + emailAddress + "\n";

            loginInfoText.setText(result);

        });

disposables.add(disposable);

Chain Transformation

You can use RxActivityResults#ensureOkResult(Intent intent) method to have an ObservableTransformer to chain your observables together and avoid from breaking the reactive chain:

Disposable disposable = someAnotherChainOfObservables
        // Fire an intent when the user clicks on the button
        .compose(rxActivityResults.ensureOkResult(getIntent()))
        .switchMap(okResult -> {
            if (okResult) {
                return someAnotherObservable();
            } else {
                return Observable.error(new RuntimeException("Intent didn't return RESULT_OK"));
            }
        })
        .flatMap(...)
        ...

disposables.add(disposable);

Demo

You can see a full demo of the library in the sample module.

Credits

This library was inspired by RxPermissions, so great thanks to @tbruyelle for his great contribution.

Licence

Copyright 2017 Mohamad Amin Mohamadi

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.