From 250b805126a62d7a95d8f258575191ff1121557b Mon Sep 17 00:00:00 2001 From: Gilbert Kimutai Date: Sun, 15 Mar 2020 13:03:52 +0300 Subject: [PATCH] added offline cart repo --- .idea/gradle.xml | 1 + app/build.gradle | 3 + .../java/me/gilo/woodroid/app/di/AppModule.kt | 8 +++ .../gilo/woodroid/app/repo/CartRepository.kt | 33 +-------- .../woodroid/app/repo/CategoryRepository.kt | 14 ++-- .../app/ui/product/ProductActivity.kt | 55 +++------------ .../woodroid/app/ui/product/ShopActivity.kt | 20 ------ .../app/viewmodels/CartViewModel.java | 8 --- .../app/viewmodels/ProductViewModel.java | 17 +---- .../me/gilo/woodroid/core/cart/CartItem.kt | 16 +++++ .../gilo/woodroid/core/cart/CartRepository.kt | 6 +- .../firebasecart/FirebaseCartRepository.kt | 36 +--------- offlinecart/build.gradle | 60 ++++++++++++++++ offlinecart/consumer-rules.pro | 0 offlinecart/proguard-rules.pro | 21 ++++++ .../offlinecart/ExampleInstrumentedTest.kt | 24 +++++++ offlinecart/src/main/AndroidManifest.xml | 2 + .../woodroid/offlinecart/config/Config.java | 5 ++ .../woodroid/offlinecart/dao/CartItemDao.kt | 26 +++++++ .../woodroid/offlinecart/db/AppDatabase.kt | 15 ++++ .../offlinecart/entity/CartItemEntity.kt | 60 ++++++++++++++++ .../offlinecart/repo/CartRepository.kt | 63 +++++++++++++++++ .../offlinecart/task/CartItemAsyncExecutor.kt | 68 +++++++++++++++++++ .../woodroid/offlinecart/utils/AppUtils.kt | 35 ++++++++++ .../woodroid/offlinecart/utils/Converters.kt | 19 ++++++ .../woodroid/offlinecart/ExampleUnitTest.kt | 17 +++++ settings.gradle | 1 + .../java/me/gilo/woodroid/models/Product.kt | 9 ++- 28 files changed, 480 insertions(+), 162 deletions(-) create mode 100644 core/src/main/java/me/gilo/woodroid/core/cart/CartItem.kt create mode 100644 offlinecart/build.gradle create mode 100644 offlinecart/consumer-rules.pro create mode 100644 offlinecart/proguard-rules.pro create mode 100644 offlinecart/src/androidTest/java/me/gilo/woodroid/offlinecart/ExampleInstrumentedTest.kt create mode 100644 offlinecart/src/main/AndroidManifest.xml create mode 100644 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/config/Config.java create mode 100755 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/dao/CartItemDao.kt create mode 100755 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/db/AppDatabase.kt create mode 100644 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/entity/CartItemEntity.kt create mode 100755 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/repo/CartRepository.kt create mode 100644 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/task/CartItemAsyncExecutor.kt create mode 100644 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/AppUtils.kt create mode 100755 offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/Converters.kt create mode 100644 offlinecart/src/test/java/me/gilo/woodroid/offlinecart/ExampleUnitTest.kt diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2e695e8..fadebe3 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -15,6 +15,7 @@ diff --git a/app/build.gradle b/app/build.gradle index 7632f33..186fcc1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -200,6 +200,9 @@ dependencies { implementation project(path: ':firebasecart') implementation project(path: ':core') implementation project(path: ':cocart') + implementation project(path: ':offlinecart') + + debugImplementation 'im.dino:dbinspector:3.4.1@aar' implementation 'org.fabiomsr:moneytextview:1.1.0' diff --git a/app/src/main/java/me/gilo/woodroid/app/di/AppModule.kt b/app/src/main/java/me/gilo/woodroid/app/di/AppModule.kt index 6b141a9..a114d23 100644 --- a/app/src/main/java/me/gilo/woodroid/app/di/AppModule.kt +++ b/app/src/main/java/me/gilo/woodroid/app/di/AppModule.kt @@ -5,6 +5,7 @@ import dagger.Provides import me.gilo.woodroid.app.Config import me.gilo.woodroid.app.WcApp import me.gilo.woodroid.Woocommerce +import me.gilo.woodroid.offlinecart.repo.RoomCartRepository import javax.inject.Singleton @@ -35,4 +36,11 @@ class AppModule { .build() } + + @Provides + @Singleton + internal fun providesRoomCartRepository(): RoomCartRepository = RoomCartRepository(app!!.baseContext) + + + } diff --git a/app/src/main/java/me/gilo/woodroid/app/repo/CartRepository.kt b/app/src/main/java/me/gilo/woodroid/app/repo/CartRepository.kt index 8a798a0..55fd740 100644 --- a/app/src/main/java/me/gilo/woodroid/app/repo/CartRepository.kt +++ b/app/src/main/java/me/gilo/woodroid/app/repo/CartRepository.kt @@ -7,14 +7,16 @@ import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.FirebaseFirestore -import me.gilo.cocart.model.CartItem import me.gilo.woodroid.app.common.CompletionGenericLiveData import me.gilo.woodroid.app.common.QueryLiveData import me.gilo.woodroid.app.common.WooLiveData import me.gilo.woodroid.app.models.CartLineItem import me.gilo.woodroid.Woocommerce +import me.gilo.woodroid.core.cart.Cart +import me.gilo.woodroid.core.cart.CartItem import me.gilo.woodroid.models.Product +import me.gilo.woodroid.offlinecart.repo.RoomCartRepository import javax.inject.Inject open class CartRepository @Inject @@ -72,33 +74,4 @@ constructor() { } } - - fun addToCart(product: Product): CompletionGenericLiveData { - val completion = CompletionGenericLiveData() - - val lineItem = CartLineItem() - lineItem.setProductId(product.id) - lineItem.product = product - lineItem.setQuantity(1) - - cart.add(lineItem).addOnCompleteListener(completion) - - return completion - - } - - fun addToCart(context: Context, productId: Int, quantity: Int): WooLiveData { - val callBack = WooLiveData() - woocommerce.CartRepository(context).addToCart(productId, quantity).enqueue(callBack) - - return callBack - } - - fun cart(context: Context, customerId: String): WooLiveData> { - val callBack = WooLiveData>() - woocommerce.CartRepository(context).cart(customerId).enqueue(callBack) - - return callBack - } - } diff --git a/app/src/main/java/me/gilo/woodroid/app/repo/CategoryRepository.kt b/app/src/main/java/me/gilo/woodroid/app/repo/CategoryRepository.kt index 010fc53..f332c0f 100644 --- a/app/src/main/java/me/gilo/woodroid/app/repo/CategoryRepository.kt +++ b/app/src/main/java/me/gilo/woodroid/app/repo/CategoryRepository.kt @@ -18,7 +18,7 @@ constructor() { fun create(category: Category): WooLiveData { val callBack = WooLiveData() - woocommerce!!.CategoryRepository().create(category).enqueue(callBack) + woocommerce.CategoryRepository().create(category).enqueue(callBack) return callBack } @@ -26,42 +26,42 @@ constructor() { fun category(id: Int): WooLiveData { val callBack = WooLiveData() - woocommerce!!.CategoryRepository().category(id).enqueue(callBack) + woocommerce.CategoryRepository().category(id).enqueue(callBack) return callBack } fun categories(): WooLiveData> { val callBack = WooLiveData>() - woocommerce!!.CategoryRepository().categories().enqueue(callBack) + woocommerce.CategoryRepository().categories().enqueue(callBack) return callBack } fun categories(productCategoryFilter: ProductCategoryFilter): WooLiveData> { val callBack = WooLiveData>() - woocommerce!!.CategoryRepository().categories(productCategoryFilter).enqueue(callBack) + woocommerce.CategoryRepository().categories(productCategoryFilter).enqueue(callBack) return callBack } fun update(id: Int, category: Category): WooLiveData { val callBack = WooLiveData() - woocommerce!!.CategoryRepository().update(id, category).enqueue(callBack) + woocommerce.CategoryRepository().update(id, category).enqueue(callBack) return callBack } fun delete(id: Int): WooLiveData { val callBack = WooLiveData() - woocommerce!!.CategoryRepository().delete(id).enqueue(callBack) + woocommerce.CategoryRepository().delete(id).enqueue(callBack) return callBack } fun delete(id: Int, force: Boolean): WooLiveData { val callBack = WooLiveData() - woocommerce!!.CategoryRepository().delete(id, force).enqueue(callBack) + woocommerce.CategoryRepository().delete(id, force).enqueue(callBack) return callBack } diff --git a/app/src/main/java/me/gilo/woodroid/app/ui/product/ProductActivity.kt b/app/src/main/java/me/gilo/woodroid/app/ui/product/ProductActivity.kt index dc9da92..f1a6b27 100644 --- a/app/src/main/java/me/gilo/woodroid/app/ui/product/ProductActivity.kt +++ b/app/src/main/java/me/gilo/woodroid/app/ui/product/ProductActivity.kt @@ -23,7 +23,9 @@ import me.gilo.woodroid.app.models.CartLineItem import me.gilo.woodroid.app.ui.state.ProgressDialogFragment import me.gilo.woodroid.app.utils.AppUtils import me.gilo.woodroid.app.viewmodels.ProductViewModel +import me.gilo.woodroid.core.cart.CartItem import me.gilo.woodroid.models.Product +import me.gilo.woodroid.offlinecart.repo.RoomCartRepository import org.greenrobot.eventbus.EventBus @@ -57,57 +59,22 @@ class ProductActivity : BaseActivity() { } cart() - viewCart(AppUtils(baseContext).cartSession) + } private fun addToCart(product: Product) { - viewModel.addToCart(baseContext, product.id, 1).observe(this, Observer { response -> - when (response!!.status()) { - Status.LOADING -> { + RoomCartRepository(baseContext).addToCart( + CartItem( + productId = product.id, + productImage = product.getFeatureImage(), + quantity = 1, + productPrice = product.price + ) - } - - Status.SUCCESS -> { - toast("success!") - val cartItem = response.data() - AppUtils(baseContext).saveCartSession(cartItem.key, "") - } - - Status.ERROR -> { - toast("error : " + response.error().message) - } - - Status.EMPTY -> { - - } - } - }) - } - - private fun viewCart(customerId: String) { - viewModel.cart(baseContext, customerId).observe(this, Observer { response -> - when (response!!.status()) { - Status.LOADING -> { - - } - - Status.SUCCESS -> { - toast("success!") - - } - - Status.ERROR -> { - toast("error : " + response.error().message) - } - - Status.EMPTY -> { - - } - } - }) + ) } private fun removeFromCart(cartLineItem: CartLineItem) { diff --git a/app/src/main/java/me/gilo/woodroid/app/ui/product/ShopActivity.kt b/app/src/main/java/me/gilo/woodroid/app/ui/product/ShopActivity.kt index 8a30a37..5d593ab 100644 --- a/app/src/main/java/me/gilo/woodroid/app/ui/product/ShopActivity.kt +++ b/app/src/main/java/me/gilo/woodroid/app/ui/product/ShopActivity.kt @@ -137,26 +137,6 @@ class ShopActivity : BaseActivity() { private fun cart() { val cartKey = AppUtils(baseContext).cartSession - viewModel.cart(baseContext, cartKey).observe(this, androidx.lifecycle.Observer { response -> - when (response!!.status()) { - Status.LOADING -> { - } - - Status.SUCCESS -> { - val cartResponse = response.data() - } - - Status.ERROR -> { - - - } - - Status.EMPTY -> { - - } - } - - }) } private fun search(query : String) { diff --git a/app/src/main/java/me/gilo/woodroid/app/viewmodels/CartViewModel.java b/app/src/main/java/me/gilo/woodroid/app/viewmodels/CartViewModel.java index a1c9b73..88419aa 100644 --- a/app/src/main/java/me/gilo/woodroid/app/viewmodels/CartViewModel.java +++ b/app/src/main/java/me/gilo/woodroid/app/viewmodels/CartViewModel.java @@ -31,10 +31,6 @@ public final class CartViewModel extends ViewModel { this.customerRepository = customerRepository; } - public CompletionGenericLiveData addToCart(Product product) { - return cartRepository.addToCart(product); - } - public QueryLiveData cart() { return cartRepository.cart(); } @@ -51,10 +47,6 @@ public final class CartViewModel extends ViewModel { return cartRepository.setQuantity(cartLineItem, quantity); } -// public WooLiveData> cart(Context context) { -// return cartRepository.cart(context); -// } - public WooLiveData createOrder(Order order) { return orderRepository.create(order); } diff --git a/app/src/main/java/me/gilo/woodroid/app/viewmodels/ProductViewModel.java b/app/src/main/java/me/gilo/woodroid/app/viewmodels/ProductViewModel.java index ae15fb1..bb62399 100644 --- a/app/src/main/java/me/gilo/woodroid/app/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/woodroid/app/viewmodels/ProductViewModel.java @@ -2,10 +2,6 @@ package me.gilo.woodroid.app.viewmodels; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import android.content.Context; -import com.google.firebase.firestore.DocumentReference; - -import me.gilo.cocart.model.CartItem; import me.gilo.woodroid.app.common.CompletionGenericLiveData; import me.gilo.woodroid.app.common.QueryLiveData; import me.gilo.woodroid.app.common.WooLiveData; @@ -13,7 +9,7 @@ import me.gilo.woodroid.app.models.CartLineItem; import me.gilo.woodroid.app.repo.CartRepository; import me.gilo.woodroid.app.repo.OrderRepository; import me.gilo.woodroid.app.repo.ProductRepository; -import me.gilo.woodroid.models.LineItem; + import me.gilo.woodroid.models.Order; import me.gilo.woodroid.models.Product; import me.gilo.woodroid.models.ProductReview; @@ -52,9 +48,6 @@ public final class ProductViewModel extends ViewModel { return productRepository.products(); } - public CompletionGenericLiveData addToCart(Product product) { - return cartRepository.addToCart(product); - } public WooLiveData addToCart(int productId) { return orderRepository.addToCart(productId); @@ -76,14 +69,6 @@ public final class ProductViewModel extends ViewModel { return cartRepository.setQuantity(cartLineItem, quantity); } - public WooLiveData> cart(Context context, String customerId) { - return cartRepository.cart(context, customerId); - } - - public WooLiveData addToCart(Context context, int productId, int quantity) { - return cartRepository.addToCart(context, productId, quantity); - } - public WooLiveData> products(ProductFilter filter) { return productRepository.products(filter); } diff --git a/core/src/main/java/me/gilo/woodroid/core/cart/CartItem.kt b/core/src/main/java/me/gilo/woodroid/core/cart/CartItem.kt new file mode 100644 index 0000000..2c61686 --- /dev/null +++ b/core/src/main/java/me/gilo/woodroid/core/cart/CartItem.kt @@ -0,0 +1,16 @@ +package me.gilo.woodroid.core.cart + + +data class CartItem ( + var id: Int? = 0, + var createdAt: Long? = null, + var modifiedAt: Long? = null, + var productId: Int = 0, + var variationId: Int? = 0, + var quantity: Int = 0, + + var productName: String? = "", + var productPrice: String? = "", + var productImage: String? = "" + +) \ No newline at end of file diff --git a/core/src/main/java/me/gilo/woodroid/core/cart/CartRepository.kt b/core/src/main/java/me/gilo/woodroid/core/cart/CartRepository.kt index a912199..c3dcb59 100644 --- a/core/src/main/java/me/gilo/woodroid/core/cart/CartRepository.kt +++ b/core/src/main/java/me/gilo/woodroid/core/cart/CartRepository.kt @@ -8,10 +8,10 @@ abstract class CartRepository{ abstract fun clear(): LiveData abstract fun count(id: Int): LiveData - abstract fun cart(): LiveData> - abstract fun addToCart(lineItem: LineItem): LiveData + abstract fun cart(): LiveData + abstract fun addToCart(cartItem: CartItem) abstract fun delete(cartId: String): LiveData abstract fun restore(cartId: String): LiveData - abstract fun update(cartId: String, quantity: Int): LiveData + abstract fun update(cartId: String, quantity: Int) } diff --git a/firebasecart/src/main/java/me/gilo/woodroid/firebasecart/FirebaseCartRepository.kt b/firebasecart/src/main/java/me/gilo/woodroid/firebasecart/FirebaseCartRepository.kt index 128d790..cfc7b30 100644 --- a/firebasecart/src/main/java/me/gilo/woodroid/firebasecart/FirebaseCartRepository.kt +++ b/firebasecart/src/main/java/me/gilo/woodroid/firebasecart/FirebaseCartRepository.kt @@ -5,47 +5,17 @@ import androidx.lifecycle.LiveData import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore +import me.gilo.woodroid.core.cart.Cart +import me.gilo.woodroid.core.cart.CartItem import me.gilo.woodroid.core.cart.CartRepository import me.gilo.woodroid.core.cart.lines.LineItem -open class FirebaseCartRepository(userId : String) : CartRepository() { +open class FirebaseCartRepository(userId : String){ private val cart: CollectionReference = FirebaseFirestore.getInstance() .collection("users") .document(userId) .collection("cart") - - override fun cart(): LiveData> { - TODO("not implemented") - } - - override fun clear(): LiveData { - TODO("not implemented") - } - - override fun count(id: Int): LiveData { - TODO("not implemented") - } - - override fun addToCart(lineItem: LineItem): LiveData { - TODO("not implemented") - } - - override fun delete(cartId: String): LiveData { - TODO("not implemented") - } - - override fun restore(cartId: String): LiveData { - TODO("not implemented") - } - - override fun update(cartId: String, quantity: Int): LiveData { - TODO("not implemented") - } - - - - } diff --git a/offlinecart/build.gradle b/offlinecart/build.gradle new file mode 100644 index 0000000..d6a166c --- /dev/null +++ b/offlinecart/build.gradle @@ -0,0 +1,60 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' + + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.1.0' + + implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + kapt "androidx.lifecycle:lifecycle-compiler:2.3.0-alpha01" + implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0' + implementation 'androidx.paging:paging-runtime-ktx:2.1.1' + + // Room components + implementation "androidx.room:room-runtime:2.2.4" + kapt "androidx.room:room-compiler:2.2.4" + androidTestImplementation "androidx.room:room-testing:2.2.4" + + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3" + + implementation project(path: ':core') + + + implementation 'androidx.core:core-ktx:1.2.0' + testImplementation 'junit:junit:4.13' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/offlinecart/consumer-rules.pro b/offlinecart/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/offlinecart/proguard-rules.pro b/offlinecart/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/offlinecart/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/offlinecart/src/androidTest/java/me/gilo/woodroid/offlinecart/ExampleInstrumentedTest.kt b/offlinecart/src/androidTest/java/me/gilo/woodroid/offlinecart/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..f39b5da --- /dev/null +++ b/offlinecart/src/androidTest/java/me/gilo/woodroid/offlinecart/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package me.gilo.woodroid.offlinecart + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("me.gilo.woodroid.offlinecart.test", appContext.packageName) + } +} diff --git a/offlinecart/src/main/AndroidManifest.xml b/offlinecart/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b46824a --- /dev/null +++ b/offlinecart/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/config/Config.java b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/config/Config.java new file mode 100644 index 0000000..618e45a --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/config/Config.java @@ -0,0 +1,5 @@ +package me.gilo.woodroid.offlinecart.config; + +public class Config { + public static String DB_NAME = "db_woodroid_cart"; +} diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/dao/CartItemDao.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/dao/CartItemDao.kt new file mode 100755 index 0000000..164458a --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/dao/CartItemDao.kt @@ -0,0 +1,26 @@ +package me.gilo.woodroid.offlinecart.dao + +import androidx.lifecycle.LiveData +import androidx.room.* +import me.gilo.woodroid.offlinecart.entity.CartItemEntity + +@Dao +interface CartItemDao { + @Insert + fun insert(category: CartItemEntity?): Long? + + @Query("SELECT * FROM cart_item ORDER BY created_at desc") + fun fetchAll(): List + + @Query("SELECT COUNT(*) FROM cart_item") + fun count(): LiveData + + @Query("SELECT * FROM cart_item WHERE id =:id") + operator fun get(id: Int): LiveData + + @Update + fun update(category: CartItemEntity?) + + @Delete + fun delete(category: CartItemEntity?) +} \ No newline at end of file diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/db/AppDatabase.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/db/AppDatabase.kt new file mode 100755 index 0000000..92ea70c --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/db/AppDatabase.kt @@ -0,0 +1,15 @@ +package me.gilo.woodroid.offlinecart.db + +import androidx.room.Database +import androidx.room.RoomDatabase +import me.gilo.woodroid.offlinecart.dao.CartItemDao +import me.gilo.woodroid.offlinecart.entity.CartItemEntity + +@Database( + entities = [ + CartItemEntity::class + ], version = 1, exportSchema = false +) +abstract class AppDatabase : RoomDatabase() { + abstract fun cartItemDao(): CartItemDao +} \ No newline at end of file diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/entity/CartItemEntity.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/entity/CartItemEntity.kt new file mode 100644 index 0000000..8cca48e --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/entity/CartItemEntity.kt @@ -0,0 +1,60 @@ +package me.gilo.woodroid.offlinecart.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import me.gilo.woodroid.core.cart.CartItem + +@Entity(tableName = "cart_item") +data class CartItemEntity ( + @PrimaryKey(autoGenerate = true) + var id: Int? = 0, + + @ColumnInfo(name = "created_at") + var createdAt: Long? = null, + + @ColumnInfo(name = "modified_at") + var modifiedAt: Long? = null, + + @ColumnInfo(name = "product_id") + var productId: Int = 0, + + @ColumnInfo(name = "quantity") + var quantity: Int = 0, + + @ColumnInfo(name = "variation_id") + var variationId: Int? = 0, + + @ColumnInfo(name = "product_name") + var productName: String? = "", + + @ColumnInfo(name = "product_price") + var productPrice: String? = "", + + @ColumnInfo(name = "product_image") + var productImage: String? = "" +) + +fun CartItemEntity.toCartItem() = CartItem( + id = this.id, + createdAt = this.createdAt, + modifiedAt = this.modifiedAt, + productId = this.productId, + quantity = this.quantity, + variationId = this.variationId, + productName = this.productName, + productPrice = this.productPrice, + productImage = this.productImage +) + +fun CartItem.toCartItemEntity() = CartItemEntity( + id = this.id, + createdAt = this.createdAt, + modifiedAt = this.modifiedAt, + productId = this.productId, + quantity = this.quantity, + variationId = this.variationId, + productName = this.productName, + productPrice = this.productPrice, + productImage = this.productImage +) diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/repo/CartRepository.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/repo/CartRepository.kt new file mode 100755 index 0000000..165fba7 --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/repo/CartRepository.kt @@ -0,0 +1,63 @@ +package me.gilo.woodroid.offlinecart.repo + +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations +import androidx.room.Room +import me.gilo.moneta.room.task.DeleteCartItem +import me.gilo.moneta.room.task.InsertCartItem +import me.gilo.moneta.room.task.RetrieveCartItems +import me.gilo.moneta.room.task.UpdateCartItem +import me.gilo.woodroid.offlinecart.utils.AppUtils +import me.gilo.woodroid.core.cart.CartItem +import me.gilo.woodroid.offlinecart.config.Config +import me.gilo.woodroid.offlinecart.db.AppDatabase +import me.gilo.woodroid.offlinecart.entity.CartItemEntity +import me.gilo.woodroid.offlinecart.entity.toCartItem + +class RoomCartRepository(val context: Context){ + + private val appDatabase: AppDatabase = Room + .databaseBuilder(context, AppDatabase::class.java, Config.DB_NAME) + .fallbackToDestructiveMigration() + .build() + + + fun addToCart(cartItem: CartItem) { + if (cartItem.createdAt == null) { + cartItem.createdAt = AppUtils.currentDateTime.time + } + + InsertCartItem(appDatabase, cartItem).execute() + } + + fun update(cartItem: CartItem) { + cartItem.modifiedAt = AppUtils.currentDateTime.time + UpdateCartItem(appDatabase, cartItem).execute() + + } + + fun count(): LiveData { + return appDatabase.cartItemDao().count() + } + + fun delete(cartItem: CartItem) { + DeleteCartItem(appDatabase, cartItem).execute() + } + + fun cartItem(id: Int): LiveData { + return Transformations.map( + appDatabase.cartItemDao().get(id) + ) { cartItemEntity: CartItemEntity? -> cartItemEntity?.toCartItem() + } + } + + fun items(): LiveData> { + val data: MutableLiveData> = MutableLiveData() + RetrieveCartItems(appDatabase, data).execute() + + return data + } + +} diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/task/CartItemAsyncExecutor.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/task/CartItemAsyncExecutor.kt new file mode 100644 index 0000000..e0311fa --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/task/CartItemAsyncExecutor.kt @@ -0,0 +1,68 @@ +package me.gilo.moneta.room.task + +import android.os.AsyncTask +import androidx.lifecycle.MutableLiveData +import me.gilo.woodroid.core.cart.CartItem +import me.gilo.woodroid.offlinecart.db.AppDatabase +import me.gilo.woodroid.offlinecart.entity.toCartItem +import me.gilo.woodroid.offlinecart.entity.toCartItemEntity +import java.util.* +import kotlin.collections.ArrayList + + +class InsertCartItem( + private val appDatabase: AppDatabase, + private val cartItem: CartItem +) : + AsyncTask() { + + override fun doInBackground(vararg voids: Void): Long? { + + return appDatabase.cartItemDao() + .insert(cartItem.toCartItemEntity()) + } +} + +class RetrieveCartItems( + private val appDatabase: AppDatabase, + + private val data: MutableLiveData> +) : + AsyncTask() { + + var categories = ArrayList() + + override fun doInBackground(vararg voids: Void){ + val list = appDatabase.cartItemDao().fetchAll() + for (item in list){ + categories.add(item.toCartItem()) + } + } + + override fun onPostExecute(result: Unit?) { + data.value = categories; + super.onPostExecute(result) + } +} + +class UpdateCartItem( + private val appDatabase: AppDatabase, + private val cartItem: CartItem +) : + AsyncTask() { + + override fun doInBackground(vararg voids: Void) { + return appDatabase.cartItemDao().update(cartItem.toCartItemEntity()) + } +} + +class DeleteCartItem( + private val appDatabase: AppDatabase, + private val cartItem: CartItem +) : + AsyncTask() { + + override fun doInBackground(vararg voids: Void) { + return appDatabase.cartItemDao().delete(cartItem.toCartItemEntity()) + } +} diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/AppUtils.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/AppUtils.kt new file mode 100644 index 0000000..0fb82a4 --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/AppUtils.kt @@ -0,0 +1,35 @@ +package me.gilo.woodroid.offlinecart.utils + +import android.content.Context +import android.widget.Toast +import androidx.annotation.StringRes +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* + +/* + * + */ +class AppUtils(internal var context: Context) { + internal var token: String? = null + internal var expiry: String? = null + + companion object { + val currentDateTime: Date + get() = Calendar.getInstance().time + + fun getFormattedDateString(date: Date?): String? { + try { + var spf = SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy") + val dateString = spf.format(date) + val newDate = spf.parse(dateString) + spf = SimpleDateFormat("dd MMM yyyy HH:mm:ss") + return spf.format(newDate) + } catch (e: ParseException) { + e.printStackTrace() + } + return null + } + } + +} \ No newline at end of file diff --git a/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/Converters.kt b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/Converters.kt new file mode 100755 index 0000000..2a0d700 --- /dev/null +++ b/offlinecart/src/main/java/me/gilo/woodroid/offlinecart/utils/Converters.kt @@ -0,0 +1,19 @@ +package me.gilo.woodroid.offlinecart.utils + + +import androidx.room.TypeConverter +import java.util.* + +class Converters { + + @TypeConverter + public fun fromTimestamp(value: Long?): Date? { + return if (value == null) null else Date(value) + } + + @TypeConverter + public fun dateToTimestamp(date: Date?): Long? { + return date?.time + } + +} \ No newline at end of file diff --git a/offlinecart/src/test/java/me/gilo/woodroid/offlinecart/ExampleUnitTest.kt b/offlinecart/src/test/java/me/gilo/woodroid/offlinecart/ExampleUnitTest.kt new file mode 100644 index 0000000..bb3fb7d --- /dev/null +++ b/offlinecart/src/test/java/me/gilo/woodroid/offlinecart/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package me.gilo.woodroid.offlinecart + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle b/settings.gradle index 6a808c8..bfd9698 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ include ':app', ':woodroid', ':firebasecart', ':core' include ':cocart' +include ':offlinecart' diff --git a/woodroid/src/main/java/me/gilo/woodroid/models/Product.kt b/woodroid/src/main/java/me/gilo/woodroid/models/Product.kt index 778db37..c241d3d 100644 --- a/woodroid/src/main/java/me/gilo/woodroid/models/Product.kt +++ b/woodroid/src/main/java/me/gilo/woodroid/models/Product.kt @@ -68,6 +68,13 @@ class Product : Serializable { var menu_order: Int = 0 lateinit var meta_data: ArrayList lateinit var images: ArrayList + + fun getFeatureImage(): String{ + if(this.images.isEmpty()){ + return "" + } + + return this.images.first().src!! + } } -