package com.turhanoz.android.reactivedirectorychooser.operation; import com.turhanoz.android.reactivedirectorychooser.event.OperationFailedEvent; import com.turhanoz.android.reactivedirectorychooser.model.CustomFile; import com.turhanoz.android.reactivedirectorychooser.model.DirectoryTree; import com.turhanoz.android.reactivedirectorychooser.observable.ListDirectoryObservable; import com.turhanoz.android.reactivedirectorychooser.observer.ListDirectoryObserver; import java.io.File; import de.greenrobot.event.EventBus; import rx.Observable; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class ListDirectoryOperation { Subscription subscription; DirectoryTree dataSet; EventBus bus; public ListDirectoryOperation(DirectoryTree dataSet, EventBus bus) { this.dataSet = dataSet; this.bus = bus; } public void compute(File rootDirectory) { if (rootDirectory.canRead()) { cancelPreviousOperation(); updateDataSet(rootDirectory); Observable<File> observable = new ListDirectoryObservable().create(rootDirectory); Observer<File> observer = new ListDirectoryObserver(dataSet, bus); subscription = observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } else { bus.post(new OperationFailedEvent()); } } public void cancelPreviousOperation() { if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } subscription = null; } private void updateDataSet(File rootDirectory) { dataSet.setRootDirectoryAndNotify(rootDirectory); updateParentDirectory(rootDirectory); } private void updateParentDirectory(File rootDirectory) { File parentDirectory = rootDirectory.getParentFile(); dataSet.setParentDirectory(parentDirectory); if (parentDirectory != null) { CustomFile customParentDirectory = new CustomFile(parentDirectory.getPath()); customParentDirectory.setName("../"); dataSet.setParentDirectory(customParentDirectory); } } }