From c558f1b29de9a8fcfaebb26b4ff62d41de505abd Mon Sep 17 00:00:00 2001 From: Kartikay Sharma Date: Wed, 10 Mar 2021 19:22:26 +0530 Subject: [PATCH] feat: brand autosuggest added (#3883) --- app/build.gradle.kts | 2 +- .../overview/ProductEditOverviewFragment.kt | 17 ++ .../features/splash/SplashController.kt | 1 + .../openfood/jobs/LoadTaxonomiesWorker.kt | 3 +- .../openfood/models/entities/brand/Brand.java | 184 ++++++++++++++++++ .../models/entities/brand/BrandName.java | 138 +++++++++++++ .../models/entities/brand/BrandResponse.kt | 23 +++ .../models/entities/brand/BrandsWrapper.kt | 8 + .../brand/BrandsWrapperDeserializer.kt | 28 +++ .../network/services/AnalysisDataAPI.kt | 5 + .../repositories/ProductRepository.kt | 34 ++++ .../openfood/repositories/Taxonomy.java | 7 + .../openfood/utils/OFFDatabaseHelper.kt | 6 + 13 files changed, 454 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/Brand.java create mode 100644 app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandName.java create mode 100644 app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandResponse.kt create mode 100644 app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapper.kt create mode 100644 app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapperDeserializer.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8b269c547511..7239b787155e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -370,7 +370,7 @@ kapt { } } -greendao { schemaVersion(21) } +greendao { schemaVersion(22) } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/overview/ProductEditOverviewFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/overview/ProductEditOverviewFragment.kt index e8a623147caa..a7b7dca46e04 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/overview/ProductEditOverviewFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/overview/ProductEditOverviewFragment.kt @@ -58,6 +58,8 @@ import openfoodfacts.github.scrachx.openfood.images.ProductImage import openfoodfacts.github.scrachx.openfood.models.Product import openfoodfacts.github.scrachx.openfood.models.ProductImageField import openfoodfacts.github.scrachx.openfood.models.entities.OfflineSavedProduct +import openfoodfacts.github.scrachx.openfood.models.entities.brand.BrandName +import openfoodfacts.github.scrachx.openfood.models.entities.brand.BrandNameDao import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoryName import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoryNameDao import openfoodfacts.github.scrachx.openfood.models.entities.country.CountryName @@ -96,6 +98,7 @@ class ProductEditOverviewFragment : ProductEditFragment() { private val countries = mutableListOf() private val labels = mutableListOf() private val stores = mutableListOf() + private val brands = mutableListOf() private var barcode: String? = null private var editionMode = false @@ -480,6 +483,7 @@ class ProductEditOverviewFragment : ProductEditFragment() { val asyncSessionLabels = OFFApplication.daoSession.startAsyncSession() val asyncSessionCategories = OFFApplication.daoSession.startAsyncSession() val asyncSessionStores = OFFApplication.daoSession.startAsyncSession() + val asyncSessionBrands = OFFApplication.daoSession.startAsyncSession() asyncSessionCountries.queryList(OFFApplication.daoSession.countryNameDao.queryBuilder() .where(CountryNameDao.Properties.LanguageCode.eq(appLanguageCode)) @@ -497,6 +501,10 @@ class ProductEditOverviewFragment : ProductEditFragment() { .where(StoreNameDao.Properties.LanguageCode.eq(appLanguageCode)) .orderDesc(StoreNameDao.Properties.Name).build()) + asyncSessionBrands.queryList(OFFApplication.daoSession.brandNameDao.queryBuilder() + .where(BrandNameDao.Properties.LanguageCode.eq(appLanguageCode)) + .orderDesc(BrandNameDao.Properties.Name).build()) + asyncSessionCountries.listenerMainThread = AsyncOperationListener { operation -> countries.clear() (operation.result as List).mapTo(countries) { it.name } @@ -536,6 +544,15 @@ class ProductEditOverviewFragment : ProductEditFragment() { stores )) } + asyncSessionBrands.listenerMainThread = AsyncOperationListener { operation -> + brands.clear() + (operation.result as List).mapTo(brands) { it.name } + binding.brand.setAdapter(ArrayAdapter( + requireContext(), + android.R.layout.simple_dropdown_item_1line, + brands + )) + } if (isFlavors(OBF)) { binding.periodOfTimeAfterOpeningTil.visibility = View.VISIBLE diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/splash/SplashController.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/splash/SplashController.kt index bba9a1cff9fb..074e37566da0 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/splash/SplashController.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/splash/SplashController.kt @@ -65,6 +65,7 @@ class SplashController internal constructor( activateDownload(ANALYSIS_TAG_CONFIG, OFF, OBF, OPFF) activateDownload(STATES, OFF, OBF, OPFF) activateDownload(STORES, OFF, OBF, OPFF) + activateDownload(BRANDS, OFF, OBF) //first run ever off this application, whatever the version val firstRun = settings.getBoolean("firstRun", true) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/jobs/LoadTaxonomiesWorker.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/jobs/LoadTaxonomiesWorker.kt index c2044323d58f..2195b320fb50 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/jobs/LoadTaxonomiesWorker.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/jobs/LoadTaxonomiesWorker.kt @@ -47,7 +47,8 @@ class LoadTaxonomiesWorker(appContext: Context, workerParams: WorkerParameters) ProductRepository.reloadAdditivesFromServer().ignoreElement(), ProductRepository.reloadCategoriesFromServer().ignoreElement(), ProductRepository.reloadStatesFromServer().ignoreElement(), - ProductRepository.reloadStoresFromServer().ignoreElement() + ProductRepository.reloadStoresFromServer().ignoreElement(), + ProductRepository.reloadBrandsFromServer().ignoreElement() ) return Completable.merge(syncObservables) .toSingle { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/Brand.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/Brand.java new file mode 100644 index 000000000000..786f3cbc717f --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/Brand.java @@ -0,0 +1,184 @@ +package openfoodfacts.github.scrachx.openfood.models.entities.brand; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Index; +import org.greenrobot.greendao.annotation.JoinProperty; +import org.greenrobot.greendao.annotation.Keep; +import org.greenrobot.greendao.annotation.ToMany; +import org.greenrobot.greendao.annotation.Unique; + +import java.util.List; +import org.greenrobot.greendao.annotation.Generated; +import org.greenrobot.greendao.DaoException; +import openfoodfacts.github.scrachx.openfood.models.DaoSession; + + +@Entity(indexes = { + @Index(value = "tag", unique = true) +}) +public class Brand { + + @Id(autoincrement = true) + private Long id; + + @Unique + private String tag; + + @Unique + private String wikiDataId; + + private Boolean isWikiDataIdPresent; + + @ToMany(joinProperties = { + @JoinProperty(name = "tag", referencedName = "brandTag") + }) + private List names; + + /** Used to resolve relations */ + @Generated(hash = 2040040024) + private transient DaoSession daoSession; + + /** Used for active entity operations. */ + @Generated(hash = 1427825859) + private transient BrandDao myDao; + + public Brand(){ + } + + @Keep + public Brand(String tag, List names, String wikiDataId) { + this.tag = tag; + this.names = names; + this.wikiDataId = wikiDataId; + this.isWikiDataIdPresent = true; + } + + @Keep + public Brand(String tag, List names) { + this.tag = tag; + this.names = names; + this.isWikiDataIdPresent = false; + } + + @Generated(hash = 435873667) + public Brand(Long id, String tag, String wikiDataId, + Boolean isWikiDataIdPresent) { + this.id = id; + this.tag = tag; + this.wikiDataId = wikiDataId; + this.isWikiDataIdPresent = isWikiDataIdPresent; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getWikiDataId() { + return wikiDataId; + } + + public void setWikiDataId(String wikiDataId) { + this.wikiDataId = wikiDataId; + } + + public Boolean getWikiDataIdPresent() { + return isWikiDataIdPresent; + } + + public void setWikiDataIdPresent(Boolean wikiDataIdPresent) { + isWikiDataIdPresent = wikiDataIdPresent; + } + + public Boolean getIsWikiDataIdPresent() { + return this.isWikiDataIdPresent; + } + + public void setIsWikiDataIdPresent(Boolean isWikiDataIdPresent) { + this.isWikiDataIdPresent = isWikiDataIdPresent; + } + + /** + * To-many relationship, resolved on first access (and after reset). + * Changes to to-many relations are not persisted, make changes to the target entity. + */ + @Generated(hash = 1714612506) + public List getNames() { + if (names == null) { + final DaoSession daoSession = this.daoSession; + if (daoSession == null) { + throw new DaoException("Entity is detached from DAO context"); + } + BrandNameDao targetDao = daoSession.getBrandNameDao(); + List namesNew = targetDao._queryBrand_Names(tag); + synchronized (this) { + if (names == null) { + names = namesNew; + } + } + } + return names; + } + + /** Resets a to-many relationship, making the next get call to query for a fresh result. */ + @Generated(hash = 1832659617) + public synchronized void resetNames() { + names = null; + } + + /** + * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}. + * Entity must attached to an entity context. + */ + @Generated(hash = 128553479) + public void delete() { + if (myDao == null) { + throw new DaoException("Entity is detached from DAO context"); + } + myDao.delete(this); + } + + /** + * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}. + * Entity must attached to an entity context. + */ + @Generated(hash = 1942392019) + public void refresh() { + if (myDao == null) { + throw new DaoException("Entity is detached from DAO context"); + } + myDao.refresh(this); + } + + /** + * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}. + * Entity must attached to an entity context. + */ + @Generated(hash = 713229351) + public void update() { + if (myDao == null) { + throw new DaoException("Entity is detached from DAO context"); + } + myDao.update(this); + } + + /** called by internal mechanisms, do not call yourself. */ + @Generated(hash = 538692092) + public void __setDaoSession(DaoSession daoSession) { + this.daoSession = daoSession; + myDao = daoSession != null ? daoSession.getBrandDao() : null; + } + +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandName.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandName.java new file mode 100644 index 000000000000..04cc2f832772 --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandName.java @@ -0,0 +1,138 @@ +package openfoodfacts.github.scrachx.openfood.models.entities.brand; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Index; +import org.greenrobot.greendao.annotation.Keep; +import org.greenrobot.greendao.annotation.Generated; + +@Entity(indexes = { + @Index(value = "languageCode, brandTag", unique = true) +}) +public class BrandName { + + @Id(autoincrement = true) + Long id; + + private String brandTag; + + private String languageCode; + + private String name; + + private String wikiDataId; + + private Boolean isWikiDataIdPresent; + + @Keep + public BrandName(String brandTag, String languageCode, String name, String wikiDataId) { + this.brandTag = brandTag; + this.languageCode = languageCode; + this.name = name; + this.wikiDataId = wikiDataId; + this.isWikiDataIdPresent = true; + } + + @Keep + public BrandName(String brandTag, String languageCode, String name) { + this.brandTag = brandTag; + this.languageCode = languageCode; + this.name = name; + } + + @Keep + public BrandName(String name) { + this.name = name; + } + + @Generated(hash = 1584626266) + public BrandName(Long id, String brandTag, String languageCode, String name, + String wikiDataId, Boolean isWikiDataIdPresent) { + this.id = id; + this.brandTag = brandTag; + this.languageCode = languageCode; + this.name = name; + this.wikiDataId = wikiDataId; + this.isWikiDataIdPresent = isWikiDataIdPresent; + } + + @Generated(hash = 2023712254) + public BrandName() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getBrandTag() { + return brandTag; + } + + public void setBrandTag(String brandTag) { + this.brandTag = brandTag; + } + + public String getLanguageCode() { + return languageCode; + } + + public void setLanguageCode(String languageCode) { + this.languageCode = languageCode; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getWikiDataId() { + if (this.wikiDataId == null) { + return "null"; + } + String res = this.wikiDataId; + int startIndex = res.indexOf("en"); + startIndex = startIndex + 5; + int lastIndex = res.lastIndexOf("\""); + if (startIndex < 3 || lastIndex < 3) { + return res; + } + res = res.substring(startIndex, lastIndex); + return res; + } + + public void setWikiDataId(String wikiDataId) { + this.wikiDataId = wikiDataId; + } + + public Boolean getWikiDataIdPresent() { + return isWikiDataIdPresent; + } + + public void setWikiDataIdPresent(Boolean wikiDataIdPresent) { + isWikiDataIdPresent = wikiDataIdPresent; + } + + public Boolean isNull() { + return id == null && brandTag == null && languageCode == null && name == null; + } + + public Boolean isNotNull() { + return id != null && brandTag != null && languageCode != null && name != null; + } + + public Boolean getIsWikiDataIdPresent() { + return this.isWikiDataIdPresent; + } + + public void setIsWikiDataIdPresent(Boolean isWikiDataIdPresent) { + this.isWikiDataIdPresent = isWikiDataIdPresent; + } +} + diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandResponse.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandResponse.kt new file mode 100644 index 000000000000..42f02ca17b87 --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandResponse.kt @@ -0,0 +1,23 @@ +package openfoodfacts.github.scrachx.openfood.models.entities.brand + +import openfoodfacts.github.scrachx.openfood.models.entities.EntityResponse + +class BrandResponse ( + private var code: String, + private var names: Map, + private val wikiDataCode: String? = null +) : EntityResponse { + override fun map() = if (wikiDataCode != null) { + Brand(code, arrayListOf(), wikiDataCode).also { + names.forEach { (key, value) -> + it.names.add(BrandName(it.tag, key, value, wikiDataCode)) + } + } + } else { + Brand(code, arrayListOf()).also { + names.forEach { (key, value) -> + it.names.add(BrandName(it.tag, key, value)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapper.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapper.kt new file mode 100644 index 000000000000..cae1efb4258f --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapper.kt @@ -0,0 +1,8 @@ +package openfoodfacts.github.scrachx.openfood.models.entities.brand + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import openfoodfacts.github.scrachx.openfood.models.entities.EntityResponse +import openfoodfacts.github.scrachx.openfood.models.entities.EntityWrapper + +@JsonDeserialize(using = BrandsWrapperDeserializer::class) +class BrandsWrapper(brands: List>) : EntityWrapper(brands) \ No newline at end of file diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapperDeserializer.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapperDeserializer.kt new file mode 100644 index 000000000000..3345bcba1deb --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/entities/brand/BrandsWrapperDeserializer.kt @@ -0,0 +1,28 @@ +package openfoodfacts.github.scrachx.openfood.models.entities.brand + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import openfoodfacts.github.scrachx.openfood.utils.DeserializerHelper +import java.io.IOException +import java.util.ArrayList + +class BrandsWrapperDeserializer : StdDeserializer(BrandsWrapper::class.java) { + @Throws(IOException::class) + override fun deserialize(jp: JsonParser, ctxt: DeserializationContext): BrandsWrapper { + val brands = ArrayList() + jp.codec.readTree(jp).fields().forEach { (key, value) -> + val namesNode = value[DeserializerHelper.NAMES_KEY] + if (namesNode != null) { + val names = DeserializerHelper.extractMapFromJsonNode(namesNode) + if (value.has(DeserializerHelper.WIKIDATA_KEY)) { + brands.add(BrandResponse(key, names, value[DeserializerHelper.WIKIDATA_KEY].toString())) + } else { + brands.add(BrandResponse(key, names)) + } + } + } + return BrandsWrapper(brands) + } +} \ No newline at end of file diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/services/AnalysisDataAPI.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/services/AnalysisDataAPI.kt index 506a8afec335..a49b2df032e2 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/services/AnalysisDataAPI.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/services/AnalysisDataAPI.kt @@ -5,6 +5,7 @@ import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditivesW import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergensWrapper import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.AnalysisTagsWrapper import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.AnalysisTagConfigsWrapper +import openfoodfacts.github.scrachx.openfood.models.entities.brand.BrandsWrapper import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoriesWrapper import openfoodfacts.github.scrachx.openfood.models.entities.country.CountriesWrapper import openfoodfacts.github.scrachx.openfood.models.entities.ingredient.IngredientsWrapper @@ -72,6 +73,9 @@ interface AnalysisDataAPI { @GET(STORES_JSON) fun getStores(): Single + @GET(BRANDS_JSON) + fun getBrands(): Single + @GET(ANALYSIS_TAG_JSON) fun getAnalysisTags(): Single @@ -98,6 +102,7 @@ interface AnalysisDataAPI { const val MINERALS_JSON = "$PREFIX/minerals.json" const val NUTRIENTS_JSON = "$PREFIX/nutrients.json" const val STORES_JSON = "$PREFIX/stores.json" + const val BRANDS_JSON = "$PREFIX/brands.json" const val INVALID_BARCODES_JSON = "data/invalid-barcodes.json" const val ANALYSIS_TAG_CONFIG_JSON = "files/app/ingredients-analysis.json" } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/ProductRepository.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/ProductRepository.kt index 82f84b487ecd..943325820f0d 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/ProductRepository.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/ProductRepository.kt @@ -30,6 +30,7 @@ import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.Analysi import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.AnalysisTagNameDao import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.AnalysisTagConfig import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.AnalysisTagConfigDao +import openfoodfacts.github.scrachx.openfood.models.entities.brand.Brand import openfoodfacts.github.scrachx.openfood.models.entities.category.* import openfoodfacts.github.scrachx.openfood.models.entities.country.Country import openfoodfacts.github.scrachx.openfood.models.entities.ingredient.* @@ -220,6 +221,16 @@ object ProductRepository { updateLastDownloadDateInSettings(Taxonomy.STORES, lastModifiedDate) } + fun reloadBrandsFromServer(): Single> = + getTaxonomyData(Taxonomy.BRANDS, this, true, OFFApplication.daoSession.brandDao) + + fun loadBrands(lastModifiedDate: Long): Single> = analysisDataApi.getBrands() + .map { it.map() } + .doOnSuccess{ + saveBrands(it) + updateLastDownloadDateInSettings(Taxonomy.BRANDS,lastModifiedDate) + } + /** * This function set lastDownloadtaxonomy setting * @@ -463,6 +474,29 @@ object ProductRepository { } } + /** + * Save Brands to local Database + * + * @param brands The list of brands to be stored + * + */ + private fun saveBrands(brands: List) { + OFFApplication.daoSession.database.beginTransaction() + try { + brands.forEach { brand -> + OFFApplication.daoSession.brandDao.insertOrReplace(brand) + brand.names.forEach { + OFFApplication.daoSession.brandNameDao.insertOrReplace(it) + } + } + OFFApplication.daoSession.database.setTransactionSuccessful() + } catch (e: Exception) { + Log.e(LOG_TAG, "saveBrands", e) + } finally { + OFFApplication.daoSession.database.endTransaction() + } + } + /** * Ingredient saving to local database * diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/Taxonomy.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/Taxonomy.java index af54f414b0c9..a850c1886f99 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/Taxonomy.java +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/repositories/Taxonomy.java @@ -24,6 +24,7 @@ import openfoodfacts.github.scrachx.openfood.models.entities.allergen.Allergen; import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.AnalysisTag; import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.AnalysisTagConfig; +import openfoodfacts.github.scrachx.openfood.models.entities.brand.Brand; import openfoodfacts.github.scrachx.openfood.models.entities.category.Category; import openfoodfacts.github.scrachx.openfood.models.entities.country.Country; import openfoodfacts.github.scrachx.openfood.models.entities.ingredient.Ingredient; @@ -106,6 +107,12 @@ public Single> load(ProductRepository repository, long lastModified public Single> load(ProductRepository repository, long lastModifiedDate){ return repository.loadStores(lastModifiedDate); } + }, + BRANDS(AnalysisDataAPI.BRANDS_JSON) { + @Override + public Single> load(ProductRepository repository, long lastModifiedDate) { + return repository.loadBrands(lastModifiedDate); + } }; private final String jsonUrl; diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/OFFDatabaseHelper.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/OFFDatabaseHelper.kt index 5a8fa1a2d3ba..0c54cccb9052 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/OFFDatabaseHelper.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/OFFDatabaseHelper.kt @@ -19,6 +19,8 @@ import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenNa import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.AnalysisTagDao import openfoodfacts.github.scrachx.openfood.models.entities.analysistag.AnalysisTagNameDao import openfoodfacts.github.scrachx.openfood.models.entities.analysistagconfig.AnalysisTagConfigDao +import openfoodfacts.github.scrachx.openfood.models.entities.brand.BrandDao +import openfoodfacts.github.scrachx.openfood.models.entities.brand.BrandNameDao import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoryDao import openfoodfacts.github.scrachx.openfood.models.entities.category.CategoryNameDao import openfoodfacts.github.scrachx.openfood.models.entities.country.CountryDao @@ -151,6 +153,10 @@ class OFFDatabaseHelper @JvmOverloads constructor( StoreDao.createTable(db, true) StoreNameDao.createTable(db, true) } + 22 -> { + BrandDao.createTable(db, true) + BrandNameDao.createTable(db, true) + } } }