Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Account> providesAccountRepo(DbHelper dbHelper) {
return new BaseCache<>(new AccountRepo(dbHelper));
}

@Provides
@NonNull
@Singleton
public IRepo<Category> providesCategoryRepo(DbHelper dbHelper) {
return new BaseCache<>(new CategoryRepo(dbHelper));
}

@Provides
@NonNull
@Singleton
public IRepo<ExchangeRate> providesExchangeRateRepo(DbHelper dbHelper) {
return new BaseCache<>(new ExchangeRateRepo(dbHelper));
}

@Provides
@NonNull
@Singleton
public IRepo<Record> providesRecordRepo(DbHelper dbHelper) {
return new BaseCache<>(new RecordRepo(dbHelper));
}

@Provides
@NonNull
@Singleton
public IRepo<Transfer> providesTransferRepo(DbHelper dbHelper) {
return new BaseCache<>(new TransferRepo(dbHelper));
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T extends IEntity> implements IRepo<T> {
@SuppressWarnings("unused")
private static final String TAG = "BaseCache";

private static final int CACHE_SIZE = 1024 * 1024; // 1MiB

private LruCache<Long, T> lruCache;

@NonNull
private IRepo<T> repo;

public BaseCache(@NonNull IRepo<T> 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<T> readAll() {
return repo.readAll();
}

@NonNull
@Override
public List<T> readWithCondition(@Nullable String condition, @Nullable String[] args) {
return repo.readWithCondition(condition, args);
}
}