From f8802d239847ad867f07eea0de21916479b5c340 Mon Sep 17 00:00:00 2001 From: gnemoka Date: Tue, 9 Jul 2019 18:58:47 +0200 Subject: [PATCH] code refactoring --- iconvert-android/app/app.iml | 16 ++--- .../aleengo/iconvert/domain/Repository.java | 16 ++++- .../persistence/api/XchangeRateAPI.java | 11 ++-- .../deserializer/CurrencyWrapperAdapter.java | 8 ++- .../deserializer/CurrencyWrapperList.java | 4 +- .../persistence/remote/RemoteDataSource.java | 19 +++--- .../repository/CurrencyRepository.java | 28 ++++++--- .../repository/FavoriteRepository.java | 62 +------------------ .../com/aleengo/iconvert/ui/base/MvpView.java | 2 + .../iconvert/ui/search/SearchContract.java | 4 +- .../iconvert/ui/search/SearchPresenter.java | 49 ++++++++++++--- .../iconvert/ui/search/SearchTemplate.java | 14 +++-- 12 files changed, 125 insertions(+), 108 deletions(-) diff --git a/iconvert-android/app/app.iml b/iconvert-android/app/app.iml index b5a747f..166c63e 100644 --- a/iconvert-android/app/app.iml +++ b/iconvert-android/app/app.iml @@ -48,13 +48,6 @@ - - - - - - - @@ -62,6 +55,13 @@ + + + + + + + @@ -104,6 +104,7 @@ + @@ -225,5 +226,6 @@ + \ No newline at end of file diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/domain/Repository.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/domain/Repository.java index 72944ac..2dd32bc 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/domain/Repository.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/domain/Repository.java @@ -1,11 +1,14 @@ package com.aleengo.iconvert.domain; +import com.aleengo.iconvert.domain.model.CurrencyEntity; import com.aleengo.iconvert.domain.model.FavoriteEntity; import com.aleengo.iconvert.persistence.model.db.CurrencyData; import com.aleengo.peach.toolbox.commons.model.Response; import java.util.List; +import io.reactivex.Observable; + /** * Created by CK_ALEENGO on 11/02/2019. * Copyright (c) 2019. All rights reserved. @@ -25,17 +28,28 @@ interface AddCallback { } void search(String query, SearchCallback callback); + void getCurrency(String query, GetCallback callback); + void addAll(List currencies); + void getCurrencies(GetCallback callback); + + Observable> getCurrencies(); + void getRates(GetCallback callback); - void loadRatesAndCurrencies(); + + void loadRatesAndCurrencies(); // favorite void getFavorites(GetCallback callback); + void addFavorite(FavoriteEntity favorite, AddCallback callback); + void addAllFavorites(List favorites, AddCallback callback); + void removeFavorites(); + void removeFavorite(FavoriteEntity favorite); } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/api/XchangeRateAPI.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/api/XchangeRateAPI.java index 44e865a..44d1368 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/api/XchangeRateAPI.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/api/XchangeRateAPI.java @@ -3,24 +3,23 @@ import com.aleengo.iconvert.persistence.deserializer.CurrencyWrapperList; import io.reactivex.Observable; -import io.reactivex.Single; import retrofit2.http.GET; /** * Copyright (c) Aleengo, 2019. All rights reserved. * Created by bau.cj on 05/07/2019. */ -public interface XchangeRateAPI extends API{ +public interface XchangeRateAPI { - String BASE_URL = "https://openexchangerates.org/api"; + String BASE_URL = "https://openexchangerates.org/api/"; String APP_ID = "d1ff258466994304854884d3600a75aa"; String REQ_CURRENCY = "com.aleengo.iconvert.REQ_CURRENCY"; String REQ_RATE = "com.aleengo.iconvert.REQ_RATE"; - @GET(value = "/latest.json?app_id=" + APP_ID) - Single latestRates(); + @GET(value = "latest.json?app_id=" + APP_ID) + Observable latestRates(); - @GET(value = "/currencies.json") + @GET(value = "currencies.json") Observable currencies(); } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperAdapter.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperAdapter.java index 5bb71b7..7e44746 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperAdapter.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperAdapter.java @@ -21,7 +21,13 @@ public CurrencyWrapperList deserialize(JsonElement json, Type typeOfT, JsonDeser throws JsonParseException { final List data = new LinkedList<>(); - final JsonObject jo = json.getAsJsonObject(); + + JsonObject jo = json.getAsJsonObject(); + + if (jo.has("rates")) { + jo = jo.getAsJsonObject("rates"); + } + jo.entrySet().forEach(e -> { final String k = e.getKey(); final String v = e.getValue().getAsString(); diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperList.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperList.java index 366c6ff..a50d80f 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperList.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/deserializer/CurrencyWrapperList.java @@ -3,15 +3,17 @@ import java.util.List; import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; /** * Copyright (c) Aleengo, 2019. All rights reserved. * Created by bau.cj on 05/07/2019. */ @AllArgsConstructor +@NoArgsConstructor public class CurrencyWrapperList { - private List data; + public List data; public List get() { return data; diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/remote/RemoteDataSource.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/remote/RemoteDataSource.java index 204c5ec..6b9b888 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/remote/RemoteDataSource.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/remote/RemoteDataSource.java @@ -15,7 +15,6 @@ import javax.inject.Inject; import io.reactivex.Observable; -import io.reactivex.Single; import io.reactivex.functions.Function; import lombok.Getter; import lombok.Setter; @@ -85,7 +84,7 @@ protected CurrencyData instantiate(String code, String value) { }); } - public Single> getRates() { + public Observable> getRates() { return api.latestRates() .map(new MapListFunction() { @Override @@ -105,12 +104,16 @@ public MapListFunction() { @Override public List apply(CurrencyWrapperList currencyWrapperList) throws Exception { - currencyWrapperList.get().forEach(currencyWrapper -> { - final String code = currencyWrapper.getKey(); - final String value = currencyWrapper.getValue(); - data.add(instantiate(code, value)); - }); - return data; + try { + currencyWrapperList.get().forEach(currencyWrapper -> { + final String code = currencyWrapper.getKey(); + final String value = currencyWrapper.getValue(); + data.add(instantiate(code, value)); + }); + return data; + } catch (Exception e) { + throw new RuntimeException(e); + } } protected abstract D instantiate(String code, String value); diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/CurrencyRepository.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/CurrencyRepository.java index 58a91fb..0e5a890 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/CurrencyRepository.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/CurrencyRepository.java @@ -1,22 +1,23 @@ package com.aleengo.iconvert.persistence.repository; import com.aleengo.iconvert.domain.Repository; +import com.aleengo.iconvert.domain.model.CurrencyEntity; import com.aleengo.iconvert.domain.model.FavoriteEntity; -import com.aleengo.iconvert.persistence.api.OpenXchangeRateAPI; import com.aleengo.iconvert.persistence.local.LocalCurrencyDataSource; import com.aleengo.iconvert.persistence.model.db.CurrencyData; import com.aleengo.iconvert.persistence.remote.RemoteDataSource; -import com.aleengo.iconvert.util.Mapper; import com.aleengo.peach.toolbox.commons.model.Response; import java.util.ArrayList; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; import javax.inject.Inject; import io.reactivex.Observable; +import io.reactivex.ObservableSource; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; /** @@ -43,7 +44,8 @@ public CurrencyRepository(LocalCurrencyDataSource localDataSource, RemoteDataSou public void getFavorites(GetCallback callback) { if (localDataSource.isEmpty()) { - final Mapper mapper = new Mapper(); + loadRatesAndCurrencies(); + /*final Mapper mapper = new Mapper(); remoteDataSource.getRatesAndCurrencies(response -> { if (response.getError() != null) { throw new RuntimeException(response.getError()); @@ -57,7 +59,7 @@ public void getFavorites(GetCallback callback) { localDataSource.saveAllRates(mapper.map2Rates(map.get(key))); } }); - }); + });*/ } final List favoriteEntities = localDataSource.getFavorites(); callback.onReceived(new Response(favoriteEntities, null)); @@ -114,8 +116,19 @@ public void getCurrencies(GetCallback callback) { } } - public Observable> getCurrencies() { - return remoteDataSource.getCurrencies(); + public Observable> getCurrencies() { + return remoteDataSource.getCurrencies() + .flatMap(new Function, ObservableSource>>() { + + @Override + public ObservableSource> apply(List currencyDataList) throws Exception { + final List lstFinal = currencyDataList.stream() + .map(cd -> new CurrencyEntity(cd.getCode(), cd.getLibelle(), "0")) + .collect(Collectors.toList()); + + return Observable.just(lstFinal); + } + }); } @Override @@ -132,7 +145,6 @@ public void loadRatesAndCurrencies() { .subscribe(localDataSource::saveAllCurrencies)); disposables.add(remoteDataSource.getRates() - .doOnSuccess(rateData -> System.out.println("success")) .subscribeOn(Schedulers.io()) .subscribe(localDataSource::saveAllRates)); } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/FavoriteRepository.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/FavoriteRepository.java index bbc1436..08de721 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/FavoriteRepository.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/persistence/repository/FavoriteRepository.java @@ -1,69 +1,9 @@ package com.aleengo.iconvert.persistence.repository; -import com.aleengo.iconvert.domain.Repository; -import com.aleengo.iconvert.domain.model.FavoriteEntity; -import com.aleengo.iconvert.persistence.model.db.CurrencyData; - -import java.util.List; - /** * Copyright (c) Aleengo, 2019. All rights reserved. * Created by bau.cj on 04/07/2019. */ -public class FavoriteRepository implements Repository { - - @Override - public void search(String query, SearchCallback callback) { - - } - - @Override - public void getCurrency(String query, GetCallback callback) { - - } - - @Override - public void addAll(List currencies) { - - } - - @Override - public void getCurrencies(GetCallback callback) { - - } - - @Override - public void getRates(GetCallback callback) { - - } - - @Override - public void loadRatesAndCurrencies() { - - } - - @Override - public void getFavorites(GetCallback callback) { - - } - - @Override - public void addFavorite(FavoriteEntity favorite, AddCallback callback) { - - } - - @Override - public void addAllFavorites(List favorites, AddCallback callback) { - - } - - @Override - public void removeFavorites() { - - } - - @Override - public void removeFavorite(FavoriteEntity favorite) { +public class FavoriteRepository { - } } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/base/MvpView.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/base/MvpView.java index a6e88f3..b6b1eb0 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/base/MvpView.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/base/MvpView.java @@ -7,6 +7,7 @@ import androidx.annotation.CallSuper; import androidx.annotation.LayoutRes; +import butterknife.ButterKnife; import butterknife.Unbinder; @@ -33,5 +34,6 @@ public void clear() { public void inflate(@LayoutRes int id) { inflate(getContext(), id, this); + unbinder = ButterKnife.bind(this); } } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchContract.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchContract.java index e196d8f..3209c2b 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchContract.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchContract.java @@ -1,8 +1,8 @@ package com.aleengo.iconvert.ui.search; +import com.aleengo.iconvert.dto.CurrencyIHM; import com.aleengo.iconvert.ui.base.BasePresenter; import com.aleengo.iconvert.ui.base.BaseTemplate; -import com.aleengo.iconvert.dto.CurrencyIHM; import java.util.List; @@ -26,5 +26,7 @@ interface Template extends BaseTemplate { default void showMessage(String message){} default void showMessage(int resId){} + + void updateAdapter(List entities); } } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchPresenter.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchPresenter.java index 5d07040..3e0b800 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchPresenter.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchPresenter.java @@ -1,15 +1,11 @@ package com.aleengo.iconvert.ui.search; -import com.aleengo.peach.toolbox.commons.model.Response; -import com.aleengo.peach.toolbox.commons.model.Result; -import com.aleengo.iconvert.ui.base.Presenter; +import com.aleengo.iconvert.R; import com.aleengo.iconvert.domain.Repository; import com.aleengo.iconvert.domain.model.CurrencyEntity; import com.aleengo.iconvert.dto.CurrencyIHM; -import com.aleengo.iconvert.events.CurrenciesEvent; import com.aleengo.iconvert.persistence.repository.CurrencyRepository; - -import org.greenrobot.eventbus.EventBus; +import com.aleengo.iconvert.ui.base.Presenter; import java.util.LinkedList; import java.util.List; @@ -17,6 +13,11 @@ import javax.inject.Inject; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; import lombok.Getter; /** @@ -26,6 +27,7 @@ public class SearchPresenter extends Presenter implements SearchContract.Presenter { private Repository repository; + private final CompositeDisposable disposables = new CompositeDisposable(); @Getter private List selectedItems = new LinkedList<>(); @@ -58,7 +60,13 @@ public void filter(String query) { @Override public void loadCurrencies() { - repository.getCurrencies((Response response) -> { + final Disposable d = repository.getCurrencies() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new OnSuccess(), new OnError()); + disposables.add(d); + + /* repository.getCurrencies((Response response) -> { final Result> result = new Result<>(null, null); @@ -78,7 +86,7 @@ public void loadCurrencies() { .collect(Collectors.toList()); EventBus.getDefault().post(new CurrenciesEvent(list, null)); - }); + });*/ } // free resources @@ -86,5 +94,30 @@ public void loadCurrencies() { public void clear() { super.clear(); selectedItems = null; + if (!disposables.isDisposed()) { + disposables.dispose(); + } + } + + private class OnSuccess implements Consumer> { + @Override + public void accept(List currencyEntities) { + final List _data = currencyEntities.stream() + .map(entity -> { + final CurrencyIHM item = new CurrencyIHM(entity); + item.setCode(getTemplate().getRequestCode()); + return item; + }) + .collect(Collectors.toList()); + getTemplate().updateAdapter(_data); + } + } + + private class OnError implements Consumer { + @Override + public void accept(Throwable throwable) throws Exception { + System.err.println("Error happened: " + throwable.getMessage()); + getTemplate().showMessage(R.string.error_message_load_currencies); + } } } diff --git a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchTemplate.java b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchTemplate.java index e97e907..d4bdbb8 100644 --- a/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchTemplate.java +++ b/iconvert-android/app/src/main/java/com/aleengo/iconvert/ui/search/SearchTemplate.java @@ -75,7 +75,6 @@ public class SearchTemplate extends MvpView public SearchTemplate(ActivitySearchCurrency activity) { super(activity); this.activityWeakRef = new WeakReference<>(activity); - } public void swipeRefresh(boolean refresh) { @@ -91,11 +90,6 @@ public void clear() { activityWeakRef = null; } - @Override - public void inflate(int resid) { - inflate(getContext(), resid, this); - } - @Override public void initialize() { @@ -133,6 +127,14 @@ public void onEvent(CurrenciesEvent event) { swipeRefresh(false); } + @Override + public void updateAdapter(List entities) { + adapter.clear(); + adapter.updateItems(entities); + // stop the refresh + swipeRefresh(false); + } + @Override public void showMessage(int resId) { final Snackbar snackbar = Snackbar