package me.devsaki.hentoid.dirpicker.ops; import org.greenrobot.eventbus.EventBus; import java.io.File; import me.devsaki.hentoid.dirpicker.events.OpFailedEvent; import me.devsaki.hentoid.dirpicker.model.DirTree; import me.devsaki.hentoid.dirpicker.model.FileBuilder; import me.devsaki.hentoid.dirpicker.observable.ListDirObservable; import me.devsaki.hentoid.dirpicker.observers.ListDirObserver; import me.devsaki.hentoid.util.LogHelper; import rx.Observable; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by avluis on 06/12/2016. * List Directory Operation */ class ListDir { private static final String TAG = LogHelper.makeLogTag(ListDir.class); private final DirTree dirTree; private final EventBus bus; private Subscription subscription; ListDir(DirTree dirTree, EventBus bus) { this.dirTree = dirTree; this.bus = bus; } void process(File rootDir) { if (rootDir.canRead()) { cancelPrevOp(); updateDirList(rootDir); Observable<File> observable = new ListDirObservable().create(rootDir); Observer<File> observer = new ListDirObserver(dirTree, bus); subscription = observable.subscribeOn(Schedulers.io()) .onBackpressureBuffer() .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } else { LogHelper.d(TAG, "Failed to process directory list."); bus.post(new OpFailedEvent()); } } private void cancelPrevOp() { if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } subscription = null; } private void updateDirList(File rootDir) { dirTree.setRootDir(rootDir); updateParentDir(rootDir); } private void updateParentDir(File rootDir) { File parentDir = rootDir.getParentFile(); dirTree.setParentDir(parentDir); if (parentDir != null) { FileBuilder parent = new FileBuilder(parentDir.getPath()); parent.setName("../"); dirTree.setParentDir(parent); } } }