Browse Source

sanwitch lib for removing bpt

Milan Jurkulak 3 years ago
parent
commit
994cd4d1be

+ 2 - 0
app/build.gradle.kts

@@ -228,6 +228,8 @@ dependencies {
     implementation("com.squareup.retrofit2:retrofit:2.9.0")
     implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
     implementation("com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2")
+    // sandwich
+    implementation ("com.github.skydoves:sandwich:1.3.8")
     // encrypt data
     implementation("com.scottyab:aescrypt:0.0.1")
     // permission

+ 0 - 7
app/src/main/kotlin/org/mjdev/tvapp/module/ProvideModule.kt

@@ -23,7 +23,6 @@ import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
 import org.mjdev.tvapp.BuildConfig
 import org.mjdev.tvapp.activity.MainActivity
-import org.mjdev.tvapp.repository.ApiRepository
 import org.mjdev.tvapp.repository.ApiService
 import org.mjdev.tvlib.helpers.apps.AppsManager
 import org.mjdev.tvlib.helpers.cursor.AudioCursor
@@ -144,10 +143,4 @@ class ProvideModule {
         retrofit: Retrofit
     ): ApiService = retrofit.create(ApiService::class.java)
 
-    @Singleton
-    @Provides
-    fun providesApiRepository(
-        apiService: ApiService
-    ): ApiRepository = ApiRepository(apiService)
-
 }

+ 0 - 39
app/src/main/kotlin/org/mjdev/tvapp/repository/ApiRepository.kt

@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) Milan Jurkulák 2023.
- *  Contact:
- *  e: mimoccc@gmail.com
- *  e: mj@mjdev.org
- *  w: https://mjdev.org
- */
-
-@file:Suppress("unused")
-
-package org.mjdev.tvapp.repository
-
-import org.mjdev.tvapp.data.remote.Category
-import org.mjdev.tvapp.data.remote.Channel
-import org.mjdev.tvapp.data.remote.Epg
-import org.mjdev.tvapp.data.remote.Stream
-import org.mjdev.tvlib.extensions.GlobalExt.runSafe
-
-class ApiRepository(
-    private val apiService: ApiService
-) {
-
-    suspend fun channels(): Result<List<Channel>> = runSafe {
-        apiService.channels().execute().body() ?: emptyList()
-    }
-
-    suspend fun streams(): Result<List<Stream>> = runSafe {
-        apiService.streams().execute().body() ?: emptyList()
-    }
-
-    suspend fun epg(): Result<List<Epg>> = runSafe {
-        apiService.epg().execute().body() ?: emptyList()
-    }
-
-    suspend fun categories(): Result<List<Category>> = runSafe {
-        apiService.categories().execute().body() ?: emptyList()
-    }
-
-}

+ 7 - 7
app/src/main/kotlin/org/mjdev/tvapp/repository/ApiService.kt

@@ -8,34 +8,34 @@
 
 package org.mjdev.tvapp.repository
 
+import com.skydoves.sandwich.ApiResponse
 import org.mjdev.tvapp.data.remote.Category
 import org.mjdev.tvapp.data.remote.Channel
 import org.mjdev.tvapp.data.remote.Country
 import org.mjdev.tvapp.data.remote.Epg
 import org.mjdev.tvapp.data.remote.Language
 import org.mjdev.tvapp.data.remote.Stream
-import retrofit2.Call
 import retrofit2.http.GET
 
 @Suppress("unused")
 interface ApiService {
 
     @GET("channels.json")
-    fun channels(): Call<List<Channel>>
+    fun channels(): ApiResponse<List<Channel>>
 
     @GET("streams.json")
-    fun streams(): Call<List<Stream>>
+    fun streams(): ApiResponse<List<Stream>>
 
     @GET("guides.json")
-    fun epg(): Call<List<Epg>>
+    fun epg(): ApiResponse<List<Epg>>
 
     @GET("categories.json")
-    fun categories(): Call<List<Category>>
+    fun categories(): ApiResponse<List<Category>>
 
     @GET("languages.json")
-    fun languages(): Call<List<Language>>
+    fun languages(): ApiResponse<List<Language>>
 
     @GET("countries.json")
-    fun countries(): Call<List<Country>>
+    fun countries(): ApiResponse<List<Country>>
 
 }

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/repository/MovieRepository.kt

@@ -16,7 +16,7 @@ import org.mjdev.tvlib.extensions.GlobalExt.runSafe
 import javax.inject.Inject
 
 class MovieRepository @Inject constructor(
-    var dao: DAO
+    private var dao: DAO
 ) : IMovieRepository {
 
     override suspend fun getMovies(

+ 7 - 6
app/src/main/kotlin/org/mjdev/tvapp/sync/SyncAdapter.kt

@@ -11,11 +11,12 @@ import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.runBlocking
 import org.mjdev.tvapp.R
-import org.mjdev.tvapp.repository.ApiRepository
 import org.mjdev.tvapp.data.local.Movie
 import org.mjdev.tvapp.database.DAO
 import org.mjdev.tvapp.database.DAO.Companion.tx
+import org.mjdev.tvapp.repository.ApiService
 import org.mjdev.tvapp.repository.IMovieRepository
+import org.mjdev.tvlib.extensions.GlobalExt.safeGet
 import org.mjdev.tvlib.extensions.ListExt.contains
 import timber.log.Timber
 
@@ -23,7 +24,7 @@ import timber.log.Timber
 class SyncAdapter(
     context: Context,
     val repository: IMovieRepository,
-    val apiRepository: ApiRepository,
+    val apiService: ApiService,
     val dao: DAO
 ) : AbstractThreadedSyncAdapter(context, true, false) {
 
@@ -43,10 +44,10 @@ class SyncAdapter(
             runBlocking(Dispatchers.IO) {
                 val movieUris = movieDao.all.map { m -> m.uri }.toMutableList()
                 flow {
-                    val streams = apiRepository.streams().getOrNull()
-                    val channels = apiRepository.channels().getOrNull()
-                    streams?.forEach { stream ->
-                        val channel = channels?.firstOrNull { channel ->
+                    val streams = apiService.streams().safeGet()
+                    val channels = apiService.channels().safeGet()
+                    streams.forEach { stream ->
+                        val channel = channels.firstOrNull { channel ->
                             channel.id == stream.channel
                         }
                         if (channel != null) {

+ 3 - 3
app/src/main/kotlin/org/mjdev/tvapp/sync/SyncService.kt

@@ -12,8 +12,8 @@ import android.os.Bundle
 import android.os.IBinder
 import dagger.hilt.android.AndroidEntryPoint
 import org.mjdev.tvapp.BuildConfig
-import org.mjdev.tvapp.repository.ApiRepository
 import org.mjdev.tvapp.database.DAO
+import org.mjdev.tvapp.repository.ApiService
 import org.mjdev.tvapp.repository.IMovieRepository
 import timber.log.Timber
 import javax.inject.Inject
@@ -25,7 +25,7 @@ class SyncService : Service() {
     lateinit var repository: IMovieRepository
 
     @Inject
-    lateinit var apiRepository: ApiRepository
+    lateinit var apiService: ApiService
 
     @Inject
     lateinit var dao: DAO
@@ -36,7 +36,7 @@ class SyncService : Service() {
             sSyncAdapter = sSyncAdapter ?: SyncAdapter(
                 context = applicationContext,
                 repository = repository,
-                apiRepository = apiRepository,
+                apiService = apiService,
                 dao = dao
             )
         }

+ 5 - 1
tvlib/build.gradle.kts

@@ -109,6 +109,8 @@ dependencies {
     implementation("com.squareup.moshi:moshi:1.15.0")
     implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
     ksp("com.squareup.moshi:moshi-kotlin-codegen:1.15.0")
+    // sandwich
+    implementation ("com.github.skydoves:sandwich:1.3.8")
     // image loading
     implementation("io.coil-kt:coil-base:2.4.0")
     implementation("io.coil-kt:coil-gif:2.4.0")
@@ -165,7 +167,9 @@ dependencies {
     // anr
     implementation("com.github.anrwatchdog:anrwatchdog:1.4.0")
     // dm
-    implementation ("com.dailymotion.dailymotion-sdk-android:sdk:0.2.12")
+    implementation("com.dailymotion.dailymotion-sdk-android:sdk:0.2.12")
+    // yt
+    // ...
     // constraints
     constraints {
         implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.0")?.apply {

+ 22 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/extensions/GlobalExt.kt

@@ -10,6 +10,12 @@ package org.mjdev.tvlib.extensions
 
 import android.os.Handler
 import androidx.compose.runtime.MutableState
+import com.skydoves.sandwich.ApiResponse
+import com.skydoves.sandwich.getOrNull
+import com.skydoves.sandwich.message
+import com.skydoves.sandwich.onError
+import com.skydoves.sandwich.toFlow
+import kotlinx.coroutines.flow.Flow
 import timber.log.Timber
 
 @Suppress("unused")
@@ -19,6 +25,22 @@ object GlobalExt {
         value = !value
     }
 
+    fun <T> ApiResponse<T>.safeFlow(
+        error: (code: Int, message: String?) -> Unit = { code, message ->
+            Timber.e("Response error : ($code, ${message})")
+        }
+    ): Flow<T> = onError {
+        error(statusCode.code, message())
+    }.toFlow()
+
+    inline fun <reified T> ApiResponse<List<T>>.safeGet(
+        crossinline error: (code: Int, message: String?) -> Unit = { code, message ->
+            Timber.e("Response error : ($code, ${message})")
+        },
+    ): List<T> = onError {
+        error(statusCode.code, message())
+    }.getOrNull() ?: emptyList()
+
     suspend fun <E> runSafe(block: suspend () -> E): Result<E> = try {
         block.invoke().let { result ->
             Result.success(result)