Back to project page vocabulary-list.
The source code is released under:
Apache License
If you think the Android project vocabulary-list listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.rulych.vocabularylist.model.persistence.impl; /*from w w w. j a va 2s . com*/ import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.drive.DriveFile; import com.rulych.vocabularylist.model.Card; import com.rulych.vocabularylist.model.persistence.CardDAO; import com.rulych.vocabularylist.model.persistence.impl.exception.CardNotFoundException; import com.squareup.otto.Bus; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.inject.Inject; import rx.Observable; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; public class CardDAOImpl implements CardDAO { @Inject Bus mBus; @Inject CardListReader.Factory mReaderFactory; @Inject CardListWriter.Factory mWriterFactory; @Inject FileGetter.Factory mFileGetterFactory; private final DriveFileHolder mDriveFileHolder = new DriveFileHolder(); private GoogleApiClient mApiClient; private final List<Card> mCards = new ArrayList<>(); private boolean mCardsLoaded; @Inject CardDAOImpl() { } @Override public void start(GoogleApiClient apiClient) { mApiClient = apiClient; } @Override public Observable<Card> find(final String entry) { return getCardList().map(new SearchCardFunc(entry)); } @Override public Observable<List<Card>> all() { return getCardList(); } @Override public void save(Card card) { boolean added = saveCardToList(card); saveCardList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new SaveCardObserver(added, card)); } @Override public void delete(final Card card) { if (mCards.remove(card)) { saveCardList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DeleteCardObserver(card)); } } private Observable<List<Card>> getCardList() { if (mCardsLoaded) { return Observable.just(mCards); } return getDriveFile().flatMap(new GetCardListFunc()); } private Observable<Void> saveCardList() { return getDriveFile().flatMap(new WriteCardListFunc()); } private Observable<DriveFile> getDriveFile() { return mDriveFileHolder.getDriveFile(); } private boolean saveCardToList(Card card) { int index = mCards.indexOf(card); if (index < 0) { mCards.add(card); return true; } else { mCards.set(index, card); return false; } } private static class SearchCardFunc implements Func1<List<Card>, Card> { private Card mCard; public SearchCardFunc(String entry) { mCard = new Card(); mCard.entry = entry; } @Override public Card call(List<Card> cards) { try { int index = cards.indexOf(mCard); return cards.get(index); } catch (IndexOutOfBoundsException e) { throw new CardNotFoundException(e); } } } private class RetainCardListAction implements Action1<List<Card>> { @Override public void call(List<Card> cards) { mCards.clear(); mCards.addAll(cards); mCardsLoaded = true; } } private class GetCardListFunc implements Func1<DriveFile, Observable<? extends List<Card>>> { @Override public Observable<? extends List<Card>> call(DriveFile driveFile) { return mReaderFactory.create(mApiClient, driveFile) .read() .doOnNext(new RetainCardListAction()); } } private class WriteCardListFunc implements Func1<DriveFile, Observable<Void>> { @Override public Observable<Void> call(DriveFile driveFile) { return mWriterFactory.create(mApiClient, driveFile).write(mCards); } } private class SaveCardObserver implements Observer<Void> { private final boolean mAdd; private final Card mCard; public SaveCardObserver(boolean add, Card card) { mAdd = add; mCard = card; } @Override public void onCompleted() { } @Override public void onError(Throwable throwable) { } @Override public void onNext(Void aVoid) { if (mAdd) { mBus.post(new NewCardSavedEvent(mCard)); } else { mBus.post(new CardModifiedEvent(mCard)); } } } private class DeleteCardObserver implements Observer<Void> { private final Card mCard; public DeleteCardObserver(Card card) { mCard = card; } @Override public void onCompleted() { } @Override public void onError(Throwable throwable) { } @Override public void onNext(Void aVoid) { mBus.post(new CardDeletedEvent(mCard)); } } private class DriveFileHolder { private DriveFile mDriveFile; private Observable<DriveFile> getDriveFile() { if (mDriveFile != null) { return Observable.just(mDriveFile); } return mFileGetterFactory.create(mApiClient) .getFileFor(Locale.SIMPLIFIED_CHINESE) .doOnNext(new RetainDriveFileAction()); } private class RetainDriveFileAction implements Action1<DriveFile> { @Override public void call(DriveFile driveFile) { mDriveFile = driveFile; } } } }