{"id":21373301,"url":"https://github.com/frogobox/frogo-sdk","last_synced_at":"2025-07-13T07:33:08.769Z","repository":{"id":43533959,"uuid":"463917159","full_name":"frogobox/frogo-sdk","owner":"frogobox","description":"Frogo SDK - SDK Core for Easy Development","archived":false,"fork":false,"pushed_at":"2024-04-26T09:07:42.000Z","size":32462,"stargazers_count":17,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-04-26T10:24:24.072Z","etag":null,"topics":["android","android-library","frogo-sdk","kotlin","kotlin-library","rxjava","sdk-android","sdk-java"],"latest_commit_sha":null,"homepage":"https://frogobox.github.io/frogo-sdk/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/frogobox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null},"funding":{"github":"amirisback","patreon":null,"open_collective":null,"ko_fi":"amirisback","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":"https://saweria.co/amirisback"}},"created_at":"2022-02-26T17:14:58.000Z","updated_at":"2024-04-26T10:24:27.703Z","dependencies_parsed_at":"2023-02-19T15:31:42.670Z","dependency_job_id":"30d3375f-51ec-489e-97fa-c8f779e44f04","html_url":"https://github.com/frogobox/frogo-sdk","commit_stats":{"total_commits":143,"total_committers":1,"mean_commits":143.0,"dds":0.0,"last_synced_commit":"0a43860cf8f0c5a25487aaab993fd2b1bf44b2c2"},"previous_names":[],"tags_count":55,"template":false,"template_full_name":"frogobox/frogo-android-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frogobox%2Ffrogo-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frogobox%2Ffrogo-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frogobox%2Ffrogo-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frogobox%2Ffrogo-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frogobox","download_url":"https://codeload.github.com/frogobox/frogo-sdk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225866774,"owners_count":17536679,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-library","frogo-sdk","kotlin","kotlin-library","rxjava","sdk-android","sdk-java"],"created_at":"2024-11-22T08:27:14.605Z","updated_at":"2024-11-22T08:27:15.455Z","avatar_url":"https://github.com/frogobox.png","language":"Kotlin","readme":"![ScreenShoot Apps](https://raw.githubusercontent.com/amirisback/amirisback/master/docs/image/deprecated.png?raw=true)\n## DEPRECATED\n- Reason Deprecated, Merge library become single library\n- Please Using This : [deltadox-android](https://github.com/deltadox/deltadox-android)\n##\n\n![ScreenShoot Apps](https://raw.githubusercontent.com/frogobox/frogo-sdk/master/docs/image/ss_banner.png?raw=true)\n\n## About This Project (release 👷🔧️👷‍♀️⛏)\n\n[![](https://jitpack.io/v/frogobox/frogo-sdk.svg?style=flat-square)](https://jitpack.io/#frogobox/frogo-sdk)\n[![Android CI](https://github.com/frogobox/frogo-sdk/actions/workflows/android-ci.yml/badge.svg)](https://github.com/frogobox/frogo-sdk/actions/workflows/android-ci.yml)\n[![Scan with Detekt](https://github.com/frogobox/frogo-sdk/actions/workflows/detekt-analysis.yml/badge.svg)](https://github.com/frogobox/frogo-sdk/actions/workflows/detekt-analysis.yml)\n[![pages-build-deployment](https://github.com/frogobox/frogo-sdk/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/frogobox/frogo-sdk/actions/workflows/pages/pages-build-deployment)\n\n- SDK for anything your problem to make easier developing android apps\n- Available for android and desktop\n- Privacy Policy [Click Here](https://github.com/frogobox/frogo-sdk/blob/master/PRIVACY-POLICY.md)\n- License [Click Here](https://github.com/frogobox/frogo-sdk/blob/master/LICENSE)\n\n## ScreenShoot\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eSS 1\u003c/th\u003e\n    \u003cth\u003eSS 2\u003c/th\u003e\n    \u003cth\u003eSS 3\u003c/th\u003e\n    \u003cth\u003eSS 4\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"320px\" src=\"docs/image/main/ss_1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"320px\" src=\"docs/image/main/ss_2.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"320px\" src=\"docs/image/main/ss_3.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"320px\" src=\"docs/image/main/ss_4.gif\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n## Version Release\n\nThis Is Latest Release\n\n    $version_release = 2.2.9\n\nWhat's New??\n\n    * SDK Android and Desktop *\n    * Update latest version library *\n    * Migrate to libs.version.toml *\n    \n\n## Download this project\n\n### Step 1. Add the JitPack repository to your build file (build.gradle : Project)\n\n#### \u003cOption 1\u003e Groovy Gradle\n\n    // Add it in your root build.gradle at the end of repositories:\n\n    allprojects {\n        repositories {\n            ...\n            maven { url 'https://jitpack.io' }\n        }\n    }\n\n#### \u003cOption 2\u003e Kotlin DSL Gradle\n\n```kotlin\n// Add it in your root build.gradle.kts at the end of repositories:\n\nallprojects {\n    repositories {\n        ...\n        maven(\"https://jitpack.io\")\n    }\n}\n```\n\n### Step 2. Add the dependency (build.gradle : Module)\n\n#### \u003cOption 1\u003e Groovy Gradle\n\n```groovy\ndependencies {\n    // library frogo-sdk\n    implementation 'com.github.frogobox:frogo-sdk:2.2.9'\n\n    // library frogo-sdk for desktop\n    implementation 'com.github.frogobox.frogo-sdk:core-sdk:2.2.9'\n}\n```\n\n#### \u003cOption 2\u003e Kotlin DSL Gradle\n\n```groovy\ndependencies {\n    // library frogo-sdk\n    implementation(\"com.github.frogobox:frogo-sdk:2.2.9\")\n\n    // library frogo-sdk for desktop\n    implementation(\"com.github.frogobox.frogo-sdk:core-sdk:2.2.9\")\n}\n```\n\n#### \u003cOption 3\u003e libs.versions.toml\n```yml\n[versions]\nfrogosdk = \"2.2.9\"\n\n[libraries]\nfrogo-sdk = { group = \"com.github.frogobox\", name = \"frogo-sdk\", version.ref = \"frogosdk\" }\nfrogo-sdk-core = { group = \"com.github.frogobox.frogo-sdk\", name = \"core-sdk\", version.ref = \"frogosdk\" }\n\ndependencies {\n    // library frogo-sdk\n    implementation(libs.frogo.sdk)\n\n    // library frogo-sdk for desktop\n    implementation(libs.frogo.sdk.core)\n}\n```\n### Step 3. Function from this SDK\n\n#### All Class SDK (android)\n\n```kotlin\nFrogoActivity\nFrogoApplication\nFrogoComposeActivity\nFrogoFragment\nFrogoFunc\nFrogoMusic\nFrogoMutableLiveData\nFrogoNavigation\nFrogoPagerHelper\nFrogoPiracyActivity\nFrogoPreference\nFrogoSinglePreference\nFrogoViewModel\n```\n\n### All Class SDK (desktop \u0026 android)\n\n```kotlin\nFrogoApiClient\nFrogoApiModel\nFrogoApiObserver\nFrogoConstant\nFrogoDataResponse\nFrogoDate\nFrogoLocalObserver\nFrogoStateResponse\nIFrogoDate\n```\n\n#### FrogoActivity\n\n```kotlin\nfun setupDetailActivity(title: String)\n\nfun setupChildFragment(frameId: Int, fragment: Fragment)\n\nfun showToast(message: String)\n\nfun setupEmptyView(view: View, isEmpty: Boolean)\n\nfun setupProgressView(view: View, isProgress: Boolean)\n\nfun checkExtra(extraKey: String): Boolean\n\nfun \u003cModel\u003e FrogoFragmentNewInstance(\n    fragment: FrogoFragment\u003c*\u003e,\n    argumentKey: String,\n    extraDataResult: Model\n)\n\nfun isNetworkConnected(): Boolean\n\nfun setupFullScreen()\n\nfun setupHideSystemUI()\n\nfun shareApp(packageName: String, appName: String)\n\nfun rateApp(packageName: String)\n```\n\n#### FrogoFragment\n\n```kotlin\nfun setupChildFragment(frameId: Int, fragment: Fragment)\n\nfun checkArgument(argsKey: String): Boolean\n\nfun setupEmptyView(view: View, isEmpty: Boolean)\n\nfun setupProgressView(view: View, isProgress: Boolean)\n\nfun showToast(message: String)\n\nfun \u003cModel\u003e frogoNewInstance(argsKey: String, data: Model)\n```\n\n### Ext Function\n\n#### FrogoRetrofitExt.kt\n\n```kotlin\n\n// Single Api Request\nfun \u003cT : Any\u003e Call\u003cT\u003e.doApiRequest(callback: FrogoDataResponse\u003cT\u003e) {\n\n    callback.onShowProgress()\n    enqueue(object : Callback\u003cT\u003e {\n        override fun onResponse(call: Call\u003cT\u003e, response: Response\u003cT\u003e) {\n            response.body()?.let { callback.onSuccess(it) }\n            callback.onHideProgress()\n        }\n\n        override fun onFailure(call: Call\u003cT\u003e, t: Throwable) {\n            callback.onFailed(500, t.localizedMessage)\n            callback.onHideProgress()\n        }\n    })\n\n}\n\n```\n\n#### FrogoRxJavaObservableExt.kt\n\n```kotlin\n\n// Single Api Request with scheduler\nfun \u003cT : Any\u003e Observable\u003cT\u003e.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse\u003cT\u003e) {\n    subscribeOn(Schedulers.io())\n        .doOnSubscribe { callback.onShowProgress() }\n        .doAfterTerminate { callback.onHideProgress() }\n        .observeOn(scheduler)\n        .subscribe(object : FrogoApiObserver\u003cT\u003e() {\n            override fun onSuccess(data: T) {\n                callback.onSuccess(data)\n            }\n\n            override fun onFailure(code: Int, errorMessage: String) {\n                callback.onFailed(code, errorMessage)\n            }\n        })\n}\n\n// -------------------------------------------------------------------------------------------------\n\n// Single Api Request\nfun \u003cT : Any\u003e Observable\u003cT\u003e.doApiRequest(callback: FrogoDataResponse\u003cT\u003e) {\n    doOnSubscribe { callback.onShowProgress() }\n        .doAfterTerminate { callback.onHideProgress() }\n        .subscribe(object : FrogoApiObserver\u003cT\u003e() {\n            override fun onSuccess(data: T) {\n                callback.onSuccess(data)\n            }\n\n            override fun onFailure(code: Int, errorMessage: String) {\n                callback.onFailed(code, errorMessage)\n            }\n        })\n}\n\n```\n\n#### FrogoContextActivityExt.kt\n\n```kotlin\n\ninline fun \u003creified ClassActivity\u003e Context.singleStartActivity() {\n    FLog.d(\"Activity : ${ClassActivity::class.java.simpleName}\")\n    startActivity(Intent(this, ClassActivity::class.java))\n}\n\n// -------------------------------------------------------------------------------------------------\n\ninline fun \u003creified ClassActivity, reified Model\u003e Context.singleStartActivity(\n    extraKey: String,\n    data: Model\n) {\n    val intent = Intent(this, ClassActivity::class.java)\n    val extraData = Gson().toJson(data)\n    intent.putExtra(extraKey, extraData)\n    FLog.d(\"Activity : ${ClassActivity::class.java.simpleName}\")\n    FLog.d(\"Data     : Extra Data (${Model::class.java.simpleName}) : $extraData\")\n    startActivity(intent)\n}\n\n// -------------------------------------------------------------------------------------------------\n\ninline fun \u003creified Model\u003e Activity.singleGetExtraData(extraKey: String): Model {\n    val extraIntent = intent.getStringExtra(extraKey)\n    return Gson().fromJson(extraIntent, Model::class.java)\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun Context.singleStartActivityShareApp(subject: String, text: String) {\n    val intent = Intent(Intent.ACTION_SEND)\n    intent.type = \"text/plain\"\n    intent.putExtra(Intent.EXTRA_SUBJECT, subject)\n    intent.putExtra(Intent.EXTRA_TEXT, text)\n    FLog.d(\"$TAG : Subject Share App : $subject\")\n    FLog.d(\"$TAG : Message Share App : $text\")\n    startActivity(Intent.createChooser(intent, subject))\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun Context.singleStartActivityOpenApp(url: String) {\n    FLog.d(\"$TAG : Url : $url\")\n    startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))\n}\n\n```\n\n#### FrogoContextFragmentExt.kt\n\n```kotlin\n\nfun \u003cModel\u003e Fragment.singleNewInstance(argsKey: String, data: Model) {\n    val argsData = Gson().toJson(data)\n    val bundleArgs = Bundle().apply {\n        putString(argsKey, argsData)\n    }\n    this.arguments = bundleArgs\n}\n\n// -------------------------------------------------------------------------------------------------\n\ninline fun \u003creified Model\u003e Fragment.singleGetInstance(argsKey: String): Model {\n    val argsData = this.arguments?.getString(argsKey)\n    return Gson().fromJson(argsData, Model::class.java)\n}\n\n```\n\n#### FrogoImageViewExt.kt\n\n```kotlin\n\nfun ImageView.glideLoad(data: Any?) {\n    FLog.d(\"$TAG : Params : $data\")\n    FLog.d(\"$TAG : Glide Load Ext\")\n    Glide.with(context).load(data).into(this)\n}\n\n```\n\n#### FrogoViewExt.kt\n\n```kotlin\n\nfun View.visible() {\n    FLog.d(\"$TAG : View Visible\")\n    visibility = View.VISIBLE\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun View.gone() {\n    FLog.d(\"$TAG : View Gone\")\n    visibility = View.GONE\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun View.invisible() {\n    FLog.d(\"$TAG : View Invisible\")\n    visibility = View.INVISIBLE\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun View.progressViewHandle(isProgressState: Boolean) {\n    FLog.d(\"$TAG : isProgressState \u003e\u003e $isProgressState\")\n    if (isProgressState) {\n        visible()\n    } else {\n        gone()\n    }\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun View.emptyViewHandle(isEmptyState: Boolean) {\n    FLog.d(\"$TAG : isEmptyState \u003e\u003e $isEmptyState\")\n    if (isEmptyState) {\n        visible()\n    } else {\n        gone()\n    }\n}\n\n```\n\n#### FrogoContextExt.kt\n\n```kotlin\n\nfun Context.getAppVersionCode(): Int? {\n    try {\n        return packageManager?.getPackageInfo(packageName, 0)\n            ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }\n    } catch (ex: Exception) {\n        FLog.e(\"$TAG : ${ex.message.orEmpty()}\")\n    }\n\n    return null\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun Context.showToast(\n    message: String,\n    duration: Int = Toast.LENGTH_SHORT\n) {\n    Toast.makeText(this, message, duration).show()\n}\n\n// -------------------------------------------------------------------------------------------------\n\nfun Context.hasCameraPermission(): Boolean =\n    ContextCompat.checkSelfPermission(\n        this,\n        Manifest.permission.CAMERA\n    ) == PackageManager.PERMISSION_GRANTED\n\n// -------------------------------------------------------------------------------------------------\n\nfun Context.hasReadExtStoragePermission(): Boolean {\n    return ContextCompat.checkSelfPermission(\n        this,\n        Manifest.permission.READ_EXTERNAL_STORAGE\n    ) == PackageManager.PERMISSION_GRANTED\n}\n\nfun Context.hasWriteExtStoragePermission(): Boolean {\n    return ContextCompat.checkSelfPermission(\n        this,\n        Manifest.permission.WRITE_EXTERNAL_STORAGE\n    ) == PackageManager.PERMISSION_GRANTED\n}\n\n```\n\n## Added Function\n\n## FrogoLog\n\n- SDK for your Log problem to make easier developing android apps\n- frogo-log is Long Term Service\n- Line number show\n- Toast for easy develop and debug\n\n### Screenshoot Result\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eSS 1\u003c/th\u003e\n        \u003cth\u003eSS 2\u003c/th\u003e\n        \u003cth\u003eSS 3\u003c/th\u003e\n        \u003cth\u003eSS 4\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/log/ss-1.png\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/log/ss-2.png\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/log/ss-3.png\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/log/ss-4.png\"\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003ctable\u003e\n\n### Screenshoot Library Sample\n\n![ScreenShoot Apps](docs/image/log/ss_result_1.png?raw=true)\n\n### FrogoLog (with line code)\n\n```kotlin\n// Function Log Debug\nFrogoLog.d(\"Debug\")\n\n// Function Log Info\nFrogoLog.i(\"Info\")\n\n// Function Log Verbose\nFrogoLog.v(\"Verbose\")\n\n// Function Log Warn\nFrogoLog.w(\"Warn\")\n\n// Function Log Error\nFrogoLog.e(\"Error\")\n\n// Function Log Simple Debug without message params\nFrogoLog.d()\n\n```\n\n### FrogoLog (with line code and Toast)\n\n```kotlin\n// Function Log Debug (adding context params)\nFrogoLog.d(\"Debug\", this@MainActivity)\n\n// Function Log Info (adding context params)\nFrogoLog.i(\"Info\", this@MainActivity)\n\n// Function Log Verbose\nFrogoLog.v(\"Verbose\", this@MainActivity)\n\n// Function Log Warn (adding context params)\nFrogoLog.w(\"Warn\", this@MainActivity)\n\n// Function Log Error (adding context params)\nFrogoLog.e(\"Error\", this@MainActivity)\n\n// Function Log Simple Debug without message params\nFrogoLog.d(this@MainActivity)\n```\n\n### FLog (without line code)\n\n```kotlin\n// Function Log Debug\nFLog.d(\"Debug\")\n\n// Function Log Info\nFLog.i(\"Info\")\n\n// Function Log Verbose\nFLog.v(\"Verbose\")\n\n// Function Log Warn\nFLog.w(\"Warn\")\n\n// Function Log Error\nFLog.e(\"Error\")\n\n// Function Log Simple Debug without message params\nFLog.d()\n```\n\n### Flog (without line code with toast)\n\n```kotlin\n// Function Log Debug (adding context params)\nFLog.d(\"Debug\", this@MainActivity)\n\n// Function Log Info (adding context params)\nFLog.i(\"Info\", this@MainActivity)\n\n// Function Log Verbose\nFLog.v(\"Verbose\", this@MainActivity)\n\n// Function Log Warn (adding context params)\nFLog.w(\"Warn\", this@MainActivity)\n\n// Function Log Error (adding context params)\nFLog.e(\"Error\", this@MainActivity)\n\n// Function Log Simple Debug without message params\nFLog.d(this@MainActivity)\n```\n\n### Result FrogoLog\n\n![ScreenShoot Apps](docs/image/log/ss_result_2.png?raw=true)\n\n## FrogoNotification\n\n- SDK for your notification problem to make easier developing android apps\n- frogo-notification is under huge large development\n- Notification with singleton method\n- Simple and eazy to use\n- With many feature\n- Full documentation\n- Custom Layout Notification\n\n### Screen shot Sample\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eSimple Notification\u003c/th\u003e\n        \u003cth\u003eStack Notification\u003c/th\u003e\n        \u003cth\u003eCustom Notification (1)\u003c/th\u003e\n        \u003cth\u003eCustom Notification (2)\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/notification/ss_simple_notif.gif\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/notification/ss_stack_notif.gif\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/notification/ss_custom_layout.gif\"\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"docs/image/notification/ss_reply_notif.gif\"\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n```kotlin\nFrogoNotification.Inject(this) // Intialize for Context\n    .setChannelId(CHANNEL_ID) // Intialize for Channel ID\n    .setChannelName(CHANNEL_NAME) // Initialize for Channel Name\n    .setContentIntent(pendingIntent) // Initialize for Content Intent\n    .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon\n    .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon\n    .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title\n    .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text\n    .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text\n    .setupAutoCancel() // Initialize for Auto Cancel\n    .build() // Build the Frogo Notification\n    .launch(NOTIFICATION_ID) // Notify the Frogo Notification\n```\n\n### Simple Notification\n\n```kotlin\nFrogoNotification.Inject(this) // Intialize for Context\n    .setChannelId(CHANNEL_ID) // Intialize for Channel ID\n    .setChannelName(CHANNEL_NAME) // Initialize for Channel Name\n    .setContentIntent(pendingIntent) // Initialize for Content Intent\n    .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon\n    .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon\n    .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title\n    .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text\n    .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text\n    .setupAutoCancel() // Initialize for Auto Cancel\n    .build() // Build the Frogo Notification\n    .launch(NOTIFICATION_ID) // Notify the Frogo Notification\n```\n\n### Custom Layout (NEW FEATURE)\n\n```kotlin\nval collapsed = object : FrogoNotifCustomContentViewListener {\n    override fun setupCustomView(): Int {\n        return R.layout.notification_collapsed\n    }\n\n    override fun setupComponent(context: Context, customView: RemoteViews) {\n        customView.apply {\n            setTextViewText(R.id.text_view_collapsed_1, \"Hello World!\")\n        }\n    }\n}\n\nval expanded = object : FrogoNotifCustomContentViewListener {\n    override fun setupCustomView(): Int {\n        return R.layout.notification_expanded\n    }\n\n    override fun setupComponent(context: Context, customView: RemoteViews) {\n        customView.apply {\n            setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)\n            setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)\n        }\n    }\n}\n\nFrogoNotification.Inject(this) // Intialize for Context\n    .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID\n    .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name\n    .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon\n    .setCustomContentView(collapsed)\n    .setCustomBigContentView(expanded)\n    .build() // Build the Frogo Notification\n    .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification\n```\n\n### With Action Replay\n\n```kotlin\nFrogoNotification.Inject(this)\n    .setChannelId(CHANNEL_ID)\n    .setChannelName(CHANNEL_NAME as String)\n    .setSmallIcon(R.drawable.ic_frogo_notif)\n    .setContentTitle(getString(R.string.notif_title))\n    .setContentText(getString(R.string.notif_content))\n    .setupShowWhen()\n    .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {\n        override fun setRemoteInputResultKey(): String {\n            return KEY_REPLY\n        }\n\n        override fun setRemoteInputLabel(): String {\n            return getString(R.string.notif_action_reply)\n        }\n\n        override fun setActionIcon(): Int {\n            return R.drawable.ic_frogo_send\n        }\n\n        override fun setActionTitle(): String {\n            return getString(R.string.notif_action_reply)\n        }\n\n        override fun setActionIntent(): PendingIntent? {\n            return getReplyPendingIntent()\n        }\n\n        override fun setAllowGeneratedReplies(): Boolean {\n            return true\n        }\n    })\n    .build()\n    .launch(mNotificationId)\n```\n\n### With Inbox Style (Stack)\n\n```kotlin\nval frogoNotification = FrogoNotification.Inject(this)\n    .setChannelId(CHANNEL_ID)\n    .setChannelName(CHANNEL_NAME)\n    .setSmallIcon(R.drawable.ic_frogo_email)\n    .setGroup(GROUP_KEY_EMAILS)\n    .setContentIntent(pendingIntent)\n    .setupAutoCancel()\n\n// Check if NotificationID is smaller than Max Notif\nif (idNotification \u003c MAX_NOTIFICATION) {\n\n    stackNotif[idNotification].message?.let {\n        frogoNotification\n            .setContentTitle(\"New Email from \" + stackNotif[idNotification].sender)\n            .setContentText(it)\n            .setLargeIcon(R.drawable.ic_frogo_notif)\n    }\n\n} else {\n\n    frogoNotification\n        .setContentTitle(\"$idNotification new emails\")\n        .setContentText(\"mail@frogobox.com\")\n        .setGroupSummary()\n        .setupInboxStyle(object : FrogoNotifInboxStyleListener {\n            override fun addLine1(): String {\n                return \"New Email from \" + stackNotif[idNotification].sender\n            }\n\n            override fun addLine2(): String {\n                return \"New Email from \" + stackNotif[idNotification - 1].sender\n            }\n\n            override fun setBigContentTitle(): String {\n                return \"$idNotification new emails\"\n            }\n\n            override fun setSummaryText(): String {\n                return \"mail@frogobox\"\n            }\n        })\n\n}\n\nfrogoNotification\n    .build()\n    .launch(idNotification)\n```\n\n### With Frogo Style\n\n```kotlin\nFrogoNotification.Inject(this) // Intialize for Context\n    .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon\n    .setupWithFrogoStyle()\n    .build() // Build the Frogo Notification\n    .launch(NOTIFICATION_ID) // Notify the Frogo Notification\n```\n\n### For Documentation\n\n- Method with description [Click Here](https://github.com/amirisback/frogo-notification/blob/master/frogonotification/src/main/java/com/frogobox/frogonotification/IFrogoNotification.kt)\n- Simple Notification [Click Here](https://github.com/amirisback/frogo-notification/blob/master/app/src/main/java/com/frogobox/notification/simple/MainActivity.kt)\n- With Action Replay [Click Here](https://github.com/amirisback/frogo-notification/blob/master/app/src/main/java/com/frogobox/notification/custom/NotificationService.kt)\n- With Inbox Style (Stack) [Click Here](https://github.com/amirisback/frogo-notification/blob/master/app/src/main/java/com/frogobox/notification/stack/StackNotifActivity.kt)\n- Piracy Checker [Click Here](https://github.com/javiersantos/PiracyChecker)\n\n## Colaborator\n\nVery open to anyone, I'll write your name under this, please contribute by sending an email to me\n\n- Mail To faisalamircs@gmail.com\n- Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]\n- Example : Github_amirisback_kotlin_admob-helper-implementation\n\nName Of Contribute\n\n- Muhammad Faisal Amir\n- Waiting List\n- Waiting List\n\nWaiting for your contribute\n\n## Attention !!!\n\n- Please enjoy and don't forget fork and give a star\n- Don't Forget Follow My Github Account\n\n![ScreenShoot Apps](docs/image/mad_score.png?raw=true)\n","funding_links":["https://github.com/sponsors/amirisback","https://ko-fi.com/amirisback","https://saweria.co/amirisback"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrogobox%2Ffrogo-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrogobox%2Ffrogo-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrogobox%2Ffrogo-sdk/lists"}