Forráskód Böngészése

Added gson deserializer for abstract classes

Vadik Sirekanyan 7 éve
szülő
commit
600c2cb6a3

+ 15 - 1
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -10,10 +10,14 @@ import com.sirekanyan.knigopis.common.view.dialog.BottomSheetDialogFactory
 import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
 import com.sirekanyan.knigopis.feature.user.UserInteractor
 import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
+import com.sirekanyan.knigopis.model.BookDataModel
+import com.sirekanyan.knigopis.model.BookHeaderModel
+import com.sirekanyan.knigopis.model.BookModel
 import com.sirekanyan.knigopis.repository.*
 import com.sirekanyan.knigopis.repository.api.Endpoint
 import com.sirekanyan.knigopis.repository.cache.common.CommonCache
 import com.sirekanyan.knigopis.repository.cache.common.CommonCacheImpl
+import com.sirekanyan.knigopis.repository.cache.common.CommonModelDeserializer
 import com.sirekanyan.knigopis.repository.model.FinishedBook
 import com.sirekanyan.knigopis.repository.model.PlannedBook
 import okhttp3.OkHttpClient
@@ -48,7 +52,17 @@ val appModule = applicationContext {
     bean { ResourceProviderImpl(get()) as ResourceProvider }
     bean { NetworkCheckerImpl(get()) as NetworkChecker }
     bean { CommonCacheImpl(get(), get()) as CommonCache }
-    bean { GsonBuilder().setDateFormat(DATE_FORMAT).create() }
+    bean {
+        GsonBuilder().registerTypeAdapter(
+            BookModel::class.java,
+            CommonModelDeserializer<BookModel>(
+                BookHeaderModel::class.java,
+                BookDataModel::class.java
+            )
+        )
+            .setDateFormat(DATE_FORMAT)
+            .create()
+    }
     factory { BottomSheetDialogFactory(it["activity"]) as DialogFactory }
     userModule()
 }

+ 1 - 1
app/src/main/java/com/sirekanyan/knigopis/repository/cache/common/CacheKey.kt

@@ -2,7 +2,7 @@ package com.sirekanyan.knigopis.repository.cache.common
 
 enum class CacheKey {
 
-    PLANNED_BOOKS, FINISHED_BOOKS, SUBSCRIPTIONS, NOTES;
+    BOOKS, USERS, NOTES;
 
     val storeValue get() = name.toLowerCase()
 

+ 26 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/cache/common/CommonModelDeserializer.kt

@@ -0,0 +1,26 @@
+package com.sirekanyan.knigopis.repository.cache.common
+
+import com.google.gson.JsonDeserializationContext
+import com.google.gson.JsonDeserializer
+import com.google.gson.JsonElement
+import com.google.gson.JsonObject
+import com.sirekanyan.knigopis.common.adapter.CommonModel
+import java.lang.reflect.Type
+
+class CommonModelDeserializer<T : CommonModel>(
+    private val headerType: Type,
+    private val dataType: Type
+) : JsonDeserializer<T> {
+
+    override fun deserialize(
+        json: JsonElement,
+        type: Type,
+        context: JsonDeserializationContext
+    ): T {
+        json as JsonObject
+        val isHeader = json.get("isHeader").asBoolean
+        val actualType = if (isHeader) headerType else dataType
+        return context.deserialize(json, actualType)
+    }
+
+}