diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java index 3b88db1..db2d16b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java @@ -5,7 +5,8 @@ import com.blogspot.e_kanivets.moneytracker.di.AppComponent; import com.blogspot.e_kanivets.moneytracker.di.DaggerAppComponent; import com.blogspot.e_kanivets.moneytracker.di.module.ControllerModule; -import com.blogspot.e_kanivets.moneytracker.di.module.RepoModule; +import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule; +import com.blogspot.e_kanivets.moneytracker.di.module.repo.RepoModule; /** * Custom application implementation. @@ -37,7 +38,7 @@ public AppComponent getAppComponent() { private AppComponent buildComponent() { return DaggerAppComponent.builder() - .repoModule(new RepoModule(get())) + .cachedRepoModule(new CachedRepoModule(get())) .controllerModule(new ControllerModule()) .build(); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java index 9700c7d..342eb0a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java @@ -10,8 +10,8 @@ import com.blogspot.e_kanivets.moneytracker.activity.exchange_rate.ExchangeRatesActivity; import com.blogspot.e_kanivets.moneytracker.activity.record.AddRecordActivity; import com.blogspot.e_kanivets.moneytracker.activity.record.MainActivity; +import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule; import com.blogspot.e_kanivets.moneytracker.di.module.ControllerModule; -import com.blogspot.e_kanivets.moneytracker.di.module.RepoModule; import com.blogspot.e_kanivets.moneytracker.ui.presenter.AccountsSummaryPresenter; import javax.inject.Singleton; @@ -24,7 +24,7 @@ * * @author Evgenii Kanivets */ -@Component(modules = {RepoModule.class, ControllerModule.class}) +@Component(modules = {CachedRepoModule.class, ControllerModule.class}) @Singleton public interface AppComponent { void inject(MainActivity mainActivity); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java new file mode 100644 index 0000000..16d6edd --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/CachedRepoModule.java @@ -0,0 +1,80 @@ +package com.blogspot.e_kanivets.moneytracker.di.module.repo; + +import android.content.Context; +import android.support.annotation.NonNull; + +import com.blogspot.e_kanivets.moneytracker.entity.Account; +import com.blogspot.e_kanivets.moneytracker.entity.Category; +import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRate; +import com.blogspot.e_kanivets.moneytracker.entity.Record; +import com.blogspot.e_kanivets.moneytracker.entity.Transfer; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; +import com.blogspot.e_kanivets.moneytracker.repo.ExchangeRateRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; +import com.blogspot.e_kanivets.moneytracker.repo.TransferRepo; +import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.cache.BaseCache; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +/** + * Dagger 2 module to provide {@link IRepo} dependencies. + * Created on 3/29/16. + * + * @author Evgenii Kanivets + */ +@Module +public class CachedRepoModule { + private Context context; + + public CachedRepoModule(Context context) { + this.context = context; + } + + @Provides + @NonNull + @Singleton + public DbHelper providesDbHelper() { + return new DbHelper(context); + } + + @Provides + @NonNull + @Singleton + public IRepo providesAccountRepo(DbHelper dbHelper) { + return new BaseCache<>(new AccountRepo(dbHelper)); + } + + @Provides + @NonNull + @Singleton + public IRepo providesCategoryRepo(DbHelper dbHelper) { + return new BaseCache<>(new CategoryRepo(dbHelper)); + } + + @Provides + @NonNull + @Singleton + public IRepo providesExchangeRateRepo(DbHelper dbHelper) { + return new BaseCache<>(new ExchangeRateRepo(dbHelper)); + } + + @Provides + @NonNull + @Singleton + public IRepo providesRecordRepo(DbHelper dbHelper) { + return new BaseCache<>(new RecordRepo(dbHelper)); + } + + @Provides + @NonNull + @Singleton + public IRepo providesTransferRepo(DbHelper dbHelper) { + return new BaseCache<>(new TransferRepo(dbHelper)); + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/RepoModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java similarity index 97% rename from app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/RepoModule.java rename to app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java index 8256f34..05380b7 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/RepoModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/repo/RepoModule.java @@ -1,4 +1,4 @@ -package com.blogspot.e_kanivets.moneytracker.di.module; +package com.blogspot.e_kanivets.moneytracker.di.module.repo; import android.content.Context; import android.support.annotation.NonNull; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java new file mode 100644 index 0000000..be0a879 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/cache/BaseCache.java @@ -0,0 +1,79 @@ +package com.blogspot.e_kanivets.moneytracker.repo.cache; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.util.LruCache; + +import com.blogspot.e_kanivets.moneytracker.entity.base.IEntity; +import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; + +import java.util.List; + +/** + * Cache for {@link IRepo} instances. Use Decorator pattern. + * Created on 4/19/16. + * + * @author Evgenii Kanivets + */ +public class BaseCache implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "BaseCache"; + + private static final int CACHE_SIZE = 1024 * 1024; // 1MiB + + private LruCache lruCache; + + @NonNull + private IRepo repo; + + public BaseCache(@NonNull IRepo repo) { + this.repo = repo; + lruCache = new LruCache<>(CACHE_SIZE); + } + + @Nullable + @Override + public T create(@Nullable T instance) { + T createdT = repo.create(instance); + if (createdT != null) lruCache.put(createdT.getId(), createdT); + return createdT; + } + + @Nullable + @Override + public T read(long id) { + T cachedT = lruCache.get(id); + if (cachedT == null) { + T readT = repo.read(id); + if (readT != null) lruCache.put(readT.getId(), readT); + return readT; + } else return cachedT; + } + + @Nullable + @Override + public T update(@Nullable T instance) { + T updatedT = repo.update(instance); + if (updatedT != null) lruCache.put(updatedT.getId(), updatedT); + return updatedT; + } + + @Override + public boolean delete(@Nullable T instance) { + boolean deleted = repo.delete(instance); + if (instance != null && deleted) lruCache.remove(instance.getId()); + return deleted; + } + + @NonNull + @Override + public List readAll() { + return repo.readAll(); + } + + @NonNull + @Override + public List readWithCondition(@Nullable String condition, @Nullable String[] args) { + return repo.readWithCondition(condition, args); + } +}