From c71519c4feee4cfe17df558ba4b7dbc749218b9d Mon Sep 17 00:00:00 2001 From: amirisback Date: Wed, 1 Oct 2025 15:40:17 +0700 Subject: [PATCH 1/3] update: intent extra --- app/build.gradle.kts | 17 ++++++-- .../java/com/frogobox/appsdk/model/Article.kt | 6 ++- .../appsdk/news/NewsDetailActivity.kt | 8 ++-- .../appsdk/news/result/NewsResultActivity.kt | 8 ++-- .../appsdk/news/result/NewsResultViewModel.kt | 6 +-- .../appsdk/source/AppDataSourceResult.kt | 8 ++-- .../appsdk/source/AppRemoteDataSource.kt | 8 ++-- .../frogobox/appsdk/source/AppRepository.kt | 8 ++-- core-ads/build.gradle.kts | 1 + core-sdk-android/build.gradle.kts | 2 + .../sdk/ext/FrogoContextActivityExt.kt | 39 ++++++++++++------- .../com/frogobox/sdk/ext/FrogoRxJavaExt.kt | 28 ++++++------- ...{FrogoWidgetExt.kt => FrogoTextViewExt.kt} | 0 core-sdk/build.gradle.kts | 1 + .../coresdk/ext/CoroutineRetrofitExt.kt | 37 ++++++++++++++++++ .../frogobox/coresdk/source/FrogoResult.kt | 32 --------------- .../com/frogobox/coresdk/source/Resource.kt | 37 ++++++++++++++++++ .../coresdk/source/SampleApiService.kt | 28 +++++++++++++ core-ui-android/build.gradle.kts | 1 + frogorecyclerview/build.gradle.kts | 1 + gradle/libs.versions.toml | 36 ++++++++++------- gradle/wrapper/gradle-wrapper.properties | 2 +- 22 files changed, 212 insertions(+), 102 deletions(-) rename core-sdk-android/src/main/java/com/frogobox/sdk/ext/{FrogoWidgetExt.kt => FrogoTextViewExt.kt} (100%) create mode 100644 core-sdk/src/main/java/com/frogobox/coresdk/ext/CoroutineRetrofitExt.kt delete mode 100644 core-sdk/src/main/java/com/frogobox/coresdk/source/FrogoResult.kt create mode 100644 core-sdk/src/main/java/com/frogobox/coresdk/source/Resource.kt create mode 100644 core-sdk/src/main/java/com/frogobox/coresdk/source/SampleApiService.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f7581fd..c73ba9b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,11 +1,25 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.text.SimpleDateFormat +import java.util.Date plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ksp) + id("kotlin-parcelize") } +ksp { + arg("room.schemaLocation", "$projectDir/schemas") // If Using Ksp +} + +base { + // Naming APK // AAB + val timestamp = SimpleDateFormat("dd-MM-yyyy_hh-mm").format(Date()) + archivesName = "${ProjectSetting.NAME_APK}-[${ProjectSetting.PROJECT_VERSION_NAME}]-$timestamp" +} + + android { compileSdk = ProjectSetting.PROJECT_COMPILE_SDK @@ -26,9 +40,6 @@ android { // Declaration build config buildConfigField("String", "DATABASE_NAME", ProjectSetting.DB) - // Naming APK // AAB - setProperty("archivesBaseName", "${ProjectSetting.NAME_APK}(${versionName})") - // Declaration apps name debug mode val debugAttribute = "Development" val nameAppDebug = "${ProjectSetting.NAME_APP} $debugAttribute" diff --git a/app/src/main/java/com/frogobox/appsdk/model/Article.kt b/app/src/main/java/com/frogobox/appsdk/model/Article.kt index e5742ae..1e178e7 100644 --- a/app/src/main/java/com/frogobox/appsdk/model/Article.kt +++ b/app/src/main/java/com/frogobox/appsdk/model/Article.kt @@ -1,9 +1,11 @@ package com.frogobox.appsdk.model +import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize /** * Created by Faisal Amir @@ -22,6 +24,8 @@ import com.google.gson.annotations.SerializedName * com.frogobox.frogoconsumeapi.news.data.model * */ + +@Parcelize @Entity(tableName = "article") data class Article( @@ -55,4 +59,4 @@ data class Article( @ColumnInfo(name = "content") @SerializedName("content") var content: String? = null, -) \ No newline at end of file +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/appsdk/news/NewsDetailActivity.kt b/app/src/main/java/com/frogobox/appsdk/news/NewsDetailActivity.kt index 252eb81..a0e3535 100644 --- a/app/src/main/java/com/frogobox/appsdk/news/NewsDetailActivity.kt +++ b/app/src/main/java/com/frogobox/appsdk/news/NewsDetailActivity.kt @@ -10,7 +10,7 @@ import com.frogobox.sdk.ext.setImageExt class NewsDetailActivity : BaseActivity() { - private val extraData: Article by lazy { + private val extraData: Article? by lazy { getExtraExt("EXTRA_NEWS_DETAIL") } @@ -22,9 +22,9 @@ class NewsDetailActivity : BaseActivity() { super.onCreateExt(savedInstanceState) setupDetailActivity("Detail News") binding.apply { - ivNewsDetailImage.setImageExt(extraData.urlToImage, R.drawable.ic_frogobox) - newsDetailTitle.text = extraData.title - newsDetailDescription.text = extraData.description + ivNewsDetailImage.setImageExt(extraData?.urlToImage, R.drawable.ic_frogobox) + newsDetailTitle.text = extraData?.title + newsDetailDescription.text = extraData?.description } } } \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultActivity.kt b/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultActivity.kt index 0ea4d59..de0194c 100644 --- a/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultActivity.kt +++ b/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultActivity.kt @@ -5,7 +5,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.frogobox.appsdk.core.BaseActivity import com.frogobox.appsdk.model.Article import com.frogobox.appsdk.news.NewsViewAdapter -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.databinding.ActivityNewsBinding import com.frogobox.sdk.ext.gone import com.frogobox.sdk.ext.visible @@ -25,15 +25,15 @@ class NewsResultActivity : BaseActivity() { articles.observe(this@NewsResultActivity) { when (it) { - is FrogoResult.Error -> { + is Resource.Error -> { binding.progressCircular.gone() } - is FrogoResult.Loading -> { + is Resource.Loading -> { binding.progressCircular.visible() } - is FrogoResult.Success -> { + is Resource.Success -> { binding.progressCircular.gone() it.result.articles?.let { list -> setupRecyclerView(list) diff --git a/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultViewModel.kt b/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultViewModel.kt index 4868d33..9e47137 100644 --- a/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultViewModel.kt +++ b/app/src/main/java/com/frogobox/appsdk/news/result/NewsResultViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.MutableLiveData import com.frogobox.appsdk.model.ArticleResponse import com.frogobox.appsdk.source.AppRepository import com.frogobox.appsdk.util.NewsConstant -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.sdk.view.FrogoViewModel2 @@ -26,8 +26,8 @@ class NewsResultViewModel( private val repository: AppRepository, ) : FrogoViewModel2() { - private var _articles = MutableLiveData>() - var articles: LiveData> = _articles + private var _articles = MutableLiveData>() + var articles: LiveData> = _articles private fun getData() { repository.getTopHeadlineResult( diff --git a/app/src/main/java/com/frogobox/appsdk/source/AppDataSourceResult.kt b/app/src/main/java/com/frogobox/appsdk/source/AppDataSourceResult.kt index 75b3715..4dd0e1d 100644 --- a/app/src/main/java/com/frogobox/appsdk/source/AppDataSourceResult.kt +++ b/app/src/main/java/com/frogobox/appsdk/source/AppDataSourceResult.kt @@ -3,7 +3,7 @@ package com.frogobox.appsdk.source import androidx.lifecycle.MutableLiveData import com.frogobox.appsdk.model.ArticleResponse import com.frogobox.appsdk.model.SourceResponse -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.coresdk.source.ICoreDataSource @@ -30,7 +30,7 @@ interface AppDataSourceResult : ICoreDataSource { country: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) // Get Everythings @@ -46,7 +46,7 @@ interface AppDataSourceResult : ICoreDataSource { sortBy: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) // Get Sources @@ -54,7 +54,7 @@ interface AppDataSourceResult : ICoreDataSource { language: String, country: String, category: String, - result: MutableLiveData>, + result: MutableLiveData>, ) } \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/appsdk/source/AppRemoteDataSource.kt b/app/src/main/java/com/frogobox/appsdk/source/AppRemoteDataSource.kt index 371f429..f5c641c 100644 --- a/app/src/main/java/com/frogobox/appsdk/source/AppRemoteDataSource.kt +++ b/app/src/main/java/com/frogobox/appsdk/source/AppRemoteDataSource.kt @@ -10,7 +10,7 @@ import com.frogobox.appsdk.util.NewsUrl import com.frogobox.coresdk.response.FrogoDataResponse import com.frogobox.coresdk.response.FrogoStateResponse import com.frogobox.coresdk.source.FrogoApiClient -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.sdk.ext.doApiRequest import com.frogobox.sdk.ext.doApiRequestResult import com.frogobox.sdk.ext.usingChuck @@ -163,7 +163,7 @@ class AppRemoteDataSource(private val context: Context) : FrogoRemoteDataSource( country: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) { FrogoApiClient .create( @@ -189,7 +189,7 @@ class AppRemoteDataSource(private val context: Context) : FrogoRemoteDataSource( sortBy: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) { FrogoApiClient .create( @@ -220,7 +220,7 @@ class AppRemoteDataSource(private val context: Context) : FrogoRemoteDataSource( language: String, country: String, category: String, - result: MutableLiveData>, + result: MutableLiveData>, ) { FrogoApiClient .create( diff --git a/app/src/main/java/com/frogobox/appsdk/source/AppRepository.kt b/app/src/main/java/com/frogobox/appsdk/source/AppRepository.kt index 5171bb6..f655fe3 100644 --- a/app/src/main/java/com/frogobox/appsdk/source/AppRepository.kt +++ b/app/src/main/java/com/frogobox/appsdk/source/AppRepository.kt @@ -7,7 +7,7 @@ import com.frogobox.appsdk.model.ArticleResponse import com.frogobox.appsdk.model.SourceResponse import com.frogobox.coresdk.response.FrogoDataResponse import com.frogobox.coresdk.response.FrogoStateResponse -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.sdk.ext.toJson import com.frogobox.sdk.source.FrogoRepository import com.frogobox.sdk.util.FrogoFunc @@ -193,7 +193,7 @@ class AppRepository( country: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) { remoteDataSource.getTopHeadlineResult(q, sources, category, country, pageSize, page, result) } @@ -210,7 +210,7 @@ class AppRepository( sortBy: String?, pageSize: Int?, page: Int?, - result: MutableLiveData>, + result: MutableLiveData>, ) { remoteDataSource.getEverythingsResult( q, @@ -232,7 +232,7 @@ class AppRepository( language: String, country: String, category: String, - result: MutableLiveData>, + result: MutableLiveData>, ) { remoteDataSource.getSourcesResult(language, country, category, result) } diff --git a/core-ads/build.gradle.kts b/core-ads/build.gradle.kts index 03e5030..4d88eeb 100644 --- a/core-ads/build.gradle.kts +++ b/core-ads/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) + id("kotlin-parcelize") `maven-publish` } diff --git a/core-sdk-android/build.gradle.kts b/core-sdk-android/build.gradle.kts index c9ccfcc..2957a09 100644 --- a/core-sdk-android/build.gradle.kts +++ b/core-sdk-android/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ksp) + id("kotlin-parcelize") `maven-publish` } @@ -84,6 +85,7 @@ dependencies { api(libs.github.glide) api(libs.github.customactivityoncrash) + api(libs.kotlinx.coroutines.android) ksp(libs.androidx.lifecycle.compiler) ksp(libs.androidx.room.compiler) diff --git a/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoContextActivityExt.kt b/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoContextActivityExt.kt index b7d236c..c246ad2 100644 --- a/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoContextActivityExt.kt +++ b/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoContextActivityExt.kt @@ -4,8 +4,11 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build +import androidx.appcompat.app.AppCompatActivity import com.frogobox.sdk.ui.FrogoImageViewActivity import com.google.gson.Gson +import androidx.core.net.toUri /** @@ -31,23 +34,31 @@ inline fun Context.startActivityExt(onIntent: (intent: I }) } -inline fun Activity.getExtraExt(extraKey: String): Model { - return when (Model::class) { - String::class -> intent.getStringExtra(extraKey) as Model - Int::class -> intent.getIntExtra(extraKey, 0) as Model - Boolean::class -> intent.getBooleanExtra(extraKey, false) as Model - Double::class -> intent.getDoubleExtra(extraKey, 0.0) as Model - Float::class -> intent.getFloatExtra(extraKey, 0.0f) as Model - Long::class -> intent.getLongExtra(extraKey, 0L) as Model - Model::class -> Gson().fromJson(intent.getStringExtra(extraKey), Model::class.java) - else -> throw Exception("Type not found") - } -} - fun Activity.hasExtraExt(extraKey: String): Boolean { return intent.hasExtra(extraKey) } +inline fun Activity.getExtraExt(params: String): T? { + return intent.getExtraExt(params) +} + +inline fun Intent.getExtraExt(params: String): T? { + return if (this.hasExtra(params)) { + return when (T::class) { + String::class -> getStringExtra(params) as T + Int::class -> getIntExtra(params, 0) as T + Boolean::class -> getBooleanExtra(params, false) as T + Double::class -> getDoubleExtra(params, 0.0) as T + Float::class -> getFloatExtra(params, 0.0f) as T + Long::class -> getLongExtra(params, 0L) as T + T::class -> @Suppress("DEPRECATION") this.getParcelableExtra(params) + else -> throw Exception("Type not found") + } + } else { + null + } +} + fun Activity.openDetailImageUri(uri: String) { startActivityExt { it.putExtra(FrogoImageViewActivity.IMAGE_URI, uri) @@ -64,7 +75,7 @@ fun Context.startActivityExtShareApp(subject: String, text: String) { } fun Context.startActivityExtOpenApp(url: String) { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + startActivity(Intent(Intent.ACTION_VIEW, url.toUri())) } // ------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoRxJavaExt.kt b/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoRxJavaExt.kt index afe8aab..270226b 100644 --- a/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoRxJavaExt.kt +++ b/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoRxJavaExt.kt @@ -5,8 +5,8 @@ import com.frogobox.coresdk.observer.FrogoApiObserver import com.frogobox.coresdk.observer.FrogoLocalObserver import com.frogobox.coresdk.response.FrogoDataResponse import com.frogobox.coresdk.response.FrogoStateResponse -import com.frogobox.coresdk.source.FrogoResult -import com.frogobox.coresdk.source.FrogoResultState +import com.frogobox.coresdk.source.Resource +import com.frogobox.coresdk.source.ResourceState import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable @@ -63,12 +63,12 @@ fun Observable.doApiRequest( } fun Observable.doApiRequestResult( - result: MutableLiveData>, + result: MutableLiveData>, addCallbackSubscribe: (d: Disposable) -> Unit, ) { subscribeOn(Schedulers.io()) .doOnSubscribe { - result.value = FrogoResult.Loading() + result.value = Resource.Loading() } .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Observer{ @@ -77,13 +77,13 @@ fun Observable.doApiRequestResult( } override fun onError(e: Throwable) { - result.value = FrogoResult.Error(message = e.message) + result.value = Resource.Error(message = e.message) } override fun onComplete() {} override fun onNext(t: T) { - result.value = FrogoResult.Success(t) + result.value = Resource.Success(t) } }) @@ -127,12 +127,12 @@ fun Single.fetchRoomDB( fun Single.fetchRoomDBResult( - result: MutableLiveData>, + result: MutableLiveData>, addCallbackSubscribe: (d: Disposable) -> Unit ) { subscribeOn(Schedulers.io()) .doOnSubscribe { - result.value = FrogoResult.Loading() + result.value = Resource.Loading() } .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : SingleObserver{ @@ -141,11 +141,11 @@ fun Single.fetchRoomDBResult( } override fun onError(e: Throwable) { - result.value = FrogoResult.Error(message = e.message) + result.value = Resource.Error(message = e.message) } override fun onSuccess(t: T) { - result.value = FrogoResult.Success(t) + result.value = Resource.Success(t) } }) } @@ -184,16 +184,16 @@ fun Completable.executeRoomDB(callback: FrogoStateResponse) { } } -fun Completable.executeRoomDBResult(result: MutableLiveData) { +fun Completable.executeRoomDBResult(result: MutableLiveData) { subscribeOn(Schedulers.io()) .doOnSubscribe { - result.value = FrogoResultState.Loading() + result.value = ResourceState.Loading() } .observeOn(AndroidSchedulers.mainThread()) .subscribe({ - result.value = FrogoResultState.Success() + result.value = ResourceState.Success() }) { - it.message?.let { it1 ->result.value = FrogoResultState.Error(message = it1) } + it.message?.let { it1 ->result.value = ResourceState.Error(message = it1) } } } diff --git a/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoWidgetExt.kt b/core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoTextViewExt.kt similarity index 100% rename from core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoWidgetExt.kt rename to core-sdk-android/src/main/java/com/frogobox/sdk/ext/FrogoTextViewExt.kt diff --git a/core-sdk/build.gradle.kts b/core-sdk/build.gradle.kts index 60c4104..ab45a30 100644 --- a/core-sdk/build.gradle.kts +++ b/core-sdk/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { api(libs.square.retrofit.adapter.rxjava3) api(libs.reactivex.rxjava3) + api(libs.kotlinx.coroutines.core) } publishing { diff --git a/core-sdk/src/main/java/com/frogobox/coresdk/ext/CoroutineRetrofitExt.kt b/core-sdk/src/main/java/com/frogobox/coresdk/ext/CoroutineRetrofitExt.kt new file mode 100644 index 0000000..47c3ae4 --- /dev/null +++ b/core-sdk/src/main/java/com/frogobox/coresdk/ext/CoroutineRetrofitExt.kt @@ -0,0 +1,37 @@ +package com.frogobox.coresdk.ext + +import com.frogobox.coresdk.source.Resource +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import retrofit2.Response + +/** + * Created by faisalamircs on 01/10/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +/** + * // Search meal by name + * fun searchMeal(apiKey: String, nameMeal: String): Flow?>> = + * flow { + * try { + * emit(Resource.Loading()) + * val request = apiService.searchMeal(apiKey, nameMeal) + * val response = request.body() + * if (!request.isSuccessful) { + * emit(Resource.Error(request.message())) + * } else { + * emit(Resource.Success(response)) + * } + * } catch (e: Exception) { + * emit(Resource.Error(e.message.toString())) + * } + * }.flowOn(Dispatchers.IO) + */ \ No newline at end of file diff --git a/core-sdk/src/main/java/com/frogobox/coresdk/source/FrogoResult.kt b/core-sdk/src/main/java/com/frogobox/coresdk/source/FrogoResult.kt deleted file mode 100644 index 3e0d836..0000000 --- a/core-sdk/src/main/java/com/frogobox/coresdk/source/FrogoResult.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.frogobox.coresdk.source - -/** - * Created by Faisal Amir on 10/12/22 - * ----------------------------------------- - * E-mail : faisalamircs@gmail.com - * Github : github.com/amirisback - * ----------------------------------------- - * Copyright (C) Frogobox ID / amirisback - * All rights reserved - */ - - -sealed class FrogoResult { - - class Success(val result: T) : FrogoResult() - - class Error(val code: Int? = 500, val message: String? = "") : FrogoResult() - - class Loading : FrogoResult() - -} - -sealed class FrogoResultState { - - class Success : FrogoResultState() - - class Error(val code: Int? = 500, val message: String? = "") : FrogoResultState() - - class Loading : FrogoResultState() - -} \ No newline at end of file diff --git a/core-sdk/src/main/java/com/frogobox/coresdk/source/Resource.kt b/core-sdk/src/main/java/com/frogobox/coresdk/source/Resource.kt new file mode 100644 index 0000000..b1a9ff6 --- /dev/null +++ b/core-sdk/src/main/java/com/frogobox/coresdk/source/Resource.kt @@ -0,0 +1,37 @@ +package com.frogobox.coresdk.source + +import com.google.errorprone.annotations.Keep + +/** + * Created by Faisal Amir on 10/12/22 + * ----------------------------------------- + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + * Copyright (C) Frogobox ID / amirisback + * All rights reserved + */ + + +sealed class Resource { + class Success(val result: T) : Resource() + class Error(val code: Int? = 500, val message: String? = "") : Resource() + class Loading : Resource() +} + +sealed class ResourceState { + class Success : ResourceState() + class Error(val code: Int? = 500, val message: String? = "") : ResourceState() + class Loading : ResourceState() +} + +sealed class DownloadResource { + @Keep + data class Success(val localPath: String) : DownloadResource() + + @Keep + data class Loading(val progress: Int? = 0) : DownloadResource() + + @Keep + data class Error(val message: String) : DownloadResource() +} \ No newline at end of file diff --git a/core-sdk/src/main/java/com/frogobox/coresdk/source/SampleApiService.kt b/core-sdk/src/main/java/com/frogobox/coresdk/source/SampleApiService.kt new file mode 100644 index 0000000..1017fc8 --- /dev/null +++ b/core-sdk/src/main/java/com/frogobox/coresdk/source/SampleApiService.kt @@ -0,0 +1,28 @@ +package com.frogobox.coresdk.source + +import retrofit2.Response +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Query + +/** + * Created by faisalamircs on 01/10/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + +interface SampleApiService { + + /** + * @GET(URL_SEARCH_MEAL) + * suspend fun searchMeal( + * @Path(PATH_API_KEY) apiKey: String, + * @Query(QUERY_NAME) nameMeal: String, + * ): Response> + */ + +} \ No newline at end of file diff --git a/core-ui-android/build.gradle.kts b/core-ui-android/build.gradle.kts index 39fcb9b..f774fe5 100644 --- a/core-ui-android/build.gradle.kts +++ b/core-ui-android/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) + id("kotlin-parcelize") `maven-publish` } diff --git a/frogorecyclerview/build.gradle.kts b/frogorecyclerview/build.gradle.kts index e51a1de..c6f529f 100644 --- a/frogorecyclerview/build.gradle.kts +++ b/frogorecyclerview/build.gradle.kts @@ -3,6 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) + id("kotlin-parcelize") `maven-publish` } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 25170b6..12165ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,34 +1,38 @@ [versions] -agp = "8.12.2" +agp = "8.13.0" androidMavenGradlePlugin = "2.1" -kotlin = "2.2.10" -ksp = "2.2.10-2.0.2" +kotlin = "2.2.20" +ksp = "2.2.20-2.0.3" coreKtx = "1.17.0" appcompat = "1.7.1" -activity = "1.10.1" +activity = "1.11.0" fragment = "1.8.9" constraintlayout = "2.2.1" -liveCycle = "2.9.3" +liveCycle = "2.9.4" viewPager2 = "1.1.0" preference = "1.2.1" -roomKtx = "2.7.2" -work = "2.10.3" -googleAdmob = "24.5.0" # https://developers.google.com/admob/android/quick-start +roomKtx = "2.8.1" +work = "2.10.5" +googleAdmob = "24.6.0" # https://developers.google.com/admob/android/quick-start unityAd = "4.16.1" # https://developers.google.com/admob/android/mediation/unity#step_3_import_the_unity_ads_sdk_and_adapter recyclerview = "1.4.0" flexbox = "3.0.0" -material = "1.12.0" -gson = "2.13.1" +material = "1.13.0" +gson = "2.13.2" okhttp = "5.1.0" retrofit = "3.0.0" rxandroid3 = "3.0.2" -rxjava3 = "3.1.11" +rxjava3 = "3.1.12" chucker = "4.2.0" -glide = "5.0.3" -glideCompiler = "4.16.0" +glide = "5.0.5" +glideCompiler = "5.0.5" customactivityoncrash = "2.4.0" circleimageview = "3.1.0" -koin = "4.1.0" +koin = "4.1.1" + +kotlinxCoroutinesCore = "1.10.2" +kotlinxCoroutinesAndroid = "1.10.2" +kotlinxCoroutinesTest = "1.10.2" [libraries] # Android Kit @@ -59,6 +63,10 @@ androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = androidx-room-rxjava3 = { group = "androidx.room", name = "room-rxjava3", version.ref = "roomKtx" } androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "roomKtx" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesAndroid" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" } +kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutinesTest" } + androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c8eca0c..4bd6be4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sat May 03 01:44:33 WIB 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 197730f3ffdcbfecf128a8b7205eedc8ab6ff7b8 Mon Sep 17 00:00:00 2001 From: amirisback Date: Wed, 1 Oct 2025 15:40:25 +0700 Subject: [PATCH 2/3] update: intent extra --- .../1.json | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 app/schemas/com.frogobox.appsdk.source.AppDatabase/1.json diff --git a/app/schemas/com.frogobox.appsdk.source.AppDatabase/1.json b/app/schemas/com.frogobox.appsdk.source.AppDatabase/1.json new file mode 100644 index 0000000..da172fa --- /dev/null +++ b/app/schemas/com.frogobox.appsdk.source.AppDatabase/1.json @@ -0,0 +1,65 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "2e79a9bdd7c1e5de61e10c8203b81266", + "entities": [ + { + "tableName": "article", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `author` TEXT, `title` TEXT, `description` TEXT, `url` TEXT, `urlToImage` TEXT, `publishedAt` TEXT, `content` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER" + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT" + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT" + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT" + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT" + }, + { + "fieldPath": "urlToImage", + "columnName": "urlToImage", + "affinity": "TEXT" + }, + { + "fieldPath": "publishedAt", + "columnName": "publishedAt", + "affinity": "TEXT" + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + } + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '2e79a9bdd7c1e5de61e10c8203b81266')" + ] + } +} \ No newline at end of file From 18145ece226514bf6af69c89843de6b5213ec71c Mon Sep 17 00:00:00 2001 From: amirisback Date: Wed, 1 Oct 2025 15:43:21 +0700 Subject: [PATCH 3/3] Release v2.3.3 --- README.md | 8 ++++---- buildSrc/src/main/kotlin/ProjectSetting.kt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 522ba82..530033b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ This Is Latest Release - $version_release = 2.3.2 + $version_release = 2.3.3 What's New?? @@ -54,7 +54,7 @@ allprojects { ```groovy dependencies { // library frogo-sdk - implementation 'com.github.frogobox:frogo-sdk:2.3.2' + implementation 'com.github.frogobox:frogo-sdk:2.3.3' } ``` @@ -63,14 +63,14 @@ dependencies { ```groovy dependencies { // library frogo-sdk - implementation("com.github.frogobox:frogo-sdk:2.3.2") + implementation("com.github.frogobox:frogo-sdk:2.3.3") } ``` ####