/RxDrive

RxJava wrapper for Google Drive Android API

Primary LanguageJavaMIT LicenseMIT

Android Arsenal Download Build Status

RxDrive

RxJava wrapper for Google Drive Android API

Why

Using Google Drive API for Android can be a little frustrating because sometimes you must define nested callbacks. If you want to avoid them, you should create an AsyncTask for each action and call synchronous methods (await()). Anyway, you have to write some ugly and confusing code.

The purpose of RxDrive is to use Google Drive APIs with the elegance and the advantages of RxJava.

No more nested callbacks, no more AsyncTasks.

Before you start

Before you start using this library, you need to follow the instructions to create a new project with Google Drive API access (https://developers.google.com/drive/android/get-started).

Features

Since this project is still a work in progress, additional features will come in next releases. Currently, RxDrive allows you to:

  • Authenticate users
  • Notify your app about changes of the connection state
  • Create files
  • Open files
  • Update files
  • Get metadata of Drive resources
  • List and query resources
  • Trash, untrash and delete Drive resources
  • Sync Drive

Examples

Connecting

public class MyActivity extends AppCompatActivity {
    private RxDrive mRxDrive;
    private Subscription mSubscription;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	...
    	mRxDrive = new RxDrive(new GoogleApiClient.Builder(this)
    		.addApi(Drive.API)
    		.addScope(Drive.SCOPE_FILE) //If you want to access to user files
    		.addScope(Drive.SCOPE_APPFOLDER) //If you want to access to the app folder
    	);
    }
    	
    @Override
    protected void onStart() {
        ...
        mSubscription = mRxDrive.connectionObservable()
                .subscribe(new Action1<ConnectionState>() {
                    @Override
                    public void call(ConnectionState connectionState) {
                        switch (connectionState.getState()) {
                            case CONNECTED:
                                doSomething(connectionState.getBundle());
                                break;
                            case SUSPENDED:
                                doSomethingElse(connectionState.getCause());
                                break;
                            case FAILED:
                                mRxDrive.resolveConnection(MyActivity.this, connectionState.getConnectionResult());
                                break;
                            case UNABLE_TO_RESOLVE:
                                showMessageToUser(connectionState.getConnectionResult());
                                break;
                        }
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) { ... }
                });
        mRxDrive.connect();
    }
    
    @Override
    protected void onStop() {
        ...
        mRxDrive.disconnect();
        mSubscription.unsubscribe();
    }
    
    @Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        mRxDrive.onActivityResult(requestCode, resultCode, data);
    }
}

Creating a file

mRxDrive.createFile(mRxDrive.getAppFolder(), uriOrFile, optionalName, optionalMimeType)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<DriveId>() {
        @Override
        public void call(DriveId driveId) { ... }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) { ... }
    });

Listing children of a folder

mRxDrive.listChildren(mRxDrive.getAppFolder())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<List<DriveId>>() {
        @Override
        public void call(List<DriveId> driveIds) { ... }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) { ... }
    });

Querying for children of a folder

Query query = new Query.Builder()
	.addFilter(Filters.eq(SearchableField.TITLE, "HelloWorld.java"))
	.build()
mRxDrive.queryChildren(mRxDrive.getAppFolder(), query)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<List<DriveId>>() {
        @Override
        public void call(List<DriveId> driveIds) { ... }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) { ... }
    });

Getting metadata

mRxDrive.getMetadata(someDriveId)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<Metadata>() {
	@Override
        public void call(Metadata metadata) { ... }
	}, new Action1<Throwable>() {
	@Override
        public void call(Throwable throwable) { ... }
	}

Opening a file

mRxDrive.open(mDriveId, new Subscriber<Progress>() {
        @Override
        public void onCompleted() { ... }
    
        @Override
        public void onError(Throwable e) { ... }
    
        @Override
        public void onNext(Progress progress) {
            mTextView.setText(progress.getPercentage() + "%");
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<InputStream>() {
    	@Override
    	public void call(InputStream inputStream) { ... }
    }, new Action1<Throwable>() {
    	@Override
    	public void call(Throwable throwable) { ... }
    });

Gradle

Add in your root build.gradle:

repositories {
	jcenter()
}

Add in your app build.gradle the dependency:

dependencies {
  ...
  compile 'com.francescocervone:rxdrive:0.2'
}