Loading app/src/main/java/foundation/e/apps/api/ApiCaller.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api import retrofit2.Response suspend fun <T> getResult(apiCall: suspend () -> Response<T>): Result<T> { return try { fetchResult(apiCall()) } catch (e: Exception) { Result.error(e.message ?: e.toString()) } } private fun <T> fetchResult(response: Response<T>): Result<T> { if (response.isSuccessful) { response.body()?.let { return Result.success(it) } } return Result.error(response.message(), response.body()) } app/src/main/java/foundation/e/apps/api/Result.kt 0 → 100644 +46 −0 Original line number Diff line number Diff line package foundation.e.apps.api data class Result<T>(val status: Status, val data: T?, val message: String?) { enum class Status { SUCCESS, ERROR, LOADING } companion object { fun <T> success(data: T): Result<T> { return Result( Status.SUCCESS, data, null ) } fun <T> error(message: String, data: T? = null): Result<T> { return Result( Status.ERROR, data, message ) } fun <T> loading(data: T? = null): Result<T> { return Result( Status.LOADING, data, null ) } } fun isSuccess() = status == Status.SUCCESS fun handleResult(handler: () -> Unit, defaultErrorData: T?): T? { if (isSuccess()) { handler() return data ?: defaultErrorData } return defaultErrorData } } app/src/main/java/foundation/e/apps/api/cleanapk/RetrofitModule.kt +12 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.api.exodus.ExodusTrackerApi import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient Loading @@ -49,6 +50,17 @@ object RetrofitModule { .create(CleanAPKInterface::class.java) } @Singleton @Provides fun provideExodusApi(okHttpClient: OkHttpClient): ExodusTrackerApi { return Retrofit.Builder() .baseUrl(ExodusTrackerApi.BASE_URL) .client(okHttpClient) .addConverterFactory(MoshiConverterFactory.create()) .build() .create(ExodusTrackerApi::class.java) } @Singleton @Provides fun provideInterceptor(): Interceptor { Loading app/src/main/java/foundation/e/apps/api/database/AppDatabase.kt 0 → 100644 +33 −0 Original line number Diff line number Diff line package foundation.e.apps.api.database import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import foundation.e.apps.api.exodus.Tracker import foundation.e.apps.api.exodus.TrackerDao @Database( entities = [Tracker::class], version = 1, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { abstract fun trackerDao(): TrackerDao companion object { private lateinit var INSTANCE: AppDatabase fun getInstance(context: Context): AppDatabase { if (!Companion::INSTANCE.isInitialized) { synchronized(AppDatabase::class) { INSTANCE = Room.databaseBuilder(context, AppDatabase::class.java, "App_Lounge") .fallbackToDestructiveMigration() .build() } } return INSTANCE } } } app/src/main/java/foundation/e/apps/api/exodus/ExodusTrackerApi.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package foundation.e.apps.api.exodus import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Path interface ExodusTrackerApi { companion object { const val BASE_URL = "https://exodus.ecloud.global/api/" const val VERSION = "190239" } @GET("trackers?v=$VERSION") suspend fun getTrackerList(): Response<Trackers> @GET("search/{appHandle}") suspend fun getTrackerInfoOfApp(@Path("appHandle") appHandle: String): Response<Map<String, TrackerInfo>> } Loading
app/src/main/java/foundation/e/apps/api/ApiCaller.kt 0 → 100644 +21 −0 Original line number Diff line number Diff line package foundation.e.apps.api import retrofit2.Response suspend fun <T> getResult(apiCall: suspend () -> Response<T>): Result<T> { return try { fetchResult(apiCall()) } catch (e: Exception) { Result.error(e.message ?: e.toString()) } } private fun <T> fetchResult(response: Response<T>): Result<T> { if (response.isSuccessful) { response.body()?.let { return Result.success(it) } } return Result.error(response.message(), response.body()) }
app/src/main/java/foundation/e/apps/api/Result.kt 0 → 100644 +46 −0 Original line number Diff line number Diff line package foundation.e.apps.api data class Result<T>(val status: Status, val data: T?, val message: String?) { enum class Status { SUCCESS, ERROR, LOADING } companion object { fun <T> success(data: T): Result<T> { return Result( Status.SUCCESS, data, null ) } fun <T> error(message: String, data: T? = null): Result<T> { return Result( Status.ERROR, data, message ) } fun <T> loading(data: T? = null): Result<T> { return Result( Status.LOADING, data, null ) } } fun isSuccess() = status == Status.SUCCESS fun handleResult(handler: () -> Unit, defaultErrorData: T?): T? { if (isSuccess()) { handler() return data ?: defaultErrorData } return defaultErrorData } }
app/src/main/java/foundation/e/apps/api/cleanapk/RetrofitModule.kt +12 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.api.exodus.ExodusTrackerApi import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient Loading @@ -49,6 +50,17 @@ object RetrofitModule { .create(CleanAPKInterface::class.java) } @Singleton @Provides fun provideExodusApi(okHttpClient: OkHttpClient): ExodusTrackerApi { return Retrofit.Builder() .baseUrl(ExodusTrackerApi.BASE_URL) .client(okHttpClient) .addConverterFactory(MoshiConverterFactory.create()) .build() .create(ExodusTrackerApi::class.java) } @Singleton @Provides fun provideInterceptor(): Interceptor { Loading
app/src/main/java/foundation/e/apps/api/database/AppDatabase.kt 0 → 100644 +33 −0 Original line number Diff line number Diff line package foundation.e.apps.api.database import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import foundation.e.apps.api.exodus.Tracker import foundation.e.apps.api.exodus.TrackerDao @Database( entities = [Tracker::class], version = 1, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { abstract fun trackerDao(): TrackerDao companion object { private lateinit var INSTANCE: AppDatabase fun getInstance(context: Context): AppDatabase { if (!Companion::INSTANCE.isInitialized) { synchronized(AppDatabase::class) { INSTANCE = Room.databaseBuilder(context, AppDatabase::class.java, "App_Lounge") .fallbackToDestructiveMigration() .build() } } return INSTANCE } } }
app/src/main/java/foundation/e/apps/api/exodus/ExodusTrackerApi.kt 0 → 100644 +19 −0 Original line number Diff line number Diff line package foundation.e.apps.api.exodus import retrofit2.Response import retrofit2.http.GET import retrofit2.http.Path interface ExodusTrackerApi { companion object { const val BASE_URL = "https://exodus.ecloud.global/api/" const val VERSION = "190239" } @GET("trackers?v=$VERSION") suspend fun getTrackerList(): Response<Trackers> @GET("search/{appHandle}") suspend fun getTrackerInfoOfApp(@Path("appHandle") appHandle: String): Response<Map<String, TrackerInfo>> }