From e4fa0bbc73b4ad64f5073c2e7bd96c970de63b3e Mon Sep 17 00:00:00 2001 From: amirisback Date: Sun, 9 Nov 2025 08:55:21 +0700 Subject: [PATCH 1/3] update: enhance code and update libs --- README.md | 2 +- app/build.gradle.kts | 13 +- .../appkeyboard/common/base/BaseViewModel.kt | 4 +- .../appkeyboard/common/ext/DateExt.kt | 155 ++++++++++++++++++ .../appkeyboard/services/KeyboardIME.kt | 48 +++--- .../ui/autotext/AutoTextActivity.kt | 8 +- .../ui/autotext/AutoTextViewModel.kt | 18 +- .../ui/keyboard/autotext/AutoTextKeyboard.kt | 7 +- .../ui/keyboard/form/FormKeyboard.kt | 9 +- .../ui/keyboard/movie/MovieKeyboard.kt | 11 +- .../ui/keyboard/news/NewsKeyboard.kt | 11 +- .../templatetext/TemplateTextKeyboard.kt | 7 +- .../ui/keyboard/webview/WebiewKeyboard.kt | 5 +- .../appkeyboard/ui/main/BaseMainActivity.kt | 9 +- buildSrc/src/main/kotlin/ProjectSetting.kt | 6 +- .../libkeyboard/common/core/BaseKeyboard.kt | 71 ++++++-- .../common/core/BaseKeyboardIME.kt | 23 +-- .../libkeyboard/common/core/IKeyboardIME.kt | 6 +- .../libkeyboard/ui/emoji/EmojiKeyboard.kt | 12 +- .../libkeyboard/ui/main/MainKeyboard.kt | 25 ++- gradle/libs.versions.toml | 20 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 22 files changed, 332 insertions(+), 140 deletions(-) create mode 100644 app/src/main/java/com/frogobox/appkeyboard/common/ext/DateExt.kt diff --git a/README.md b/README.md index dd2694b..694592d 100644 --- a/README.md +++ b/README.md @@ -526,7 +526,7 @@ class KeyboardIME : BaseKeyboardIME() { ### if your feature is using a textfield, add below code to your KeyboardIME class ```kotlin -@RequiresApi(Build.VERSION_CODES.M) + override fun onKey(code: Int) { val formView = binding?.keyboardForm var inputConnection = currentInputConnection diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 59e8813..2e5c938 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,4 +1,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.text.SimpleDateFormat +import java.util.Date plugins { alias(libs.plugins.android.application) @@ -12,6 +14,12 @@ ksp { arg("room.schemaLocation", "$projectDir/schemas") // If Using Ksp } +base { + // Naming APK // AAB + val timestamp = SimpleDateFormat("dd-MM-yyyy_hh-mm").format(Date()) + archivesName = "${ProjectSetting.NAME_APK}-${ProjectSetting.PROJECT_VERSION_CODE}-[${ProjectSetting.PROJECT_VERSION_NAME}]-$timestamp" +} + android { namespace = ProjectSetting.PROJECT_NAME_SPACE_APP @@ -33,9 +41,6 @@ android { buildConfigField("String", "DATABASE_NAME", ProjectSetting.DB) buildConfigField("String", "PREF_NAME", ProjectSetting.PREF) - // Naming APK // AAB - setProperty("archivesBaseName", "${ProjectSetting.NAME_APK}(${versionName})") - // Declaration apps name debug mode val debugAttribute = "Dev" val nameAppDebug = "${ProjectSetting.NAME_APP} $debugAttribute" @@ -90,8 +95,8 @@ android { } buildFeatures { - viewBinding = true buildConfig = true + viewBinding = true } compileOptions { diff --git a/app/src/main/java/com/frogobox/appkeyboard/common/base/BaseViewModel.kt b/app/src/main/java/com/frogobox/appkeyboard/common/base/BaseViewModel.kt index c570f0c..8dfeac6 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/common/base/BaseViewModel.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/common/base/BaseViewModel.kt @@ -1,6 +1,6 @@ package com.frogobox.appkeyboard.common.base -import com.frogobox.sdk.view.FrogoViewModel2 +import com.frogobox.sdk.view.FrogoViewModel /** * Created by Faisal Amir on 09/02/23 @@ -8,6 +8,6 @@ import com.frogobox.sdk.view.FrogoViewModel2 */ -abstract class BaseViewModel : FrogoViewModel2() { +abstract class BaseViewModel : FrogoViewModel() { } \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/appkeyboard/common/ext/DateExt.kt b/app/src/main/java/com/frogobox/appkeyboard/common/ext/DateExt.kt new file mode 100644 index 0000000..7fad923 --- /dev/null +++ b/app/src/main/java/com/frogobox/appkeyboard/common/ext/DateExt.kt @@ -0,0 +1,155 @@ +package com.frogobox.appkeyboard.common.ext + +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +/** + * Created by faisalamircs on 09/11/2025 + * ----------------------------------------- + * Name : Muhammad Faisal Amir + * E-mail : faisalamircs@gmail.com + * Github : github.com/amirisback + * ----------------------------------------- + */ + + + +// Format Second +const val SECOND_MILLIS = 1000 +const val MINUTE_MILLIS = 60 * SECOND_MILLIS +const val HOUR_MILLIS = 60 * MINUTE_MILLIS +const val DAY_MILLIS = 24 * HOUR_MILLIS + +// Format Date +const val DATE_TIME_GLOBAL = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" // +const val DATE_TIME_STANDARD = "yyyy-MM-dd HH:mm:ss" // 2018-10-02 12:12:12 +const val DATE_ENGLISH_YYYY_MM_DD = "yyyy-MM-dd" // 2018-10-02 +const val DATE_ENGLISH_YYYY_MM_DD_CLEAR = "yyyy MM dd" // 2018 10 02 +const val DATE_DD_MM_YYYY = "dd-MM-yyyy" // 02-10-2018 +const val DATE_EEEE_DD_MM_YYYY = "EEEE, dd MMMM yyyy" // 02-10-2018 +const val DATE_DD_MM_YYYY_CLEAR = "dd MM yyyy" // 02-10-2018 + +// Format Time +const val TIME_GENERAL_HH_MM_SS = "HH:mm:ss" // 12:12:12 +const val TIME_GENERAL_HH_MM = "HH:mm" // 12:12 + +// Format Day +const val DAY_WITH_DATE_TIME_ENGLISH = "EEE, MMM dd yyyy HH:mm" // Mon, Aug 12 2018 12:12 +const val DAY_WITH_DATE_TIME_LOCALE = "EEE, dd MMM yyyy HH:mm" // Sen, 12 Agt 2019 12:12 +const val DAY_WITH_DATE_TIME_ENGLISH_FULL = "EEEE, MMMM dd yyyy HH:mm" // Monday, August 12 2018 12:12 +const val DAY_WITH_DATE_TIME_LOCALE_FULL = "EEEE, dd MMMM yyyy HH:mm" // Senin, 12 Agustus 2018 12:12 + + fun getTimeStamp(): String { + val simpleDateFormat = SimpleDateFormat(DATE_TIME_STANDARD, Locale.getDefault()) + return simpleDateFormat.format(Date()) +} + + fun getTimeNow(): String { + val simpleDateFormat = SimpleDateFormat(TIME_GENERAL_HH_MM_SS, Locale.getDefault()) + return simpleDateFormat.format(Date()) +} + + fun getCurrentDate(format: String): String { + val simpleDateFormat = SimpleDateFormat(format, Locale.getDefault()) + return simpleDateFormat.format(Date()) +} + + fun dateTimeToTimeStamp(date: String?): Long { + var timestamp: Long = 0 + val tz = TimeZone.getTimeZone("UTC") + val df = SimpleDateFormat(DATE_TIME_GLOBAL, Locale.getDefault()) + df.timeZone = tz + + if (date != null) { + try { + timestamp = df.parse(date).time / 1000 + } catch (e: ParseException) { + e.printStackTrace() + } + + } else { + timestamp = Date().time / 1000 + } + return timestamp +} + + fun getCurrentUTC(): String { + val time = Calendar.getInstance().time + val outputFmt = SimpleDateFormat(TIME_GENERAL_HH_MM_SS, Locale.getDefault()) + outputFmt.timeZone = TimeZone.getTimeZone("UTC") + return outputFmt.format(time) +} + + fun convertClassificationDate(string: String?): String { + return if (string != null) { + if (string.contains("/")) { + val temp = string.split("/") + temp[1] + "-" + temp[0] + "-01" + } else { + "" + } + } else { + "" + } +} + + fun convertDateNewFormat(string: String?): String { + val formatter = SimpleDateFormat(DATE_ENGLISH_YYYY_MM_DD, Locale.getDefault()) + val date = formatter.parse(string) as Date + val newFormat = SimpleDateFormat(DATE_DD_MM_YYYY, Locale("EN")) + return newFormat.format(date) +} + + fun convertLongDateNewFormat(string: String?): String { + val formatter = SimpleDateFormat(DATE_TIME_STANDARD, Locale.getDefault()) + val date = formatter.parse(string) as Date + val newFormat = SimpleDateFormat("dd-MM-yy HH:mm:ss", Locale("EN")) + return newFormat.format(date) +} + + fun revertFromLongDateNewFormat(string: String?): String { + val formatter = SimpleDateFormat("dd-MM-yy HH:mm:ss", Locale("EN")) + val date = formatter.parse(string) as Date + val newFormat = SimpleDateFormat(DATE_TIME_STANDARD, Locale.getDefault()) + val finalString = newFormat.format(date) + return finalString +} + + fun convertTargetDate(string: String?): String { + return if (string != null) { + if (string.contains("/")) { + val temp = string.split("/") + temp[1] + "-" + temp[0] + "-01 00:00:00" + } else { + "" + } + } else { + "" + } +} + + fun diffTime(timeStart: String, timeEnd: String): Long { + var min: Long = 0 + val diff: Long + val format = SimpleDateFormat(TIME_GENERAL_HH_MM_SS, Locale.getDefault()) + + val d1: Date? + val d2: Date? + + try { + d1 = format.parse(timeStart) + d2 = format.parse(timeEnd) + + diff = d2.time - d1.time + min = diff / (60 * 1000) + + } catch (e: Exception) { + e.printStackTrace() + } + + return min +} \ No newline at end of file diff --git a/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt b/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt index dfee190..4a1449a 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt @@ -1,14 +1,12 @@ package com.frogobox.appkeyboard.services import android.content.Intent -import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.EditText -import androidx.annotation.RequiresApi import com.frogobox.appkeyboard.R import com.frogobox.appkeyboard.databinding.ItemKeyboardHeaderBinding import com.frogobox.appkeyboard.databinding.KeyboardImeBinding @@ -119,7 +117,7 @@ class KeyboardIME : BaseKeyboardIME() { keyboardWebview.gone() keyboardForm.gone() keyboardEmoji.gone() - keyboardEmoji.binding?.emojiList?.scrollToPosition(0) + keyboardEmoji.binding.emojiList.scrollToPosition(0) } } @@ -144,38 +142,38 @@ class KeyboardIME : BaseKeyboardIME() { override fun initBackToMainKeyboard() { binding?.apply { - keyboardAutotext.binding?.toolbarBack?.setOnClickListener { + keyboardAutotext.binding.toolbarBack.setOnClickListener { keyboardAutotext.gone() showMainKeyboard() } - keyboardNews.binding?.toolbarBack?.setOnClickListener { + keyboardNews.binding.toolbarBack.setOnClickListener { keyboardNews.gone() showMainKeyboard() } - keyboardMoview.binding?.toolbarBack?.setOnClickListener { + keyboardMoview.binding.toolbarBack.setOnClickListener { keyboardMoview.gone() showMainKeyboard() } - keyboardWebview.binding?.toolbarBack?.setOnClickListener { + keyboardWebview.binding.toolbarBack.setOnClickListener { keyboardWebview.gone() showMainKeyboard() } - keyboardForm.binding?.toolbarBack?.setOnClickListener { + keyboardForm.binding.toolbarBack.setOnClickListener { keyboardForm.gone() showMainKeyboard() } - keyboardEmoji.binding?.toolbarBack?.setOnClickListener { + keyboardEmoji.binding.toolbarBack.setOnClickListener { keyboardEmoji.gone() - keyboardEmoji.binding?.emojiList?.scrollToPosition(0) + keyboardEmoji.binding.emojiList.scrollToPosition(0) showMainKeyboard() } - keyboardTemplateText.binding?.toolbarBack?.setOnClickListener { + keyboardTemplateText.binding.toolbarBack.setOnClickListener { keyboardTemplateText.gone() showMainKeyboard() } @@ -265,9 +263,9 @@ class KeyboardIME : BaseKeyboardIME() { KeyboardFeatureType.FORM -> { keyboardHeader.gone() keyboardForm.visible() - keyboardForm.binding?.etText?.showKeyboardExt() - keyboardForm.binding?.etText2?.showKeyboardExt() - keyboardForm.binding?.etText3?.showKeyboardExt() + keyboardForm.binding.etText.showKeyboardExt() + keyboardForm.binding.etText2.showKeyboardExt() + keyboardForm.binding.etText3.showKeyboardExt() keyboardForm.setOnClickListener { hideOnlyKeyboard() @@ -330,26 +328,26 @@ class KeyboardIME : BaseKeyboardIME() { } } - @RequiresApi(Build.VERSION_CODES.M) + override fun onKey(code: Int) { val formView = binding?.keyboardForm var inputConnection = currentInputConnection if (formView?.visibility == View.VISIBLE) { - val et1 = formView.binding?.etText - val et1Connection = et1?.onCreateInputConnection(EditorInfo()) + val et1 = formView.binding.etText + val et1Connection = et1.onCreateInputConnection(EditorInfo()) - val et2 = formView.binding?.etText2 - val et2Connection = et2?.onCreateInputConnection(EditorInfo()) + val et2 = formView.binding.etText2 + val et2Connection = et2.onCreateInputConnection(EditorInfo()) - val et3 = formView.binding?.etText3 - val et3Connection = et3?.onCreateInputConnection(EditorInfo()) + val et3 = formView.binding.etText3 + val et3Connection = et3.onCreateInputConnection(EditorInfo()) - if (et1?.isFocused == true) { + if (et1.isFocused) { inputConnection = et1Connection - } else if (et2?.isFocused == true) { + } else if (et2.isFocused) { inputConnection = et2Connection - } else if (et3?.isFocused == true) { + } else if (et3.isFocused) { inputConnection = et3Connection } @@ -371,7 +369,7 @@ class KeyboardIME : BaseKeyboardIME() { binding?.keyboardMain?.invalidateAllKeys() } - @RequiresApi(Build.VERSION_CODES.M) + override fun runEmojiBoard() { binding?.keyboardEmoji?.visible() binding?.keyboardMain?.invisible() diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextActivity.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextActivity.kt index e0946e9..11d60cd 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextActivity.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextActivity.kt @@ -9,7 +9,7 @@ import com.frogobox.appkeyboard.common.base.BaseActivity import com.frogobox.appkeyboard.databinding.ActivityAutotextBinding import com.frogobox.appkeyboard.databinding.ItemAutotextBinding import com.frogobox.appkeyboard.model.AutoTextEntity -import com.frogobox.coresdk.source.FrogoResult +import com.frogobox.coresdk.source.Resource import com.frogobox.recycler.core.FrogoRecyclerNotifyListener import com.frogobox.recycler.core.IFrogoBindingAdapter import com.frogobox.recycler.ext.injectorBinding @@ -41,9 +41,9 @@ class AutoTextActivity : BaseActivity() { showLogD("${it}", "AutoText") when (it) { - is FrogoResult.Error -> {} - is FrogoResult.Loading -> {} - is FrogoResult.Success -> { + is Resource.Error -> {} + is Resource.Loading -> {} + is Resource.Success -> { if (it.result.isEmpty()) { binding.emptyView.root.visible() binding.rvAutotext.gone() diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextViewModel.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextViewModel.kt index 1d6e32a..79692da 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextViewModel.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/autotext/AutoTextViewModel.kt @@ -5,11 +5,11 @@ import androidx.lifecycle.MutableLiveData import com.frogobox.appkeyboard.common.base.BaseViewModel import com.frogobox.appkeyboard.common.callback.DataResponseCallback import com.frogobox.appkeyboard.common.callback.StateResponseCallback +import com.frogobox.appkeyboard.common.ext.getTimeNow import com.frogobox.appkeyboard.model.AutoTextEntity import com.frogobox.appkeyboard.model.AutoTextLabelType import com.frogobox.appkeyboard.repository.autotext.AutoTextRepository -import com.frogobox.coresdk.source.FrogoResult -import com.frogobox.coresdk.util.FrogoDate +import com.frogobox.coresdk.source.Resource import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -24,8 +24,8 @@ class AutoTextViewModel @Inject constructor( private val repository: AutoTextRepository, ) : BaseViewModel() { - private var _autoText = MutableLiveData>>() - var autoText: LiveData>> = _autoText + private var _autoText = MutableLiveData>>() + var autoText: LiveData>> = _autoText protected var _eventFailed = MutableLiveData() var eventFailed: LiveData = _eventFailed @@ -58,15 +58,15 @@ class AutoTextViewModel @Inject constructor( override fun onHideProgress() {} override fun onFailed(statusCode: Int, errorMessage: String) { - _autoText.postValue(FrogoResult.Error(statusCode, errorMessage)) + _autoText.postValue(Resource.Error(statusCode, errorMessage)) } override fun onShowProgress() { - _autoText.postValue(FrogoResult.Loading()) + _autoText.postValue(Resource.Loading()) } override fun onSuccess(data: List) { - _autoText.postValue(FrogoResult.Success(data)) + _autoText.postValue(Resource.Success(data)) } }) @@ -76,7 +76,7 @@ class AutoTextViewModel @Inject constructor( val data = AutoTextEntity( title = title, label = AutoTextLabelType.DEFAULT, - date = FrogoDate.getTimeNow(), + date = getTimeNow(), body = body, isActive = true ) @@ -135,7 +135,7 @@ class AutoTextViewModel @Inject constructor( id = id, title = title, label = AutoTextLabelType.DEFAULT, - date = FrogoDate.getTimeNow(), + date = getTimeNow(), body = body, isActive = true ) diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt index fc35723..e2623e5 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.LinearLayout import com.frogobox.appkeyboard.databinding.ItemKeyboardNewsBinding import com.frogobox.appkeyboard.databinding.KeyboardAutotextBinding import com.frogobox.appkeyboard.model.AutoTextEntity @@ -22,7 +23,7 @@ class AutoTextKeyboard( attrs: AttributeSet?, ) : BaseKeyboard(context, attrs) { - override fun setupViewBinding(): KeyboardAutotextBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardAutotextBinding { return KeyboardAutotextBinding.inflate(LayoutInflater.from(context), this, true) } @@ -32,7 +33,7 @@ class AutoTextKeyboard( } private fun initView() { - binding?.apply { + binding.apply { tvToolbarTitle.text = "Auto Text" } } @@ -45,7 +46,7 @@ class AutoTextKeyboard( } private fun setupRv(data: List) { - binding?.apply { + binding.apply { val adapterCallback = object : IFrogoBindingAdapter { override fun onItemClicked( diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt index 488f0a9..3fe7a7c 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt @@ -2,9 +2,8 @@ package com.frogobox.appkeyboard.ui.keyboard.form import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater -import android.view.inputmethod.EditorInfo +import android.widget.LinearLayout import com.frogobox.appkeyboard.databinding.KeyboardFormBinding import com.frogobox.appkeyboard.ui.keyboard.movie.MovieKeyboard import com.frogobox.appkeyboard.util.KeyboardNavigationHelper @@ -27,7 +26,7 @@ class FormKeyboard( private val destinationKeyboard = MovieKeyboard(context, attrs) - override fun setupViewBinding(): KeyboardFormBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardFormBinding { return KeyboardFormBinding.inflate(LayoutInflater.from(context), this, true) } @@ -36,9 +35,7 @@ class FormKeyboard( } private fun initView() { - binding?.apply { - Log.d("FormKeyboard", "initView: ${etText.onCreateInputConnection(EditorInfo())}") - + binding.apply { btnSubmit.setOnClickListener { KeyboardNavigationHelper.navigateTo(this@FormKeyboard, destinationKeyboard) } diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt index 4d10ad5..8908bf1 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.LinearLayout import com.bumptech.glide.Glide import com.frogobox.api.movie.ConsumeMovieApi import com.frogobox.appkeyboard.databinding.ItemKeyboardMovieBinding @@ -35,7 +36,7 @@ class MovieKeyboard( attrs: AttributeSet?, ) : BaseKeyboard(context, attrs) { - override fun setupViewBinding(): KeyboardGridBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardGridBinding { return KeyboardGridBinding.inflate(LayoutInflater.from(context), this, true) } @@ -45,7 +46,7 @@ class MovieKeyboard( } private fun initView() { - binding?.apply { + binding.apply { tvToolbarTitle.text = "Movie Api" } } @@ -57,11 +58,11 @@ class MovieKeyboard( override fun onFinish() {} override fun onHideProgress() { - binding?.progressBar?.gone() + binding.progressBar.gone() } override fun onShowProgress() { - binding?.progressBar?.visible() + binding.progressBar.visible() } override fun onSuccess(data: Trending) { @@ -72,7 +73,7 @@ class MovieKeyboard( } private fun setupRv(data: List) { - binding?.apply { + binding.apply { val adapterCallback = object : IFrogoBindingAdapter { diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/news/NewsKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/news/NewsKeyboard.kt index d2dd833..eb016bd 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/news/NewsKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/news/NewsKeyboard.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.LinearLayout import com.frogobox.api.news.ConsumeNewsApi import com.frogobox.appkeyboard.databinding.ItemKeyboardNewsBinding import com.frogobox.appkeyboard.databinding.KeyboardListBinding @@ -37,7 +38,7 @@ class NewsKeyboard( attrs: AttributeSet?, ) : BaseKeyboard(context, attrs) { - override fun setupViewBinding(): KeyboardListBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardListBinding { return KeyboardListBinding.inflate(LayoutInflater.from(context), this, true) } @@ -47,7 +48,7 @@ class NewsKeyboard( } private fun initView() { - binding?.apply { + binding.apply { tvToolbarTitle.text = "News Api" } } @@ -77,12 +78,12 @@ class NewsKeyboard( override fun onShowProgress() { // Your Progress Show - binding?.progressBar?.visible() + binding.progressBar.visible() } override fun onHideProgress() { // Your Progress Hide - binding?.progressBar?.gone() + binding.progressBar.gone() } }) @@ -90,7 +91,7 @@ class NewsKeyboard( } private fun setupRv(data: List
) { - binding?.apply { + binding.apply { val adapterCallback = object : IFrogoBindingAdapter { override fun onItemClicked( diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt index f38a27c..3dc59c0 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup +import android.widget.LinearLayout import com.frogobox.appkeyboard.databinding.ItemKeyboardNewsBinding import com.frogobox.appkeyboard.databinding.KeyboardAutotextBinding import com.frogobox.appkeyboard.model.KeyboardFeatureType @@ -25,7 +26,7 @@ class TemplateTextKeyboard( private var typePlayStore: KeyboardFeatureType? = null - override fun setupViewBinding(): KeyboardAutotextBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardAutotextBinding { return KeyboardAutotextBinding.inflate(LayoutInflater.from(context), this, true) } @@ -70,7 +71,7 @@ class TemplateTextKeyboard( } - binding?.tvToolbarTitle?.text = title + binding.tvToolbarTitle.text = title setupRv(list) } @@ -88,7 +89,7 @@ class TemplateTextKeyboard( } private fun setupRv(data: List) { - binding?.apply { + binding.apply { val adapterCallback = object : IFrogoBindingAdapter { diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt index 644b8b9..4da82d3 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt @@ -3,6 +3,7 @@ package com.frogobox.appkeyboard.ui.keyboard.webview import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.widget.LinearLayout import com.frogobox.appkeyboard.databinding.KeyboardWebviewBinding import com.frogobox.libkeyboard.common.core.BaseKeyboard import com.frogobox.sdk.ext.loadUrlFrogoExt @@ -22,7 +23,7 @@ class WebiewKeyboard( attrs: AttributeSet?, ) : BaseKeyboard(context, attrs) { - override fun setupViewBinding(): KeyboardWebviewBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardWebviewBinding { return KeyboardWebviewBinding.inflate(LayoutInflater.from(context), this, true) } @@ -31,7 +32,7 @@ class WebiewKeyboard( } private fun initView() { - binding?.apply { + binding.apply { webview.loadUrlFrogoExt("https://www.google.com") } } diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/main/BaseMainActivity.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/main/BaseMainActivity.kt index ca3c496..70f5b6a 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/main/BaseMainActivity.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/main/BaseMainActivity.kt @@ -2,11 +2,10 @@ package com.frogobox.appkeyboard.ui.main import androidx.viewbinding.ViewBinding import com.frogobox.appkeyboard.common.base.BaseActivity -import com.frogobox.sdk.delegate.piracy.FrogoPiracyCallback -import com.frogobox.sdk.delegate.piracy.FrogoPiracyDialogCallback +import com.frogobox.sdk.delegate.piracy.PiracyCallback import com.frogobox.sdk.delegate.piracy.PiracyDelegates import com.frogobox.sdk.delegate.piracy.PiracyDelegatesImpl -import com.frogobox.sdk.delegate.piracy.util.PiracyMessage +import com.frogobox.sdk.delegate.piracy.PiracyMessage import com.frogobox.sdk.ext.openPlayStore abstract class BaseMainActivity : BaseActivity(), @@ -19,10 +18,10 @@ abstract class BaseMainActivity : BaseActivity(), } override fun setupPiracyMode() { - connectPiracyChecker(object : FrogoPiracyCallback { + connectPiracyChecker(object : PiracyCallback { override fun doOnPirated(message: PiracyMessage) { - showPiracedDialog(message, object : FrogoPiracyDialogCallback { + showPiracedDialog(message, object : PiracyCallback { override fun doOnPirated(message: PiracyMessage) { openPlayStore(packageName) } diff --git a/buildSrc/src/main/kotlin/ProjectSetting.kt b/buildSrc/src/main/kotlin/ProjectSetting.kt index 0ea120d..7594774 100644 --- a/buildSrc/src/main/kotlin/ProjectSetting.kt +++ b/buildSrc/src/main/kotlin/ProjectSetting.kt @@ -33,7 +33,7 @@ object ProjectSetting { // --------------------------------------------------------------------------------------------- - const val BASE_PACAKGE_NAME = "com.frogobox" + const val BASE_PACKAGE_NAME = "com.frogobox" const val MODULE_APP = "appkeyboard" const val MODULE_LIB_FROGO_KEYBOARD = "libkeyboard" @@ -42,8 +42,8 @@ object ProjectSetting { val PROJECT_APP_ID = "$APP_DOMAIN.$APP_PLAY_CONSOLE.$APP_NAME" - const val PROJECT_NAME_SPACE_APP = "$BASE_PACAKGE_NAME.$MODULE_APP" - const val PROJECT_NAME_SPACE_LIB_FROGO_KEYBOARD = "$BASE_PACAKGE_NAME.$MODULE_LIB_FROGO_KEYBOARD" + const val PROJECT_NAME_SPACE_APP = "$BASE_PACKAGE_NAME.$MODULE_APP" + const val PROJECT_NAME_SPACE_LIB_FROGO_KEYBOARD = "$BASE_PACKAGE_NAME.$MODULE_LIB_FROGO_KEYBOARD" const val PROJECT_VERSION_CODE = (VERSION_MAJOR * 100) + (VERSION_MINOR * 10) + (VERSION_PATCH * 1) const val PROJECT_VERSION_NAME = "$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt index 6c64d52..b5dcad4 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt @@ -2,12 +2,22 @@ package com.frogobox.libkeyboard.common.core import android.content.Context import android.util.AttributeSet -import android.util.Log +import android.view.LayoutInflater import android.view.inputmethod.InputConnection import android.widget.LinearLayout import androidx.viewbinding.ViewBinding /** + * Base class for all custom keyboard layouts. + * + * Provides: + * - Automatic [ViewBinding] inflation + * - Safe initialization through [onCreate] + * - Controlled [InputConnection] management + * - Optional lifecycle-safe cleanup via [onDestroy] + * + * @param VB The [ViewBinding] type for this keyboard. + * * Created by Faisal Amir on 07/11/22 * ----------------------------------------- * E-mail : faisalamircs@gmail.com @@ -15,34 +25,63 @@ import androidx.viewbinding.ViewBinding * ----------------------------------------- * Copyright (C) Frogobox ID / amirisback * All rights reserved + * */ - -abstract class BaseKeyboard( +abstract class BaseKeyboard @JvmOverloads constructor( context: Context, - attrs: AttributeSet?, -) : LinearLayout(context, attrs) { + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + // Backing property for view binding + private var _binding: VB? = null + val binding: VB + get() = _binding ?: throw IllegalStateException("Binding is accessed before setup or after onDestroy()") - var binding: T? = null + // Current input connection to communicate with the EditText / InputMethod + var currentInputConnection: InputConnection? = null + private set - var currentInputConnection : InputConnection? = null + /** + * Inflate and return the [ViewBinding] for this keyboard. + * Typically use: `MyKeyboardBinding.inflate(LayoutInflater.from(context), this, true)` + */ + protected abstract fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): VB - abstract fun setupViewBinding(): T + /** + * Called once after the binding has been created and attached. + * Use this to initialize your views and listeners. + */ + protected abstract fun onCreate() - abstract fun onCreate() + /** + * Called when the keyboard is being destroyed or detached. + * Override to release resources or remove callbacks. + */ + protected open fun onDestroy() {} init { - binding = setupViewBinding() - onCreate() + orientation = VERTICAL + initialize() } - constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs) { - binding = setupViewBinding() + private fun initialize() { + _binding = setupViewBinding(LayoutInflater.from(context), this) onCreate() } - fun setInputConnection(inputConnection: InputConnection) { - Log.d("BaseKeyboard", "setInputConnection: $inputConnection") + /** + * Assigns the active [InputConnection]. + * This allows sending key events or text input to the connected field. + */ + fun setInputConnection(inputConnection: InputConnection?) { currentInputConnection = inputConnection } -} \ No newline at end of file + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + onDestroy() + _binding = null + currentInputConnection = null + } +} diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboardIME.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboardIME.kt index 2494322..54429fd 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboardIME.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboardIME.kt @@ -1,7 +1,6 @@ package com.frogobox.libkeyboard.common.core import android.inputmethodservice.InputMethodService -import android.os.Build import android.text.InputType import android.text.InputType.TYPE_CLASS_DATETIME import android.text.InputType.TYPE_CLASS_NUMBER @@ -17,7 +16,6 @@ import android.view.inputmethod.EditorInfo.IME_MASK_ACTION import android.view.inputmethod.ExtractedTextRequest import android.view.inputmethod.InputConnection import android.widget.EditText -import androidx.annotation.RequiresApi import androidx.viewbinding.ViewBinding import com.frogobox.libkeyboard.R import com.frogobox.libkeyboard.ui.main.ItemMainKeyboard @@ -109,7 +107,7 @@ abstract class BaseKeyboardIME : InputMethodService(), OnKeybo updateShiftKeyState() } - @RequiresApi(Build.VERSION_CODES.M) + override fun onKey(code: Int) { var inputConnection = currentInputConnection onKeyExt(code, inputConnection) @@ -179,26 +177,17 @@ abstract class BaseKeyboardIME : InputMethodService(), OnKeybo } } - override fun initBackToMainKeyboard() { + override fun initBackToMainKeyboard() {} - } - - override fun setupFeatureKeyboard() { - - } + override fun setupFeatureKeyboard() {} override fun initView() { setupFeatureKeyboard() initBackToMainKeyboard() } - override fun invalidateAllKeys() { - - } - - @RequiresApi(Build.VERSION_CODES.M) - override fun runEmojiBoard() { - } + override fun invalidateAllKeys() {} + override fun runEmojiBoard() {} override fun updateShiftKeyState() { if (keyboardMode == KEYBOARD_LETTERS) { @@ -212,7 +201,7 @@ abstract class BaseKeyboardIME : InputMethodService(), OnKeybo } } - @RequiresApi(Build.VERSION_CODES.M) + override fun onKeyExt(code: Int, inputConnection: InputConnection) { if (keyboard == null) { return diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/IKeyboardIME.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/IKeyboardIME.kt index b61225f..46f1951 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/IKeyboardIME.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/IKeyboardIME.kt @@ -1,9 +1,7 @@ package com.frogobox.libkeyboard.common.core -import android.os.Build import android.view.inputmethod.InputConnection import android.widget.EditText -import androidx.annotation.RequiresApi /** * Created by Faisal Amir on 24/10/22 @@ -46,12 +44,12 @@ interface IKeyboardIME { fun invalidateAllKeys() - @RequiresApi(Build.VERSION_CODES.M) + fun runEmojiBoard() fun updateShiftKeyState() - @RequiresApi(Build.VERSION_CODES.M) + fun onKeyExt(code: Int, inputConnection: InputConnection) fun moveCursor(moveRight: Boolean) diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/emoji/EmojiKeyboard.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/emoji/EmojiKeyboard.kt index bec8e6a..5671c71 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/emoji/EmojiKeyboard.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/emoji/EmojiKeyboard.kt @@ -3,13 +3,12 @@ package com.frogobox.libkeyboard.ui.emoji import android.content.Context import android.graphics.Paint import android.graphics.Typeface -import android.os.Build import android.os.Handler import android.os.Looper import android.util.AttributeSet import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.RequiresApi +import android.widget.LinearLayout import androidx.emoji2.text.EmojiCompat import com.frogobox.libkeyboard.R import com.frogobox.libkeyboard.common.core.BaseKeyboard @@ -39,20 +38,18 @@ class EmojiKeyboard( var mOnKeyboardActionListener: OnKeyboardActionListener? = null - override fun setupViewBinding(): KeyboardEmojiBinding { + override fun setupViewBinding(inflater: LayoutInflater, parent: LinearLayout): KeyboardEmojiBinding { return KeyboardEmojiBinding.inflate(LayoutInflater.from(context), this, true) } override fun onCreate() { } - @RequiresApi(Build.VERSION_CODES.M) fun openEmojiPalette() { setupEmojis(EmojiCategoryType.GENERAL.path) setupEmojiCategory() } - @RequiresApi(Build.VERSION_CODES.M) private fun setupEmojiCategory() { val adapterCallback = object : IFrogoBindingAdapter { @@ -99,7 +96,7 @@ class EmojiKeyboard( } } - binding?.apply { + binding.apply { emojiCategoryList.injectorBinding() .addData(getEmojiCategory()) .addCallback(adapterCallback) @@ -108,7 +105,6 @@ class EmojiKeyboard( } } - @RequiresApi(Build.VERSION_CODES.M) private fun setupEmojis(path: String) { ensureBackgroundThread { val fullEmojiList = parseRawEmojiSpecsFile(context, path) @@ -178,7 +174,7 @@ class EmojiKeyboard( val emojiItemWidth = context.resources.getDimensionPixelSize(R.dimen.emoji_item_size) val mLayoutManager = AutoGridLayoutManager(context, emojiItemWidth) - binding?.apply { + binding.apply { emojiList.injectorBinding() .addCallback(adapterCallback) .addData(emojis) diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/main/MainKeyboard.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/main/MainKeyboard.kt index 7059c0b..7192413 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/main/MainKeyboard.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/ui/main/MainKeyboard.kt @@ -2,19 +2,29 @@ package com.frogobox.libkeyboard.ui.main import android.annotation.SuppressLint import android.content.Context -import android.graphics.* +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint import android.graphics.Paint.Align +import android.graphics.PorterDuff +import android.graphics.Rect +import android.graphics.Typeface import android.graphics.drawable.LayerDrawable -import android.os.Build import android.os.Handler import android.os.Message import android.util.AttributeSet import android.util.TypedValue -import android.view.* +import android.view.Gravity +import android.view.HapticFeedbackConstants +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityManager -import android.widget.* -import androidx.annotation.RequiresApi +import android.widget.PopupWindow +import android.widget.TextView import androidx.core.content.res.ResourcesCompat import com.frogobox.libkeyboard.R import com.frogobox.libkeyboard.common.ext.adjustAlpha @@ -30,7 +40,8 @@ import com.frogobox.libkeyboard.ui.main.ItemMainKeyboard.Companion.SHIFT_OFF import com.frogobox.libkeyboard.ui.main.ItemMainKeyboard.Companion.SHIFT_ON_ONE_CHAR import com.frogobox.libkeyboard.ui.main.ItemMainKeyboard.Companion.SHIFT_ON_PERMANENT import com.frogobox.sdk.ext.getColorExt -import java.util.* +import java.util.Arrays +import java.util.Locale import kotlin.math.floor import kotlin.math.max import kotlin.math.min @@ -221,7 +232,7 @@ class MainKeyboard @JvmOverloads constructor( } } - @RequiresApi(Build.VERSION_CODES.M) + override fun onVisibilityChanged(changedView: View, visibility: Int) { super.onVisibilityChanged(changedView, visibility) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 619f27b..224b4be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,16 +1,16 @@ [versions] -agp = "8.12.2" -kotlin = "2.2.10" -ksp = "2.2.10-2.0.2" -liveCycle = "2.9.3" +agp = "8.13.0" +kotlin = "2.2.21" +ksp = "2.2.21-2.0.4" +liveCycle = "2.9.4" -roomKtx = "2.7.2" -work = "2.10.3" -glideCompiler = "4.16.0" +roomKtx = "2.8.3" +work = "2.11.0" +glideCompiler = "5.0.5" -hilt = "2.57.1" -emoji2 = "1.5.0" -frogoAndroid = "2.3.2" +hilt = "2.57.2" +emoji2 = "1.6.0" +frogoAndroid = "2.3.6" frogoconsumeapi = "2.6.1" [libraries] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 21d1384..46fd8dc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Nov 03 18:01:05 WIB 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 63284f7ffde5843d9666ba32f592cde4ec766b0f Mon Sep 17 00:00:00 2001 From: amirisback Date: Sun, 9 Nov 2025 09:48:19 +0700 Subject: [PATCH 2/3] update: enhance code and update libs --- .../appkeyboard/services/KeyboardIME.kt | 2 +- .../ui/keyboard/autotext/AutoTextKeyboard.kt | 11 +++----- .../ui/keyboard/form/FormKeyboard.kt | 8 ++---- .../ui/keyboard/movie/MovieKeyboard.kt | 12 ++++---- .../templatetext/TemplateTextKeyboard.kt | 19 ++++++------- .../ui/keyboard/webview/WebiewKeyboard.kt | 7 ++--- frogo-keyboard/build.gradle.kts | 28 ++----------------- .../libkeyboard/common/core/BaseKeyboard.kt | 8 +++++- gradle.properties | 14 ++++------ 9 files changed, 38 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt b/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt index 4a1449a..74ccc37 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt @@ -80,7 +80,7 @@ class KeyboardIME : BaseKeyboardIME() { } override fun invalidateKeyboard() { - binding?.keyboardAutotext?.setupData() + binding?.keyboardAutotext?.initData() setupFeatureKeyboard() } diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt index e2623e5..c91974d 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/autotext/AutoTextKeyboard.kt @@ -27,18 +27,15 @@ class AutoTextKeyboard( return KeyboardAutotextBinding.inflate(LayoutInflater.from(context), this, true) } - override fun onCreate() { - initView() - setupData() - } - - private fun initView() { + override fun initUI() { + super.initUI() binding.apply { tvToolbarTitle.text = "Auto Text" } } - fun setupData() { + override fun initData() { + super.initData() val viewModel = AutoTextKeyboardViewModel(context) viewModel.getAutoText { setupRv(it) diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt index 3fe7a7c..f3fb5b2 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/form/FormKeyboard.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout import com.frogobox.appkeyboard.databinding.KeyboardFormBinding +import com.frogobox.appkeyboard.ui.keyboard.autotext.AutoTextKeyboardViewModel import com.frogobox.appkeyboard.ui.keyboard.movie.MovieKeyboard import com.frogobox.appkeyboard.util.KeyboardNavigationHelper import com.frogobox.libkeyboard.common.core.BaseKeyboard @@ -30,11 +31,8 @@ class FormKeyboard( return KeyboardFormBinding.inflate(LayoutInflater.from(context), this, true) } - override fun onCreate() { - initView() - } - - private fun initView() { + override fun initUI() { + super.initUI() binding.apply { btnSubmit.setOnClickListener { KeyboardNavigationHelper.navigateTo(this@FormKeyboard, destinationKeyboard) diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt index 8908bf1..5844d78 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/movie/MovieKeyboard.kt @@ -40,18 +40,16 @@ class MovieKeyboard( return KeyboardGridBinding.inflate(LayoutInflater.from(context), this, true) } - override fun onCreate() { - setupData() - initView() - } - - private fun initView() { + override fun initUI() { + super.initUI() binding.apply { tvToolbarTitle.text = "Movie Api" } } - private fun setupData() { + override fun initData() { + super.initData() + val consumeMovieApi = ConsumeMovieApi(MovieUrl.API_KEY) // Your API_KEY consumeMovieApi.getTrendingMovieDay(object : FrogoDataResponse> { override fun onFailed(statusCode: Int, errorMessage: String) {} diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt index 3dc59c0..64a1957 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/templatetext/TemplateTextKeyboard.kt @@ -30,8 +30,14 @@ class TemplateTextKeyboard( return KeyboardAutotextBinding.inflate(LayoutInflater.from(context), this, true) } - override fun onCreate() { - initView() + override fun initUI() { + super.initUI() + typePlayStore?.let { setupContent(it) } + } + + fun setupTemplateTextType(templateTextType: KeyboardFeatureType) { + this.typePlayStore = templateTextType + setupContent(templateTextType) } private fun setupContent(templateTextType: KeyboardFeatureType) { @@ -75,15 +81,6 @@ class TemplateTextKeyboard( setupRv(list) } - private fun initView() { - typePlayStore?.let { setupContent(it) } - } - - fun setupTemplateTextType(templateTextType: KeyboardFeatureType) { - this.typePlayStore = templateTextType - setupContent(templateTextType) - } - private fun getTitleText(title: String): String { return title.replace("TEMPLATE_TEXT_", "") } diff --git a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt index 4da82d3..2a51fcc 100644 --- a/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt +++ b/app/src/main/java/com/frogobox/appkeyboard/ui/keyboard/webview/WebiewKeyboard.kt @@ -27,11 +27,8 @@ class WebiewKeyboard( return KeyboardWebviewBinding.inflate(LayoutInflater.from(context), this, true) } - override fun onCreate() { - initView() - } - - private fun initView() { + override fun initUI() { + super.initUI() binding.apply { webview.loadUrlFrogoExt("https://www.google.com") } diff --git a/frogo-keyboard/build.gradle.kts b/frogo-keyboard/build.gradle.kts index 281ad47..28265bd 100644 --- a/frogo-keyboard/build.gradle.kts +++ b/frogo-keyboard/build.gradle.kts @@ -20,8 +20,9 @@ android { } buildTypes { - release { + getByName("release") { isMinifyEnabled = false + proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" @@ -59,36 +60,11 @@ dependencies { afterEvaluate { publishing { publications { - - repositories { - maven { - name = LibrarySetting.LIB_NAME - url = uri(LibrarySetting.MAVEN_URI) - credentials { - username = project.findProperty("gpr.user") as String? ?: "" - password = project.findProperty("gpr.key") as String? ?: "" - } - } - } - - // Creates a Maven publication called "release". register("release", MavenPublication::class) { - - // Applies the component for the release build variant. - // NOTE : Delete this line code if you publish Native Java / Kotlin Library from(components["release"]) - - // Library Package Name (Example : "com.frogobox.androidfirstlib") - // NOTE : Different GroupId For Each Library / Module, So That Each Library Is Not Overwritten groupId = LibrarySetting.GROUP_ID - - // Library Name / Module Name (Example : "androidfirstlib") - // NOTE : Different ArtifactId For Each Library / Module, So That Each Library Is Not Overwritten artifactId = LibrarySetting.ARTIFACT_ID - - // Version Library Name (Example : "1.0.0") version = ProjectSetting.PROJECT_VERSION_NAME - } } } diff --git a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt index b5dcad4..0074930 100644 --- a/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt +++ b/frogo-keyboard/src/main/java/com/frogobox/libkeyboard/common/core/BaseKeyboard.kt @@ -52,7 +52,10 @@ abstract class BaseKeyboard @JvmOverloads constructor( * Called once after the binding has been created and attached. * Use this to initialize your views and listeners. */ - protected abstract fun onCreate() + protected open fun onCreate() { + initUI() + initData() + } /** * Called when the keyboard is being destroyed or detached. @@ -60,6 +63,9 @@ abstract class BaseKeyboard @JvmOverloads constructor( */ protected open fun onDestroy() {} + open fun initUI() {} + open fun initData() {} + init { orientation = VERTICAL initialize() diff --git a/gradle.properties b/gradle.properties index 3675ef5..b5b0a35 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,21 +6,19 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4608m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.daemon=false +org.gradle.parallel=false # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app"s APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true -android.nonFinalResIds=false \ No newline at end of file +android.nonTransitiveRClass=false +android.nonFinalResIds=false From 4ad5cd6e9b9802e8c9e0423339dad50e67c720b4 Mon Sep 17 00:00:00 2001 From: amirisback Date: Sun, 9 Nov 2025 10:13:25 +0700 Subject: [PATCH 3/3] Release v1.2.2 --- README.md | 6 +++--- buildSrc/src/main/kotlin/ProjectSetting.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 694592d..ef4ccf1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ## Version Release This Is Latest Release - $version_release = 1.2.1 + $version_release = 1.2.2 What's New?? @@ -65,14 +65,14 @@ allprojects { dependencies { // library frogo-keyboard - implementation 'com.github.amirisback:keyboard:1.2.1' + implementation 'com.github.amirisback:keyboard:1.2.2' } ####