Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
## Version Release
This Is Latest Release

$version_release = 1.2.1
$version_release = 1.2.2

What's New??

Expand Down Expand Up @@ -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'
}

#### <Option 2> Kotlin DSL Gradle

dependencies {
// library frogo-keyboard
implementation("com.github.amirisback:keyboard:1.2.1")
implementation("com.github.amirisback:keyboard:1.2.2")
}

### Step 3. Create Layout Keyboard IME
Expand Down Expand Up @@ -526,7 +526,7 @@ class KeyboardIME : BaseKeyboardIME<YourIMELayoutBinding>() {

### 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
Expand Down
13 changes: 9 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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
Expand All @@ -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"
Expand Down Expand Up @@ -90,8 +95,8 @@ android {
}

buildFeatures {
viewBinding = true
buildConfig = true
viewBinding = true
}

compileOptions {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
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
* https://github.com/amirisback
*/


abstract class BaseViewModel : FrogoViewModel2() {
abstract class BaseViewModel : FrogoViewModel() {

}
155 changes: 155 additions & 0 deletions app/src/main/java/com/frogobox/appkeyboard/common/ext/DateExt.kt
Original file line number Diff line number Diff line change
@@ -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
}
50 changes: 24 additions & 26 deletions app/src/main/java/com/frogobox/appkeyboard/services/KeyboardIME.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -82,7 +80,7 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {
}

override fun invalidateKeyboard() {
binding?.keyboardAutotext?.setupData()
binding?.keyboardAutotext?.initData()
setupFeatureKeyboard()
}

Expand Down Expand Up @@ -119,7 +117,7 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {
keyboardWebview.gone()
keyboardForm.gone()
keyboardEmoji.gone()
keyboardEmoji.binding?.emojiList?.scrollToPosition(0)
keyboardEmoji.binding.emojiList.scrollToPosition(0)
}
}

Expand All @@ -144,38 +142,38 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {

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()
}
Expand Down Expand Up @@ -265,9 +263,9 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {
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()
Expand Down Expand Up @@ -330,26 +328,26 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {
}
}

@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
}

Expand All @@ -371,7 +369,7 @@ class KeyboardIME : BaseKeyboardIME<KeyboardImeBinding>() {
binding?.keyboardMain?.invalidateAllKeys()
}

@RequiresApi(Build.VERSION_CODES.M)

override fun runEmojiBoard() {
binding?.keyboardEmoji?.visible()
binding?.keyboardMain?.invisible()
Expand Down
Loading