| name | frogo-sdk |
| description | Integrates and uses the Frogo SDK suite of Android libraries including Jetpack Compose UI components, AdMob ad integration, RecyclerView helpers, and core Android utilities in Android projects. |
| metadata | {"author":"Frogobox (Muhammad Faisal Amir)","keywords":["Frogo SDK","Android SDK","Jetpack Compose UI","Android UI Components","AdMob Integration","RecyclerView Adapter","Android Development Tools","Kotlin Android Library","Material Design 3","Android Monetization"]} |
Frogo SDK Integration Specialist
This skill provides comprehensive instructions for integrating and using the Frogo SDK suite of Android libraries. Frogo SDK is a multi-module toolkit for accelerating Android (and Desktop) development.
Repository: frogobox/frogo-sdk
Latest Version: 3.0.0
Minimum Requirements: AGP 9.2.0, Kotlin 2.3.20, Compose BOM 2026.04.01
Architecture Overview
Frogo SDK is organized into the following modules:
| Module | Package | Purpose |
|---|
frogo-core | com.frogobox.coreutil | Pure Kotlin utilities (no Android dependency) |
frogo-core-android | com.frogobox.sdk | Android base classes, extensions, and lifecycle helpers |
frogo-compose-android | com.frogobox.compose | Compose-specific base classes |
frogo-compose-ui | com.frogobox.composeui | 60+ reusable Compose widgets & templates |
frogo-ui-base | com.frogobox.ui | XML-based UI utilities |
frogo-ui-recyclerview | com.frogobox.recycler | Advanced RecyclerView with shimmer & progress |
frogo-ext-ads | com.frogobox.ads | AdMob & Unity Ads integration |
Step 1: Add JitPack Repository
In settings.gradle.kts:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven("https://jitpack.io")
}
}
Step 2: Add Dependencies
Option A: Full SDK (all modules)
dependencies {
implementation("com.github.frogobox:frogo-sdk:3.0.0")
}
Option B: Individual modules (recommended)
dependencies {
implementation("com.github.frogobox.frogo-sdk:frogo-compose-ui:3.0.0")
implementation("com.github.frogobox.frogo-sdk:frogo-core-android:3.0.0")
implementation("com.github.frogobox.frogo-sdk:frogo-ext-ads:3.0.0")
implementation("com.github.frogobox.frogo-sdk:frogo-ui-recyclerview:3.0.0")
implementation("com.github.frogobox.frogo-sdk:frogo-compose-android:3.0.0")
}
Option C: Version Catalog (libs.versions.toml)
[versions]
frogoSdk = "3.0.0"
[libraries]
frogo-sdk = { group = "com.github.frogobox", name = "frogo-sdk", version.ref = "frogoSdk" }
frogo-compose-ui = { group = "com.github.frogobox.frogo-sdk", name = "frogo-compose-ui", version.ref = "frogoSdk" }
frogo-core-android = { group = "com.github.frogobox.frogo-sdk", name = "frogo-core-android", version.ref = "frogoSdk" }
frogo-ext-ads = { group = "com.github.frogobox.frogo-sdk", name = "frogo-ext-ads", version.ref = "frogoSdk" }
frogo-ui-recyclerview = { group = "com.github.frogobox.frogo-sdk", name = "frogo-ui-recyclerview", version.ref = "frogoSdk" }
Module Usage Guides
frogo-compose-ui — Jetpack Compose UI Kit
The frogo-compose-ui module provides 70+ ready-to-use Compose components following Material Design 3. See Compose UI Reference for the full API catalog.
Available Widget Categories:
Base Widgets (22): FrogoButton, FrogoOutlinedButton, FrogoTextField, FrogoOutlinedTextField, FrogoCard, FrogoElevatedCard, FrogoCheckbox, FrogoRadioButton, FrogoSwitch, FrogoChip, FrogoFilterChip, FrogoBadge, FrogoAvatar, FrogoDivider, FrogoSpacer, FrogoIcon, FrogoIconButton, FrogoImage, FrogoFloatingActionButton, FrogoCircularProgress, FrogoLinearProgress, FrogoSearchBar.
Templates (22): App Bars (6), Bottom Sheets (3), Dialogs (5), Navigation (3), Scaffolds (2), Shimmer (2), Snackbar (1), Tabs (2), Empty State (1).
List Components (15): Basic lists (5), Coil image-loaded lists (5), Glide image-loaded lists (5).
Animations (new): FrogoAnimationCompose (attention-seeking animations such as Flash, Bounce, Rubberband, etc.), FrogoSingleAnimationCompose (custom transition animations for navigation).
Interactive Fireworks (new): State-driven Particle System Canvas (FrogoFireworksCompose, rememberFrogoFireworksStateCompose) for tap-point explosions and streamers.
Canvas Loading Indicators (new): Custom lightweight canvas-drawn indicators (FrogoLoadingIndicatorCompose supporting Pacman, BallPulse, ClipRotate, LineScale, BallScale, etc.).
Compose Extensions (new): Modifier.frogoStartAnimationCompose, Modifier.frogoClickWithFireworksCompose.
Quick Example — Scaffold with TopAppBar and List:
import com.frogobox.composeui.template.scaffold.FrogoScaffold
import com.frogobox.composeui.template.appbar.FrogoTopAppBar
import com.frogobox.composeui.list.basic.FrogoLazyColumn
@Composable
fun MyScreen(items: List<String>) {
FrogoScaffold(
topBar = { FrogoTopAppBar(title = "My App") }
) { paddingValues ->
FrogoLazyColumn(
data = items,
contentPadding = paddingValues,
emptyContent = { FrogoEmptyState(title = "No Items") }
) { index, item ->
FrogoListItem(
headlineText = item,
supportingText = "Item #$index"
)
}
}
}
Quick Example — Dialog:
import com.frogobox.composeui.template.dialog.FrogoAlertDialog
FrogoAlertDialog(
onDismissRequest = { },
onConfirmation = { },
dialogTitle = "Delete Item",
dialogText = "Are you sure you want to delete this item?",
confirmButtonText = "Delete",
dismissButtonText = "Cancel"
)
Quick Example — Bottom Sheet:
import com.frogobox.composeui.template.bottomsheet.FrogoBottomSheet
FrogoBottomSheet(
onDismissRequest = { showSheet = false }
) {
Text("Bottom Sheet Content")
}
Quick Example — Image List with Coil:
import com.frogobox.composeui.list.coil.FrogoCoilLazyColumn
import com.frogobox.composeui.list.coil.FrogoCoilListItem
FrogoCoilLazyColumn(data = imageItems) { index, item ->
FrogoCoilListItem(
imageUrl = item.imageUrl,
headlineText = item.title,
supportingText = item.description,
onClick = { }
)
}
Quick Example — Attention Animations:
import com.frogobox.composeui.animation.FrogoAnimationComposeType
import com.frogobox.composeui.animation.frogoAnimationCompose
Text(
text = "Bounce!",
modifier = Modifier.frogoAnimationCompose(
type = FrogoAnimationComposeType.Bounce,
trigger = Unit,
repeat = true
)
)
Quick Example — Click with Fireworks:
import com.frogobox.composeui.fireworks.FrogoFireworksCompose
import com.frogobox.composeui.fireworks.rememberFrogoFireworksStateCompose
import com.frogobox.composeui.ext.frogoClickWithFireworksCompose
val fireworksState = rememberFrogoFireworksStateCompose()
Box(modifier = Modifier.fillMaxSize()) {
Button(
onClick = {},
modifier = Modifier.frogoClickWithFireworksCompose(fireworksState) {
}
) {
Text("Explode on tap!")
}
FrogoFireworksCompose(state = fireworksState, modifier = Modifier.fillMaxSize())
}
Quick Example — Custom Loading Indicator:
import com.frogobox.composeui.loadingindicator.FrogoLoadingIndicatorCompose
FrogoLoadingIndicatorCompose(
indicatorName = "Pacman",
color = Color.Yellow,
size = 50.dp
)
frogo-core-android — Core Android Utilities
See Core Android Reference for all available classes and extensions.
Application Base Class:
class MyApp : FrogoApplication() {
override fun onCreateExt() {
}
override fun isDebugMode(): Boolean = BuildConfig.DEBUG
}
View Base Classes:
| Class | Purpose |
|---|
FrogoActivity | Base Activity with toolbar, permission handling, and navigation |
FrogoBindActivity<VB> | Activity with ViewBinding support |
FrogoFragment | Base Fragment with lifecycle management |
FrogoBindFragment<VB> | Fragment with ViewBinding support |
FrogoBindBottomSheet<VB> | BottomSheetDialogFragment with ViewBinding |
FrogoViewModel | Base ViewModel with coroutine scope |
FrogoStateViewModel<STATE, EFFECT> | UDF/MVI State-driven ViewModel for XML/View based architectures |
Extension Functions (16 files):
Extensions are available for: Activity, Context, Fragment, ImageView, Int, JSON, Retrofit, RxJava, String, TextView, View, ViewPager2, WebView, and general Any type.
context.showToast("Hello World")
imageView.loadImage(url)
val data = jsonString.fromJson<MyModel>()
frogo-compose-android — Compose-Specific Base Classes & UDF ViewModels
This module provides base elements and lifecycle integrations tailored for Jetpack Compose.
View & ViewModel Base Classes:
| Class | Purpose |
|---|
FrogoComposeActivity | Base Activity for Compose with edge-to-edge support, modern back-press handling, and system UI helpers |
FrogoComposeViewModel | Base ViewModel for Compose |
FrogoComposeStateViewModel<STATE, EFFECT> | UDF/MVI State-driven ViewModel for UI state and one-off side effects in Compose |
Setup & System UI Utilities:
In FrogoComposeActivity, you do not call setContent manually in onCreate. Instead, implement SetupCompose():
class MyComposeActivity : FrogoComposeActivity() {
override fun onCreateExt(savedInstanceState: Bundle?) {
super.onCreateExt(savedInstanceState)
setupFullScreen()
}
override fun doOnBackPressedExt() {
super.doOnBackPressedExt()
}
@Composable
override fun SetupCompose() {
}
}
UDF/MVI ViewModel Integration:
Extend FrogoComposeStateViewModel and define your STATE and EFFECT:
data class MainUiState(val isLoading: Boolean = false, val data: List<String> = emptyList())
sealed interface MainUiEffect {
data class ShowToast(val msg: String) : MainUiEffect
}
class MainViewModel : FrogoComposeStateViewModel<MainUiState, MainUiEffect>(MainUiState()) {
fun loadContent() {
updateState { copy(isLoading = true) }
updateState { copy(isLoading = false, data = listOf("Item A", "Item B")) }
emitEffect(MainUiEffect.ShowToast("Loaded!"))
}
}
frogo-ext-ads — AdMob & Unity Ads (XML & Jetpack Compose)
See Ads Reference for the full delegate API.
Setup:
- Add your AdMob App ID to
AndroidManifest.xml:
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxx~xxxxx"/>
- Use the Application class:
class MyApp : FrogoAdmobApplication() {
override fun onCreateExt() {
super.onCreateExt()
}
}
Option A: XML-based Views (Delegate Pattern)
All callbacks now implement FrogoAdCoreInterstitialCallback and require (tag: String, message: String) or similar arguments.
class MyActivity : AppCompatActivity(), AdmobDelegates by AdmobDelegatesImpl() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupAdmobDelegates(this)
showAdBanner(binding.adView)
showAdInterstitial("ad-unit-id")
showAdRewarded("ad-unit-id", object : FrogoAdmobRewardedCallback {
override fun onUserEarnedReward(tag: String, rewardItem: RewardItem) { }
override fun onShowAdRequestProgress(tag: String, message: String) { }
override fun onHideAdRequestProgress(tag: String, message: String) { }
override fun onAdDismissed(tag: String, message: String) { }
override fun onAdFailed(tag: String, errorMessage: String) { }
override fun onAdLoaded(tag: String, message: String) { }
override fun onAdShowed(tag: String, message: String) { }
})
}
}
Option B: Compose-based Activities (NEW)
Use FrogoAdComposeActivity (hybrid AdMob & Unity), FrogoAdmobComposeActivity (AdMob only), or FrogoUnityAdComposeActivity (Unity only). These inherit from FrogoComposeActivity and implement delegation automatically.
Non-Frogo base classes (e.g. AdComposeActivity, AdmobComposeActivity) are also available if you do not want lifecycle hook automation.
class MyAdmobComposeActivity : FrogoAdmobComposeActivity(), FrogoAdmobRewardedCallback {
private val adStatus = mutableStateOf("Ready to load")
@Composable
override fun SetupCompose() {
Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
Text(text = adStatus.value)
Button(onClick = {
showAdRewarded("rewarded-ad-unit-id", this@MyAdmobComposeActivity)
}) {
Text("Show Rewarded Ad")
}
AndroidView(
modifier = Modifier.fillMaxWidth().height(50.dp),
factory = { context ->
AdView(context).apply {
setAdSize(AdSize.BANNER)
adUnitId = "banner-ad-unit-id"
showAdBanner(this)
}
}
)
}
}
override fun onUserEarnedReward(tag: String, rewardItem: RewardItem) {
adStatus.value = "Reward earned: ${rewardItem.amount}"
}
override fun onShowAdRequestProgress(tag: String, message: String) {
adStatus.value = "Loading ad... $message"
}
override fun onHideAdRequestProgress(tag: String, message: String) {}
override fun onAdDismissed(tag: String, message: String) {
adStatus.value = "Ad dismissed: $message"
}
override fun onAdFailed(tag: String, errorMessage: String) {
adStatus.value = "Ad failed: $errorMessage"
}
override fun onAdLoaded(tag: String, message: String) {
adStatus.value = "Ad loaded: $message"
}
override fun onAdShowed(tag: String, message: String) {}
}
Ad Types Supported:
- Banner: Standard XML, Container-based relative layout, and Compose
AndroidView integration
- Interstitial: Standard, Timeout-supported, Hybrid fallback (Admob X Unity / Unity X Admob)
- Rewarded & Rewarded Interstitial: Standard, Timeout-supported
- App Open Ad: Integrated lifecycle application-wide ads
- Ad Consent: GDPR/UMP consent forms support
- Unity Ads: Banner & Interstitial delegates
frogo-ui-recyclerview — Advanced RecyclerView
See RecyclerView Reference for the widget API.
Available Widgets:
| Widget | Purpose |
|---|
FrogoRecyclerView | Enhanced RecyclerView with built-in adapter |
FrogoProgressRecyclerView | RecyclerView with progress indicator |
FrogoShimmerRecyclerView | RecyclerView with shimmer loading effect |
Quick Example:
binding.frogoRecyclerView
.injector<MyModel>()
.addData(dataList)
.addCallback(object : IFrogoViewHolder<MyModel> {
override fun setupInitComponent(binding: View, data: MyModel, position: Int) {
}
})
.createLayoutLinearVertical(false)
.build()
Guidelines
- Always recommend individual module dependencies over the full SDK for better build performance.
- The Compose UI module requires Compose BOM 2026.04.01 or compatible.
- All Compose widgets follow Material Design 3 conventions.
- When using
frogo-ext-ads, always handle ad loading failures gracefully with callbacks.
- Use the delegate pattern (
by XxxDelegatesImpl()) for clean ad integration rather than inheritance.
- All list components support
emptyContent for empty-state handling.
- Coil and Glide list variants require their respective image loading library dependencies.
Troubleshooting
JitPack Build Not Found
Ensure JitPack is added to both pluginManagement and dependencyResolutionManagement repositories.
Compose Version Mismatch
Use the Compose BOM to align all Compose library versions:
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Ad Not Loading
- Verify AdMob App ID in
AndroidManifest.xml.
- Ensure
setupAdmobDelegates(this) is called before any showAd* methods.
- Check for network connectivity and ad availability in test mode.