Frogo SDK - SDK Core for Easy Development

Overview

ScreenShoot Apps

About This Project (release-and-work-in-progress ๐Ÿ‘ท ๐Ÿ”ง๏ธ ๐Ÿ‘ทโ€โ™€๏ธ โ› )

  • SDK for anything your problem to make easier developing android apps
  • Available for android and desktop
  • Privacy Policy Click Here
  • License Click Here

Version Release

This Is Latest Release

~ Beta Release
$version_release = 0.0.1-beta03

What's New??

* SDK Android and Desktop *
* Beta Release *

Download this project

Step 1. Add the JitPack repository to your build file (build.gradle : Project)

// Add it in your root build.gradle at the end of repositories:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

// Add it in your root build.gradle.kts at the end of repositories:

allprojects {
    repositories {
        ...
        maven { url = uri("https://jitpack.io") }
    }
}

Step 2. Add the dependency (build.gradle : Module)

#### 

Step 3. Function from this SDK

All Class SDK (android)

FrogoActivity
FrogoApiClient
FrogoApplication
FrogoComposeActivity
FrogoDate
FrogoFragment
FrogoFunc
FrogoMusic
FrogoMutableLiveData
FrogoNavigation
FrogoPagerHelper
FrogoPreference
FrogoViewModel

All Class SDK (desktop & android)

FrogoApiModel
FrogoApiObserver
FrogoConstant
FrogoCoreApiClient
FrogoDataResponse
FrogoLocalObserver
FrogoStateResponse

FrogoActivity

fun setupDetailActivity(title: String)

fun setupChildFragment(frameId: Int, fragment: Fragment)

fun showToast(message: String)

fun setupEventEmptyView(view: View, isEmpty: Boolean)

fun setupEventProgressView(view: View, progress: Boolean)

fun checkExtra(extraKey: String): Boolean

fun <Model> baseFragmentNewInstance(
    fragment: FrogoFragment<*>,
    argumentKey: String,
    extraDataResult: Model
)

fun verifySignature()

fun readSignature()

fun verifyInstallerId()

fun verifyUnauthorizedApps()

fun verifyStores()

fun verifyDebug()

fun verifyEmulator()

fun showApkSignatures()

FrogoFragment

fun setupChildFragment(frameId: Int, fragment: Fragment)

fun checkArgument(argsKey: String): Boolean

fun setupEventEmptyView(view: View, isEmpty: Boolean)

fun setupEventProgressView(view: View, progress: Boolean)

fun showToast(message: String)

fun <Model> baseNewInstance(argsKey: String, data: Model)

FrogoFunc

fun createFolderPictureVideo()

fun getVideoFilePath(): String

fun createDialogDefault(
    context: Context,
    title: String,
    message: String,
    listenerYes: () -> Unit,
    listenerNo: () -> Unit
)

fun noAction(): Boolean

fun randomNumber(start: Int, end: Int): Int

fun isNetworkAvailable(context: Context): Boolean?

fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>

fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>

fun getJsonFromAsset(context: Context, filename: String): String?

fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>

fun getDrawableString(context: Context, nameResource: String): Int

fun getRawString(context: Context, nameResource: String): Int

FrogoMusic

fun playMusic(context: Context, musicFile: Int)

fun stopMusic()

fun pauseMusic()

FrogoDate

fun getTimeStamp(): String

fun getTimeNow(): String

fun getCurrentDate(format: String): String

fun dateTimeToTimeStamp(date: String?): Long

fun getCurrentUTC(): String

fun timetoHour(date: String?): String

fun dateTimeTZtoHour(date: String?): String

fun DateTimeMonth(date: String?): String

fun dateTimeSet(date: String?): String

fun dateTimeProblem(date: String?): String

fun getTimeAgo(time: Long): String?

fun compareDate(newDate: String): String?

fun messageDate(newDate: String): String?

fun getDataChat(time: Long): String?

fun convertClassificationDate(string: String?): String

fun convertDateNewFormat(string: String?): String

fun convertLongDateNewFormat(string: String?): String

fun revertFromLongDateNewFormat(string: String?): String

fun convertTargetDate(string: String?): String

fun diffTime(timeStart: String, timeEnd: String): Long

Colaborator

Very open to anyone, I'll write your name under this, please contribute by sending an email to me

  • Mail To [email protected]
  • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
  • Example : Github_amirisback_kotlin_admob-helper-implementation

Name Of Contribute

  • Muhammad Faisal Amir
  • Waiting List
  • Waiting List

Waiting for your contribute

Attention !!!

  • Please enjoy and don't forget fork and give a star
  • Don't Forget Follow My Github Account

ScreenShoot Apps

You might also like...
ๆ–ฐๆตชๅพฎๅš Android SDK

ReadMe ๅ…ฌๅ‘Š๏ผš ้‰ดไบŽ็บฟไธŠๆœๅŠกๅ™จๅ‡บ็Žฐ้—ฎ้ข˜๏ผŒๆŽจ่ไธ‹่ฝฝๆœฌๅœฐaarๅŽไธŠไผ ๅˆฐ่‡ชๅทฑๅ…ฌๅธ็š„ๆœๅŠกๅ™จ๏ผŒไฟ่ฏๅŽ็ปญๆœๅŠก็จณๅฎš๏ผŒ ๆˆ‘ไปฌไนŸๅฐ†ๅฐฝๅฟซ้‡ๆ–ฐๆไพ›ไธ€ไธช็จณๅฎš็š„ๅœฐๅ€ไพ›ๅคงๅฎถไฝฟ็”จใ€‚ ๆ–ฐๅŒ…ๅœฐๅ€๏ผšhttps://github.com/sinaweibosdk/weibo_android_sdk/tree/master/2019

Free forever Marketing SDK with a dashboard for in-app SplashScreen banners with built-in analytics
Free forever Marketing SDK with a dashboard for in-app SplashScreen banners with built-in analytics

AdaptivePlus Android SDK AdaptivePlus is the control center for marketing campaigns in mobile applications Requirements minSdkVersion 16 Examples prov

Official Appwrite Android SDK ๐Ÿ’š  ๐Ÿค–
Official Appwrite Android SDK ๐Ÿ’š ๐Ÿค–

Appwrite Android SDK This SDK is compatible with Appwrite server version 0.8.x. For older versions, please check previous releases. Appwrite is an ope

This App is sending Face capture data over network, built around the latest Android Arcore SDK.
This App is sending Face capture data over network, built around the latest Android Arcore SDK.

AndroidArcoreFacesStreaming From any Android phone ArCore compatible, using this app will send over TCP 5680 bytes messages: The first 5616 bytes is a

Its measurement app made using kotlin with sceneform sdk by google

ARCORE MEASUREMENT This app is build using sceneform sdk for android using kotlin language It helps you measure the distance between multiple points i

A Notion SDK for Any JVM Language

Notion SDK for Any JVM Language A simple and easy to use client for the Notion API Here is an Notion API SDK for any JVM language users ๐Ÿ‘‹ This projec

Trackingplan for Android SDK
Trackingplan for Android SDK

With Trackingplan for Android you can make sure that your tracking is going as you planned without changing your current analytics stack or code.

Desk360 Mobile Chat SDK for Android

Desk360 Chat Android SDK Introduction Desk360 Live Chat SDK is an open source Android library that provides live support to your customers directly fr

Storyblok Kotlin Multiplatform SDK sample (Android, JVM, JS)

storyblok-mp-SDK-sample *WIP* ... a showcase of the Storyblok Kotlin Multiplatform Client SDK. (Android, JVM, JS, iOS, ...) What's included ๐Ÿš€ โ€ข About

Releases(2.1.0)
  • 2.1.0(Dec 10, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.1.0
    

    What's New??

    * SDK Android and Desktop *
    * Update latest version library *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.1.0'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.1.0'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.1.0")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.1.0")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.9(Sep 17, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.9
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.9'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.9'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.9")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.9")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.8(Aug 14, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.8
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.8'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.8'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.8")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.8")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.7(Jul 29, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.7
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.7'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.7'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.7")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.7")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.6(Jul 23, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.6
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.6'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.6'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.6")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.6")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.5(Jul 23, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.5
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.5'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.5'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.5")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.5")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Jul 20, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.4
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.4'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.4'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.4")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.4")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.3(Jul 20, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.3
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    * Using Piracy Checker *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.3'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.3'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.3")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.3")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Jul 7, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.2
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.2'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.2'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.2")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.2")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Jul 3, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.1
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.1'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.1'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.1")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.1")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Jul 2, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 2.0.0
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    * Seperate FrogoActivity and FrogoFragment to FrogoBindActivity And FrogoBindFragment *
    * Using Delegate Class *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:2.0.0'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:2.0.0'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:2.0.0")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:2.0.0")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Jun 16, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.1.1
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.1.1'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.1.1'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.1.1")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.1.1")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Jun 2, 2022)

  • 1.0.9(May 30, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.9
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.9'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.9'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.9")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.9")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.8(May 30, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.8
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.8'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.8'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.8")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.8")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot AppsScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.8
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.8'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.8'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.8")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.8")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.7(May 30, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.7
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.7'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.7'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.7")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.7")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.6(May 11, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.6
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.6'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.6'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.6")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.6")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Apr 30, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.5
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.5'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.5'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.5")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.5")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Apr 18, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.4
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.4'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.4'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.4")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.4")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Apr 17, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.3
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.3'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.3'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.3")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.3")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Apr 14, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.2
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    * Update: Fixing Bug RxJava Ext *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.2'
    
            // library frogo-sdk for desktop
            implementation 'com.github.frogobox.frogo-sdk:frogocoresdk:1.0.2'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.2")
    
            // library frogo-sdk for desktop
            implementation("com.github.frogobox.frogo-sdk:frogocoresdk:1.0.2")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Apr 11, 2022)

    Full Changelog: https://github.com/frogobox/frogo-sdk/compare/1.0.0...1.0.1

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.1
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.1'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.1")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Apr 11, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    ScreenShoot

    SS 1 SS 2 SS 3 SS 4

    Version Release

    This Is Latest Release

    $version_release = 1.0.0
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:1.0.0'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:1.0.0")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.3(Apr 7, 2022)

    ScreenShoot Apps

    About This Project (release ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    $version_release = 0.0.3
    

    What's New??

    * SDK Android and Desktop *
    * Adding Ext Function *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.3'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.3")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApplication
    FrogoComposeActivity
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPiracyActivity
    FrogoPreference
    FrogoSinglePreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiClient
    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoDataResponse
    FrogoDate
    FrogoLocalObserver
    FrogoStateResponse
    IFrogoDate
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> FrogoFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun isNetworkConnected(): Boolean
    
    fun setupFullScreen()
    
    fun setupHideSystemUI()
    
    fun shareApp(packageName: String, appName: String)
    
    fun rateApp(packageName: String)
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEmptyView(view: View, isEmpty: Boolean)
    
    fun setupProgressView(view: View, isProgress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> frogoNewInstance(argsKey: String, data: Model)
    

    Ext Function

    FrogoRetrofitExt.kt

    
    // Single Api Request
    fun <T : Any> Call<T>.doApiRequest(callback: FrogoDataResponse<T>) {
    
        callback.onShowProgress()
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                response.body()?.let { callback.onSuccess(it) }
                callback.onHideProgress()
            }
    
            override fun onFailure(call: Call<T>, t: Throwable) {
                callback.onFailed(500, t.localizedMessage)
                callback.onHideProgress()
            }
        })
    
    }
    
    

    FrogoRxJavaObservableExt.kt

    
    // Single Api Request with scheduler
    fun <T : Any> Observable<T>.doApiRequest(scheduler: Scheduler, callback: FrogoDataResponse<T>) {
        subscribeOn(Schedulers.io())
            .doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .observeOn(scheduler)
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    // -------------------------------------------------------------------------------------------------
    
    // Single Api Request
    fun <T : Any> Observable<T>.doApiRequest(callback: FrogoDataResponse<T>) {
        doOnSubscribe { callback.onShowProgress() }
            .doOnTerminate { callback.onHideProgress() }
            .subscribe(object : FrogoApiObserver<T>() {
                override fun onSuccess(data: T) {
                    callback.onSuccess(data)
                }
    
                override fun onFailure(code: Int, errorMessage: String) {
                    callback.onFailed(code, errorMessage)
                }
            })
    }
    
    

    FrogoContextActivityExt.kt

    
    inline fun <reified ClassActivity> Context.singleStartActivity() {
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        startActivity(Intent(this, ClassActivity::class.java))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified ClassActivity, reified Model> Context.singleStartActivity(
        extraKey: String,
        data: Model
    ) {
        val intent = Intent(this, ClassActivity::class.java)
        val extraData = Gson().toJson(data)
        intent.putExtra(extraKey, extraData)
        FLog.d("Activity : ${ClassActivity::class.java.simpleName}")
        FLog.d("Data     : Extra Data (${Model::class.java.simpleName}) : $extraData")
        startActivity(intent)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Activity.singleGetExtraData(extraKey: String): Model {
        val extraIntent = intent.getStringExtra(extraKey)
        return Gson().fromJson(extraIntent, Model::class.java)
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityShareApp(subject: String, text: String) {
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        FLog.d("$TAG : Subject Share App : $subject")
        FLog.d("$TAG : Message Share App : $text")
        startActivity(Intent.createChooser(intent, subject))
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.singleStartActivityOpenApp(url: String) {
        FLog.d("$TAG : Url : $url")
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
    }
    
    

    FrogoContextFragmentExt.kt

    
    fun <Model> Fragment.singleNewInstance(argsKey: String, data: Model) {
        val argsData = Gson().toJson(data)
        val bundleArgs = Bundle().apply {
            putString(argsKey, argsData)
        }
        this.arguments = bundleArgs
    }
    
    // -------------------------------------------------------------------------------------------------
    
    inline fun <reified Model> Fragment.singleGetInstance(argsKey: String): Model {
        val argsData = this.arguments?.getString(argsKey)
        return Gson().fromJson(argsData, Model::class.java)
    }
    
    

    FrogoImageViewExt.kt

    
    fun ImageView.glideLoad(data: Any?) {
        FLog.d("$TAG : Params : $data")
        FLog.d("$TAG : Glide Load Ext")
        Glide.with(context).load(data).into(this)
    }
    
    

    FrogoViewExt.kt

    
    fun View.visible() {
        FLog.d("$TAG : View Visible")
        visibility = View.VISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.gone() {
        FLog.d("$TAG : View Gone")
        visibility = View.GONE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.invisible() {
        FLog.d("$TAG : View Invisible")
        visibility = View.INVISIBLE
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.progressViewHandle(isProgressState: Boolean) {
        FLog.d("$TAG : isProgressState >> $isProgressState")
        if (isProgressState) {
            visible()
        } else {
            gone()
        }
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun View.emptyViewHandle(isEmptyState: Boolean) {
        FLog.d("$TAG : isEmptyState >> $isEmptyState")
        if (isEmptyState) {
            visible()
        } else {
            gone()
        }
    }
    
    

    FrogoContextExt.kt

    
    fun Context.getAppVersionCode(): Int? {
        try {
            return packageManager?.getPackageInfo(packageName, 0)
                ?.let { PackageInfoCompat.getLongVersionCode(it).toInt() }
        } catch (ex: Exception) {
            FLog.e("$TAG : ${ex.message.orEmpty()}")
        }
    
        return null
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.showToast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ) {
        Toast.makeText(this, message, duration).show()
    }
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasCameraPermission(): Boolean =
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED
    
    // -------------------------------------------------------------------------------------------------
    
    fun Context.hasReadExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.READ_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    fun Context.hasWriteExtStoragePermission(): Boolean {
        return ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        ) == PackageManager.PERMISSION_GRANTED
    }
    
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.2-beta02(Mar 29, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    ~ Beta Release
    $version_release = 0.0.2-beta02
    

    What's New??

    * SDK Android and Desktop *
    * Beta Release *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.2-beta02'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.2-beta02")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.2(Mar 29, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    $version_release = 0.0.2
    

    What's New??

    * SDK Android and Desktop *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven("https://jitpack.io")
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.2'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.2")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Added Function

    Click for detail !!!

    FrogoLog

    • SDK for your Log problem to make easier developing android apps
    • frogo-log is Long Term Service
    • Line number show
    • Toast for easy develop and debug

    Screenshoot Result

    SS 1 SS 2 SS 3 SS 4

    Screenshoot Library Sample

    ScreenShoot Apps

    FrogoLog (with line code)

    // Function Log Debug
    FrogoLog.d("Debug")
    
    // Function Log Info
    FrogoLog.i("Info")
    
    // Function Log Verbose
    FrogoLog.v("Verbose")
    
    // Function Log Warn
    FrogoLog.w("Warn")
    
    // Function Log Error
    FrogoLog.e("Error")
    
    // Function Log Simple Debug without message params
    FrogoLog.d()
    
    

    FrogoLog (with line code and Toast)

    // Function Log Debug (adding context params)
    FrogoLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FrogoLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FrogoLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FrogoLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FrogoLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FrogoLog.d(this@MainActivity)
    

    FLog (without line code)

    // Function Log Debug
    FLog.d("Debug")
    
    // Function Log Info
    FLog.i("Info")
    
    // Function Log Verbose
    FLog.v("Verbose")
    
    // Function Log Warn
    FLog.w("Warn")
    
    // Function Log Error
    FLog.e("Error")
    
    // Function Log Simple Debug without message params
    FLog.d()
    

    Flog (without line code with toast)

    // Function Log Debug (adding context params)
    FLog.d("Debug", this@MainActivity)
    
    // Function Log Info (adding context params)
    FLog.i("Info", this@MainActivity)
    
    // Function Log Verbose
    FLog.v("Verbose", this@MainActivity)
    
    // Function Log Warn (adding context params)
    FLog.w("Warn", this@MainActivity)
    
    // Function Log Error (adding context params)
    FLog.e("Error", this@MainActivity)
    
    // Function Log Simple Debug without message params
    FLog.d(this@MainActivity)
    

    Result FrogoLog

    ScreenShoot Apps

    FrogoNotification

    • SDK for your notification problem to make easier developing android apps
    • frogo-notification is under huge large development
    • Notification with singleton method
    • Simple and eazy to use
    • With many feature
    • Full documentation
    • Custom Layout Notification

    Screenshoot Sample

    Simple Notification Stack Notification Custom Notification (1) Custom Notification (2)
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Simple Notification

    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(CHANNEL_NAME) // Initialize for Channel Name
        .setContentIntent(pendingIntent) // Initialize for Content Intent
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setLargeIcon(R.drawable.ic_frogo_notif) // Initialize for Large Icon
        .setContentTitle(resources.getString(R.string.content_title)) // Initialize for Content Title
        .setContentText(resources.getString(R.string.content_text)) // Initialize for Content Text
        .setSubText(resources.getString(R.string.subtext)) // Initialize for Sub Text
        .setupAutoCancel() // Initialize for Auto Cancel
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    Custom Layout (NEW FEATURE)

    val collapsed = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_collapsed
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply{
                setTextViewText(R.id.text_view_collapsed_1, "Hello World!")
            }
        }
    }
    
    val expanded = object : FrogoNotifCustomContentViewListener {
        override fun setupCustomView(): Int {
            return R.layout.notification_expanded
        }
    
        override fun setupComponent(context: Context, customView: RemoteViews) {
            customView.apply {
                setImageViewResource(R.id.image_view_expanded, R.drawable.ic_android)
                setOnClickPendingIntent(R.id.image_view_expanded, clickPendingIntent)
            }
        }
    }
    
    FrogoNotification.Inject(this) // Intialize for Context
        .setChannelId(FrogoApp.CHANNEL_ID) // Intialize for Channel ID
        .setChannelName(FrogoApp.CHANNEL_NAME) // Initialize for Channel Name
        .setSmallIcon(R.drawable.ic_android) // Initialize for Small Icon
        .setCustomContentView(collapsed)
        .setCustomBigContentView(expanded)
        .build() // Build the Frogo Notification
        .launch(FrogoApp.NOTIFICATION_ID) // Notify the Frogo Notification
    

    With Action Replay

    FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME as String)
        .setSmallIcon(R.drawable.ic_frogo_notif)
        .setContentTitle(getString(R.string.notif_title))
        .setContentText(getString(R.string.notif_content))
        .setupShowWhen()
        .setupActionRemoteInput(object : FrogoNotifActionRemoteInputListener {
            override fun setRemoteInputResultKey(): String {
                return KEY_REPLY
            }
    
            override fun setRemoteInputLabel(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIcon(): Int {
                return R.drawable.ic_frogo_send
            }
    
            override fun setActionTitle(): String {
                return getString(R.string.notif_action_reply)
            }
    
            override fun setActionIntent(): PendingIntent? {
                return getReplyPendingIntent()
            }
    
            override fun setAllowGeneratedReplies(): Boolean {
                return true
            }
        })
        .build()
        .launch(mNotificationId)
    

    With Inbox Style (Stack)

    val frogoNotification = FrogoNotification.Inject(this)
        .setChannelId(CHANNEL_ID)
        .setChannelName(CHANNEL_NAME)
        .setSmallIcon(R.drawable.ic_frogo_email)
        .setGroup(GROUP_KEY_EMAILS)
        .setContentIntent(pendingIntent)
        .setupAutoCancel()
    
    // Check if NotificationID is smaller than Max Notif
    if (idNotification < MAX_NOTIFICATION) {
    
        stackNotif[idNotification].message?.let {
            frogoNotification
                .setContentTitle("New Email from " + stackNotif[idNotification].sender)
                .setContentText(it)
                .setLargeIcon(R.drawable.ic_frogo_notif)
        }
    
    } else {
    
        frogoNotification
            .setContentTitle("$idNotification new emails")
            .setContentText("[email protected]")
            .setGroupSummary()
            .setupInboxStyle(object : FrogoNotifInboxStyleListener {
                override fun addLine1(): String {
                    return "New Email from " + stackNotif[idNotification].sender
                }
    
                override fun addLine2(): String {
                    return "New Email from " + stackNotif[idNotification - 1].sender
                }
    
                override fun setBigContentTitle(): String {
                    return "$idNotification new emails"
                }
    
                override fun setSummaryText(): String {
                    return "mail@frogobox"
                }
            })
    
    }
    
    frogoNotification
        .build()
        .launch(idNotification)
    

    With Frogo Style

    FrogoNotification.Inject(this) // Intialize for Context
        .setSmallIcon(R.drawable.ic_frogo_notif) // Initialize for Small Icon
        .setupWithFrogoStyle()
        .build() // Build the Frogo Notification
        .launch(NOTIFICATION_ID) // Notify the Frogo Notification
    

    For Documentation

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.2-beta01(Mar 20, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    ~ Beta Release
    $version_release = 0.0.2-beta01
    

    What's New??

    * SDK Android and Desktop *
    * Beta Release *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url = uri("https://jitpack.io") }
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.2-beta01'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.2-beta01")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.1-beta10(Mar 18, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    Android CI Scan with Detekt pages-build-deployment

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    ~ Beta Release
    $version_release = 0.0.1-beta10
    

    What's New??

    * SDK Android and Desktop *
    * Beta Release *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url = uri("https://jitpack.io") }
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.1-beta10'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.1-beta10")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.1-beta09(Mar 14, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    ~ Beta Release
    $version_release = 0.0.1-beta09
    

    What's New??

    * SDK Android and Desktop *
    * Beta Release *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url = uri("https://jitpack.io") }
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.1-beta09'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.1-beta09")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
  • 0.0.1-beta08(Mar 8, 2022)

    ScreenShoot Apps

    About This Project (release-and-work-in-progress ๐Ÿ‘ท๐Ÿ”ง๏ธ๐Ÿ‘ทโ€โ™€๏ธโ›)

    • SDK for anything your problem to make easier developing android apps
    • Available for android and desktop
    • Privacy Policy Click Here
    • License Click Here

    Version Release

    This Is Latest Release

    ~ Beta Release
    $version_release = 0.0.1-beta08
    

    What's New??

    * SDK Android and Desktop *
    * Beta Release *
    

    Download this project

    Step 1. Add the JitPack repository to your build file (build.gradle : Project)

    <Option 1> Groovy Gradle

    // Add it in your root build.gradle at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    <Option 2> Kotlin DSL Gradle

    // Add it in your root build.gradle.kts at the end of repositories:
    
    allprojects {
        repositories {
            ...
            maven { url = uri("https://jitpack.io") }
        }
    }
    

    Step 2. Add the dependency (build.gradle : Module)

    #### <Option 1> Groovy Gradle
    
        dependencies {
            // library frogo-sdk
            implementation 'com.github.frogobox:frogo-sdk:0.0.1-beta08'
        }
    
    #### <Option 2> Kotlin DSL Gradle
    
        dependencies {
            // library frogo-sdk
            implementation("com.github.frogobox:frogo-sdk:0.0.1-beta08")
        }
    

    Step 3. Function from this SDK

    All Class SDK (android)

    FrogoActivity
    FrogoApiClient
    FrogoApplication
    FrogoComposeActivity
    FrogoDate
    FrogoFragment
    FrogoFunc
    FrogoMusic
    FrogoMutableLiveData
    FrogoNavigation
    FrogoPagerHelper
    FrogoPreference
    FrogoViewModel
    

    All Class SDK (desktop & android)

    FrogoApiModel
    FrogoApiObserver
    FrogoConstant
    FrogoCoreApiClient
    FrogoDataResponse
    FrogoLocalObserver
    FrogoStateResponse
    

    FrogoActivity

    fun setupDetailActivity(title: String)
    
    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun showToast(message: String)
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun checkExtra(extraKey: String): Boolean
    
    fun <Model> baseFragmentNewInstance(
        fragment: FrogoFragment<*>,
        argumentKey: String,
        extraDataResult: Model
    )
    
    fun verifySignature()
    
    fun readSignature()
    
    fun verifyInstallerId()
    
    fun verifyUnauthorizedApps()
    
    fun verifyStores()
    
    fun verifyDebug()
    
    fun verifyEmulator()
    
    fun showApkSignatures()
    

    FrogoFragment

    fun setupChildFragment(frameId: Int, fragment: Fragment)
    
    fun checkArgument(argsKey: String): Boolean
    
    fun setupEventEmptyView(view: View, isEmpty: Boolean)
    
    fun setupEventProgressView(view: View, progress: Boolean)
    
    fun showToast(message: String)
    
    fun <Model> baseNewInstance(argsKey: String, data: Model)
    

    FrogoFunc

    fun createFolderPictureVideo()
    
    fun getVideoFilePath(): String
    
    fun createDialogDefault(
        context: Context,
        title: String,
        message: String,
        listenerYes: () -> Unit,
        listenerNo: () -> Unit
    )
    
    fun noAction(): Boolean
    
    fun randomNumber(start: Int, end: Int): Int
    
    fun isNetworkAvailable(context: Context): Boolean?
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int): ArrayList<T>
    
    fun <T> fetchRawData(mContext: Context, sourceRaw: Int, shuffle: Boolean): ArrayList<T>
    
    fun getJsonFromAsset(context: Context, filename: String): String?
    
    fun <T> getArrayFromJsonAsset(context: Context, filename: String): MutableList<T>
    
    fun getDrawableString(context: Context, nameResource: String): Int
    
    fun getRawString(context: Context, nameResource: String): Int
    

    FrogoMusic

    fun playMusic(context: Context, musicFile: Int)
    
    fun stopMusic()
    
    fun pauseMusic()
    

    FrogoDate

    fun getTimeStamp(): String
    
    fun getTimeNow(): String
    
    fun getCurrentDate(format: String): String
    
    fun dateTimeToTimeStamp(date: String?): Long
    
    fun getCurrentUTC(): String
    
    fun timetoHour(date: String?): String
    
    fun dateTimeTZtoHour(date: String?): String
    
    fun DateTimeMonth(date: String?): String
    
    fun dateTimeSet(date: String?): String
    
    fun dateTimeProblem(date: String?): String
    
    fun getTimeAgo(time: Long): String?
    
    fun compareDate(newDate: String): String?
    
    fun messageDate(newDate: String): String?
    
    fun getDataChat(time: Long): String?
    
    fun convertClassificationDate(string: String?): String
    
    fun convertDateNewFormat(string: String?): String
    
    fun convertLongDateNewFormat(string: String?): String
    
    fun revertFromLongDateNewFormat(string: String?): String
    
    fun convertTargetDate(string: String?): String
    
    fun diffTime(timeStart: String, timeEnd: String): Long
    

    Colaborator

    Very open to anyone, I'll write your name under this, please contribute by sending an email to me

    • Mail To [email protected]
    • Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]
    • Example : Github_amirisback_kotlin_admob-helper-implementation

    Name Of Contribute

    • Muhammad Faisal Amir
    • Waiting List
    • Waiting List

    Waiting for your contribute

    Attention !!!

    • Please enjoy and don't forget fork and give a star
    • Don't Forget Follow My Github Account

    ScreenShoot Apps

    Source code(tar.gz)
    Source code(zip)
Owner
Frogobox
Frogobox starter code, sample, library
Frogobox
Segmenkt - The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment

SegmenKT Kotlin SDK The SegmenKT Kotlin SDK is a Kotlin-first SDK for Segment. I

UNiDAYS 0 Nov 25, 2022
HubSpot Kotlin SDK ๐Ÿงบ Implementation of HubSpot API for Java/Kotlin in tiny SDK

HubSpot Kotlin SDK ?? Implementation of HubSpot API for Java/Kotlin in tiny SDK

BOOM 3 Oct 27, 2022
AWS SDK for Android. For more information, see our web site:

AWS SDK for Android For new projects, we recommend interacting with AWS using the Amplify Framework. The AWS SDK for Android is a collection of low-le

AWS Amplify 976 Dec 29, 2022
Countly Product Analytics Android SDK

Countly Android SDK We're hiring: Countly is looking for Android SDK developers, full stack devs, devops and growth hackers (remote work). Click this

Countly Team 648 Dec 23, 2022
Android Real Time Chat & Messaging SDK

Android Chat SDK Overview Applozic brings real-time engagement with chat, video, and voice to your web, mobile, and conversational apps. We power emer

Applozic 659 May 14, 2022
Evernote SDK for Android

Evernote SDK for Android version 2.0.0-RC4 Evernote API version 1.25 Overview This SDK wraps the Evernote Cloud API and provides OAuth authentication

Evernote 424 Dec 9, 2022
Air Native Extension (iOS and Android) for the Facebook mobile SDK

Air Native Extension for Facebook (iOS + Android) This is an AIR Native Extension for the Facebook SDK on iOS and Android. It has been developed by Fr

Freshplanet 219 Nov 25, 2022
Android Chat SDK built on Firebase

Chat21 is the core of the open source live chat platform Tiledesk.com. Chat21 SDK Documentation Features With Chat21 Android SDK you can: Send a direc

Chat21 235 Dec 2, 2022
Liquid SDK (Android)

Liquid Android SDK Quick Start to Liquid SDK for Android This document is just a quick start introduction to Liquid SDK for Android. We recommend you

Liquid 17 Nov 12, 2021
AWS SDK for Android. For more information, see our web site:

AWS SDK for Android For new projects, we recommend interacting with AWS using the Amplify Framework. The AWS SDK for Android is a collection of low-le

AWS Amplify 975 Dec 24, 2022