Android Open Source - vocabulary-list Card D A O Impl






From Project

Back to project page vocabulary-list.

License

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.

Java Source Code

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;
            }
        }
    }

}




Java Source Code List

com.rulych.vocabularylist.AppModule.java
com.rulych.vocabularylist.VocabularyListApplication.java
com.rulych.vocabularylist.activities.VocabularyListActivity.java
com.rulych.vocabularylist.adapters.CardAdapter.java
com.rulych.vocabularylist.fragments.BaseCardFragment.java
com.rulych.vocabularylist.fragments.CardFragment.java
com.rulych.vocabularylist.fragments.DriveApiFragment.java
com.rulych.vocabularylist.fragments.NewCardFragment.java
com.rulych.vocabularylist.fragments.VocabularyListFragment.java
com.rulych.vocabularylist.model.Card.java
com.rulych.vocabularylist.model.comparation.CardComparator.java
com.rulych.vocabularylist.model.persistence.CardDAO.java
com.rulych.vocabularylist.model.persistence.PersistenceModule.java
com.rulych.vocabularylist.model.persistence.impl.CardDAOImpl.java
com.rulych.vocabularylist.model.persistence.impl.CardListReaderImpl.java
com.rulych.vocabularylist.model.persistence.impl.CardListReader.java
com.rulych.vocabularylist.model.persistence.impl.CardListWriterImpl.java
com.rulych.vocabularylist.model.persistence.impl.CardListWriter.java
com.rulych.vocabularylist.model.persistence.impl.FileGetterImpl.java
com.rulych.vocabularylist.model.persistence.impl.FileGetter.java
com.rulych.vocabularylist.model.persistence.impl.exception.CardNotFoundException.java
com.rulych.vocabularylist.model.persistence.impl.exception.CouldNotGetFileException.java
com.rulych.vocabularylist.model.persistence.impl.exception.CouldNotReadFileException.java
com.rulych.vocabularylist.model.persistence.impl.exception.CouldNotWriteFileException.java
com.rulych.vocabularylist.util.BaseRuntimeException.java
com.rulych.vocabularylist.util.FloatingActionButtonAnimator.java
com.rulych.vocabularylist.util.ThreadLoggingTree.java
com.rulych.vocabularylist.util.UtilModule.java
com.rulych.vocabularylist.util.impl.FloatingActionButtonAnimatorImpl.java