{"id":17551507,"url":"https://github.com/amirisback/keyboard","last_synced_at":"2025-04-05T09:05:08.248Z","repository":{"id":64017211,"uuid":"560670715","full_name":"amirisback/keyboard","owner":"amirisback","description":"Custom Keyboard Like Google Keyboard","archived":false,"fork":false,"pushed_at":"2024-11-14T07:03:25.000Z","size":7127,"stargazers_count":114,"open_issues_count":5,"forks_count":33,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-29T08:04:05.487Z","etag":null,"topics":["android","android-custom-keyboard","custom-keyboard","keyboard","layout-in-keyboard","soft-keyboard"],"latest_commit_sha":null,"homepage":"https://amirisback.github.io/keyboard/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amirisback.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["amirisback","castariva18","fiqryq"],"patreon":null,"open_collective":null,"ko_fi":"amirisback","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":"https://saweria.co/amirisback"}},"created_at":"2022-11-02T02:05:15.000Z","updated_at":"2025-03-25T16:09:48.000Z","dependencies_parsed_at":"2023-09-24T12:16:11.743Z","dependency_job_id":"39dfd079-f7c5-4891-a95d-4af076417ad8","html_url":"https://github.com/amirisback/keyboard","commit_stats":{"total_commits":184,"total_committers":4,"mean_commits":46.0,"dds":0.03260869565217395,"last_synced_commit":"7faac091042935dcacb4dd43f2c00becdefa47d7"},"previous_names":["amirisback/frogo-keyboard-open-source"],"tags_count":19,"template":true,"template_full_name":"armorycodes/android-research-tech-deprecated","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amirisback%2Fkeyboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amirisback%2Fkeyboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amirisback%2Fkeyboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amirisback%2Fkeyboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amirisback","download_url":"https://codeload.github.com/amirisback/keyboard/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247312077,"owners_count":20918344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-custom-keyboard","custom-keyboard","keyboard","layout-in-keyboard","soft-keyboard"],"created_at":"2024-10-21T04:46:22.656Z","updated_at":"2025-04-05T09:05:08.208Z","avatar_url":"https://github.com/amirisback.png","language":"Kotlin","funding_links":["https://github.com/sponsors/amirisback","https://github.com/sponsors/castariva18","https://github.com/sponsors/fiqryq","https://ko-fi.com/amirisback","https://saweria.co/amirisback"],"categories":[],"sub_categories":[],"readme":"![Banner](/docs/image/banner-frogo-keyboard.png)\n[![Jitpack Io](https://jitpack.io/v/amirisback/keyboard.svg?style=flat-square)](https://jitpack.io/#amirisback/keyboard)\n[![Android CI](https://github.com/amirisback/keyboard/actions/workflows/android-ci.yml/badge.svg)](https://github.com/amirisback/keyboard/actions/workflows/android-ci.yml)\n[![Scan with Detekt](https://github.com/amirisback/keyboard/actions/workflows/detekt-analysis.yml/badge.svg)](https://github.com/amirisback/keyboard/actions/workflows/detekt-analysis.yml)\n[![Google Badge](https://img.shields.io/badge/Google%20Dev%20Library-keyboard-orange?style=flat-square)](https://devlibrary.withgoogle.com/products/android/repos/amirisback-keyboard)\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-Keyboard-brightgreen.svg?style=flat-square)](https://android-arsenal.com/details/1/8434)\n\n- Simple research keyboard for Android\n- Custom Keyboard\n- Emoji Custom Keyboard\n- Call API inside Keyboard\n- Open Form inside Keyboard\n- Support Dark Theme\n- AutoText Feature\n- Setup Toggle Feature\n\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.frogobox.frogokeyboard\"\u003e\n  \u003cimg width=\"200px\" height=\"75px\" src=\"https://amirisback.github.io/amirisback/docs/image/google-play-badge.png\"\u003e\n\u003c/a\u003e\n\n## Version Release\nThis Is Latest Release\n\n    $version_release = 1.1.7\n\nWhat's New??\n\n    * Avaiable in dark mode *\n    * Enhance Performance *\n    * Easy Change Background Keyboard *\n    * Setup Theme *\n\n## How To Use As Library (Coming Soon)\n\n### Step 1. Add the JitPack repository to your build file (build.gradle : Project)\n\n#### \u003cOption 1\u003e Groovy Gradle\n\n    // Add it in your root build.gradle at the end of repositories:\n\n    allprojects {\n        repositories {\n            ...\n            maven { url 'https://jitpack.io' }\n        }\n    }\n\n#### \u003cOption 2\u003e Kotlin DSL Gradle\n\n```kotlin\n// Add it in your root build.gradle.kts at the end of repositories:\n\nallprojects {\n    repositories {\n        ...\n        maven(\"https://jitpack.io\")\n    }\n}\n```\n\n\n### Step 2. Add the dependency (build.gradle : Module)\n\n#### \u003cOption 1\u003e Groovy Gradle\n\n    dependencies {\n        // library frogo-keyboard\n        implementation 'com.github.amirisback:keyboard:1.1.7'\n    }\n\n#### \u003cOption 2\u003e Kotlin DSL Gradle\n\n    dependencies {\n        // library frogo-keyboard\n        implementation(\"com.github.amirisback:keyboard:1.1.7\")\n    }\n\n### Step 3. Create Layout Keyboard IME\n```xml\n\u003candroidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/keyboard_holder\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@color/keyboard_bg_root\"\u003e\n\n    \u003c!--  start of base keyboard--\u003e\n    \u003cLinearLayout\n        android:id=\"@+id/container_keyboard_main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\u003e\n\n        \u003candroidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/keyboard_header\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/keyboard_bg_root\"\n            android:minHeight=\"@dimen/frogo_dimen_64dp\" /\u003e\n\n        \u003ccom.frogobox.libkeyboard.ui.main.MainKeyboard\n            android:id=\"@+id/keyboard_main\"\n            style=\"@style/KwKeyboardView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/theme_dark_background_color\" /\u003e\n\n    \u003c/LinearLayout\u003e\n    \u003c!--   End of base keyboard--\u003e\n\n    \u003c!--  below is the layout for your header menu on top of your base keyboard --\u003e\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.autotext.AutoTextKeyboard\n        android:id=\"@+id/keyboard_autotext\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.templatetext.TemplateTextKeyboard\n        android:id=\"@+id/keyboard_template_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.news.NewsKeyboard\n        android:id=\"@+id/keyboard_news\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.movie.MovieKeyboard\n        android:id=\"@+id/keyboard_moview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.webview.WebiewKeyboard\n        android:id=\"@+id/keyboard_webview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n    \u003ccom.frogobox.appkeyboard.ui.keyboard.form.FormKeyboard\n        android:id=\"@+id/keyboard_form\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n    \u003c!--  end of header menu layout --\u003e\n\n    \u003ccom.frogobox.libkeyboard.ui.emoji.EmojiKeyboard\n        android:id=\"@+id/keyboard_emoji\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@id/container_keyboard_main\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@id/container_keyboard_main\" /\u003e\n\n\u003c/androidx.constraintlayout.widget.ConstraintLayout\u003e\n```\n\n### Step 4. Create Service Keyboard IME\n\n#### Create Class Keyboard IME\n```kotlin\nclass KeyboardIME : BaseKeyboardIME\u003cYourIMELayoutBinding\u003e() {\n  \n  // set your custom keyboard layout\n  override fun setupViewBinding(): YourIMELayoutBinding {\n    return YourIMELayoutBinding.inflate(LayoutInflater.from(this), null, false)\n  }\n\n  override fun initialSetupKeyboard() {\n    binding?.keyboardMain?.setKeyboard(keyboard!!) // your base keyboard\n    binding?.mockMeasureHeightKeyboardMain?.setKeyboard(keyboard!!) // this code is for your keyboard header menu \n  }\n\n  override fun setupBinding() {\n    initialSetupKeyboard()\n    binding?.keyboardMain?.mOnKeyboardActionListener = this\n    binding?.keyboardEmoji?.mOnKeyboardActionListener = this\n  }\n\n  // redraw keyboard for capslock on/off state\n  override fun invalidateAllKeys() {\n    binding?.keyboardMain?.invalidateAllKeys()\n  }\n\n  // call this function when navigating to your feature\n  override fun hideMainKeyboard() {\n    binding?.apply {\n      keyboardMain.gone()\n      keyboardHeader.gone()\n      mockMeasureHeightKeyboard.invisible()\n    }\n  }\n\n  override fun showOnlyKeyboard() {\n    binding?.keyboardMain?.visible()\n  }\n\n  override fun hideOnlyKeyboard() {\n    binding?.keyboardMain?.visible()\n  }\n\n  // setup emoji keyboard \n  override fun runEmojiBoard() {\n    binding?.keyboardEmoji?.visible()\n    hideMainKeyboard()\n    binding?.keyboardEmoji?.openEmojiPalette()\n  }\n}\n```\n\n### For Emoji Keyboard, dont forget to implement Dependency Injection to load emoji asset manager\n```kotlin\n@HiltAndroidApp\nclass App: Application() {\n  override fun onCreate() {\n    super.onCreate()\n    setupEmojiCompat()\n  }\n\n  private fun setupEmojiCompat() {\n    val config = BundledEmojiCompatConfig(this)\n    EmojiCompat.init(config)\n  }\n}\n```\n\n### Step 5. Add keyboard header menu\n\n### setup keyboard header icon \u0026 menu name\n```kotlin\nclass KeyboardUtil {\n\n    private val pref: PreferenceDelegatesImpl by inject(PreferenceDelegatesImpl::class.java)\n\n    fun menuToggle(): List\u003cKeyboardFeature\u003e {\n        return listOf(\n            KeyboardFeature(\n                KeyboardFeatureType.AUTO_TEXT.id,\n                KeyboardFeatureType.AUTO_TEXT,\n                R.drawable.ic_menu_auto_text,\n                pref.getPrefBoolean(KeyboardFeatureType.AUTO_TEXT.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.TEMPLATE_TEXT_APP.id,\n                KeyboardFeatureType.TEMPLATE_TEXT_APP,\n                R.drawable.ic_menu_ps_app,\n                pref.getPrefBoolean(KeyboardFeatureType.TEMPLATE_TEXT_APP.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.TEMPLATE_TEXT_GAME.id,\n                KeyboardFeatureType.TEMPLATE_TEXT_GAME,\n                R.drawable.ic_menu_ps_game,\n                pref.getPrefBoolean(KeyboardFeatureType.TEMPLATE_TEXT_GAME.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.TEMPLATE_TEXT_LOVE.id,\n                KeyboardFeatureType.TEMPLATE_TEXT_LOVE,\n                R.drawable.ic_menu_ps_love,\n                pref.getPrefBoolean(KeyboardFeatureType.TEMPLATE_TEXT_LOVE.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.TEMPLATE_TEXT_GREETING.id,\n                KeyboardFeatureType.TEMPLATE_TEXT_GREETING,\n                R.drawable.ic_menu_ps_greeting,\n                pref.getPrefBoolean(KeyboardFeatureType.TEMPLATE_TEXT_GREETING.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.TEMPLATE_TEXT_SALE.id,\n                KeyboardFeatureType.TEMPLATE_TEXT_SALE,\n                R.drawable.ic_menu_ps_sale,\n                pref.getPrefBoolean(KeyboardFeatureType.TEMPLATE_TEXT_SALE.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.NEWS.id,\n                KeyboardFeatureType.NEWS,\n                R.drawable.ic_menu_news,\n                pref.getPrefBoolean(KeyboardFeatureType.NEWS.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.MOVIE.id,\n                KeyboardFeatureType.MOVIE,\n                R.drawable.ic_menu_movie,\n                pref.getPrefBoolean(KeyboardFeatureType.MOVIE.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.WEB.id,\n                KeyboardFeatureType.WEB,\n                R.drawable.ic_menu_website,\n                pref.getPrefBoolean(KeyboardFeatureType.WEB.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.FORM.id,\n                KeyboardFeatureType.FORM,\n                R.drawable.ic_menu_form,\n                pref.getPrefBoolean(KeyboardFeatureType.FORM.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.CHANGE_KEYBOARD.id,\n                KeyboardFeatureType.CHANGE_KEYBOARD,\n                R.drawable.ic_menu_keyboard,\n                pref.getPrefBoolean(KeyboardFeatureType.CHANGE_KEYBOARD.id, true)\n            ),\n            KeyboardFeature(\n                KeyboardFeatureType.SETTING.id,\n                KeyboardFeatureType.SETTING,\n                R.drawable.ic_menu_setting,\n                pref.getPrefBoolean(KeyboardFeatureType.SETTING.id, true)\n            )\n        ).sortedBy { it.state }\n    }\n\n    fun menuKeyboard(): List\u003cKeyboardFeature\u003e {\n        val listFeature = mutableListOf\u003cKeyboardFeature\u003e()\n        menuToggle().forEach { data -\u003e\n            if (data.state) {\n                listFeature.add(data)\n            }\n        }\n        return listFeature\n    }\n\n}\n```\n\n### setup keyboard header feature on KeyboardIME class\n```kotlin\nclass KeyboardIME : BaseKeyboardIME\u003cYourIMELayoutBinding\u003e() {\n    // ...\n\n  override fun setupFeatureKeyboard() {\n    val maxMenu = 4\n    val gridSize = if (KeyboardUtil().menuKeyboard().size \u003c= maxMenu) {\n      KeyboardUtil().menuKeyboard().size\n    } else if (KeyboardUtil().menuKeyboard().size.mod(maxMenu) == 0) {\n      maxMenu\n    } else {\n      maxMenu + 1\n    }\n\n    binding?.apply {\n      if (KeyboardUtil().menuKeyboard().isEmpty()) {\n        keyboardHeader.gone()\n        mockKeyboardHeader.gone()\n      } else {\n        keyboardHeader.visible()\n        mockKeyboardHeader.visible()\n        keyboardHeader.injectorBinding\u003cKeyboardFeature, ItemKeyboardHeaderBinding\u003e()\n          .addData(KeyboardUtil().menuKeyboard())\n          .addCallback(object :\n            IFrogoBindingAdapter\u003cKeyboardFeature, ItemKeyboardHeaderBinding\u003e {\n\n            override fun setViewBinding(parent: ViewGroup): ItemKeyboardHeaderBinding {\n              return ItemKeyboardHeaderBinding.inflate(\n                LayoutInflater.from(parent.context),\n                parent,\n                false\n              )\n            }\n\n            override fun setupInitComponent(\n              binding: ItemKeyboardHeaderBinding,\n              data: KeyboardFeature,\n              position: Int,\n              notifyListener: FrogoRecyclerNotifyListener\u003cKeyboardFeature\u003e,\n            ) {\n              binding.ivIcon.setImageResource(data.icon)\n              binding.tvTitle.text = data.type.title\n\n              if (data.state) {\n                binding.root.visible()\n              } else {\n                binding.root.gone()\n              }\n\n            }\n\n            override fun onItemClicked(\n              binding: ItemKeyboardHeaderBinding,\n              data: KeyboardFeature,\n              position: Int,\n              notifyListener: FrogoRecyclerNotifyListener\u003cKeyboardFeature\u003e,\n            ) {\n\n              when (data.type) {\n                KeyboardFeatureType.NEWS -\u003e {\n                  hideMainKeyboard()\n                  keyboardNews.visible()\n                }\n\n                KeyboardFeatureType.MOVIE -\u003e {\n                  hideMainKeyboard()\n                  keyboardMoview.visible()\n                }\n\n                KeyboardFeatureType.WEB -\u003e {\n                  mockMeasureHeightKeyboard.invisible()\n                  keyboardHeader.gone()\n                  keyboardWebview.visible()\n                }\n\n                KeyboardFeatureType.FORM -\u003e {\n                  hideMainKeyboard()\n\n                  keyboardForm.visible()\n                  keyboardForm.binding?.etText?.showKeyboardExt()\n                  keyboardForm.binding?.etText2?.showKeyboardExt()\n                  keyboardForm.binding?.etText3?.showKeyboardExt()\n\n                  keyboardForm.setOnClickListener {\n                    hideOnlyKeyboard()\n                  }\n                }\n\n                KeyboardFeatureType.AUTO_TEXT -\u003e {\n                  hideMainKeyboard()\n                  keyboardAutotext.visible()\n                }\n\n                KeyboardFeatureType.TEMPLATE_TEXT_GAME -\u003e {\n                  hideMainKeyboard()\n                  keyboardTemplateText.setupTemplateTextType(KeyboardFeatureType.TEMPLATE_TEXT_GAME)\n                  keyboardTemplateText.visible()\n                }\n\n                KeyboardFeatureType.TEMPLATE_TEXT_APP -\u003e {\n                  hideMainKeyboard()\n                  keyboardTemplateText.setupTemplateTextType(KeyboardFeatureType.TEMPLATE_TEXT_APP)\n                  keyboardTemplateText.visible()\n                }\n\n                KeyboardFeatureType.TEMPLATE_TEXT_SALE -\u003e {\n                  hideMainKeyboard()\n                  keyboardTemplateText.setupTemplateTextType(KeyboardFeatureType.TEMPLATE_TEXT_SALE)\n                  keyboardTemplateText.visible()\n                }\n\n                KeyboardFeatureType.TEMPLATE_TEXT_LOVE -\u003e {\n                  hideMainKeyboard()\n                  keyboardTemplateText.setupTemplateTextType(KeyboardFeatureType.TEMPLATE_TEXT_LOVE)\n                  keyboardTemplateText.visible()\n                }\n\n                KeyboardFeatureType.TEMPLATE_TEXT_GREETING -\u003e {\n                  hideMainKeyboard()\n                  keyboardTemplateText.setupTemplateTextType(KeyboardFeatureType.TEMPLATE_TEXT_GREETING)\n                  keyboardTemplateText.visible()\n                }\n\n                KeyboardFeatureType.CHANGE_KEYBOARD -\u003e {\n                  (getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager).showInputMethodPicker()\n                }\n\n                KeyboardFeatureType.SETTING -\u003e {\n                  binding.root.context.startActivity(\n                    Intent(binding.root.context, MainActivity::class.java).apply {\n                      addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                    })\n                }\n\n              }\n\n            }\n\n            override fun onItemLongClicked(\n              binding: ItemKeyboardHeaderBinding,\n              data: KeyboardFeature,\n              position: Int,\n              notifyListener: FrogoRecyclerNotifyListener\u003cKeyboardFeature\u003e,\n            ) {\n            }\n\n\n          })\n          .createLayoutGrid(gridSize)\n          .build()\n      }\n    }\n  }\n    \n    // ...\n}\n```\n\n### if your feature is using a textfield, add below code to your KeyboardIME class\n```kotlin\n@RequiresApi(Build.VERSION_CODES.M)\n    override fun onKey(code: Int) {\n        val formView = binding?.keyboardForm\n        var inputConnection = currentInputConnection\n\n        if (formView?.visibility == View.VISIBLE) {\n            val et1 = formView.binding?.etText\n            val et1Connection = et1?.onCreateInputConnection(EditorInfo())\n\n            val et2 = formView.binding?.etText2\n            val et2Connection = et2?.onCreateInputConnection(EditorInfo())\n\n            val et3 = formView.binding?.etText3\n            val et3Connection = et3?.onCreateInputConnection(EditorInfo())\n\n            if (et1?.isFocused == true) {\n                inputConnection = et1Connection\n            } else if (et2?.isFocused == true) {\n                inputConnection = et2Connection\n            } else if (et3?.isFocused == true) {\n                inputConnection = et3Connection\n            }\n\n        } else if (binding?.keyboardWebview?.visibility == View.VISIBLE) {\n            inputConnection =\n                binding?.keyboardWebview?.binding?.webview?.onCreateInputConnection(EditorInfo())\n        } else {\n            inputConnection = currentInputConnection\n        }\n        onKeyExt(code, inputConnection)\n    }\n```\n\n### Step 6. Create keys_config.xml inside xml folder\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cinput-method xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:icon=\"@drawable/ic_frogobox\"\n    android:settingsActivity=\"com.frogobox.appkeyboard.ui.main.MainActivity\"\u003e\n\n    \u003csubtype android:imeSubtypeMode=\"Keyboard\" /\u003e\n\n\u003c/input-method\u003e\n\n```\n\n### Step 7. Create Keyboard Service In Manifest inside application tag\n```xml\n\u003cservice\n    android:name=\".services.KeyboardIME\"\n    android:exported=\"true\"\n    android:label=\"@string/app_name\"\n    android:permission=\"android.permission.BIND_INPUT_METHOD\"\u003e\n    \u003cmeta-data\n        android:name=\"android.view.im\"\n        android:resource=\"@xml/keys_config\" /\u003e\n    \u003cintent-filter\u003e\n        \u003caction android:name=\"android.view.InputMethod\" /\u003e\n    \u003c/intent-filter\u003e\n\u003c/service\u003e\n```\n\n\n## Video Play\nhttps://user-images.githubusercontent.com/24654871/231431022-4410933f-7199-4967-9db1-24544f5593e0.mp4\n\n## Screen Shoot\n\n### How To Activated\n\n#### Activated Keyboard\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eWelcome Page (Light)\u003c/th\u003e\n    \u003cth\u003eActivated Keyboard (Light)\u003c/th\u003e\n    \u003cth\u003eAfter Activated (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/light/ss_1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/light/ss_2-1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/light/ss_2-2.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eWelcome Page (Dark)\u003c/th\u003e\n    \u003cth\u003eActivated Keyboard (Dark)\u003c/th\u003e\n    \u003cth\u003eAfter Activated (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/dark/ss_1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/dark/ss_2-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/dark/ss_2-2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n#### Change Keyboard\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eBefore Change Keyboard (Light)\u003c/th\u003e\n    \u003cth\u003eChange Keyboard (Light)\u003c/th\u003e\n    \u003cth\u003eAfter Change Keyboard (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/light/ss_2-2.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/change-keyboard/light/ss_3-1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/change-keyboard/light/ss_3-2.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eBefore Change Keyboard (Dark)\u003c/th\u003e\n    \u003cth\u003eChange Keyboard (Dark)\u003c/th\u003e\n    \u003cth\u003eAfter Change Keyboard (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/activated-keyboard/dark/ss_2-2.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/change-keyboard/dark/ss_3-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/change-keyboard/dark/ss_3-2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\n### Normal Keyboard State\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eAlphabet Keyboard (Light)\u003c/th\u003e\n    \u003cth\u003eNumeric Keyboard (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/normal-keyboard-state/light/ss_4-1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/normal-keyboard-state/light/ss_4-2.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eAlphabet Keyboard (Dark)\u003c/th\u003e\n    \u003cth\u003eNumeric Keyboard (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/normal-keyboard-state/dark/ss_4-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/normal-keyboard-state/dark/ss_4-2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n### Feature Keyboard\n\n#### Using API\n\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eNews API (Light)\u003c/th\u003e\n    \u003cth\u003eMovie API (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/using-api/light/ss_5.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/using-api/light/ss_6.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eNews API (Dark)\u003c/th\u003e\n    \u003cth\u003eMovie API (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/using-api/dark/ss_5.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/using-api/dark/ss_6.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n#### Webview\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eShow Webview\u003c/th\u003e\n    \u003cth\u003eInput Webview\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/webview/light/ss_7.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/webview/light/ss_8.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n#### Form\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eShow Form (Light)\u003c/th\u003e\n    \u003cth\u003eInput Form (Light)\u003c/th\u003e\n    \u003cth\u003eHide Keyboard (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/light/ss_9.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/light/ss_10.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/light/ss_11.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eShow Form (Dark)\u003c/th\u003e\n    \u003cth\u003eInput Form (Dark)\u003c/th\u003e\n    \u003cth\u003eHide Keyboard (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/dark/ss_9.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/dark/ss_10.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/form/dark/ss_11.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n#### Emojis\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eEmojis (Light)\u003c/th\u003e\n    \u003cth\u003eEmojis (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/emojis/light/ss_1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/emojis/light/ss_2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eEmojis (Dark)\u003c/th\u003e\n    \u003cth\u003eEmojis (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/emojis/dark/ss_1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/emojis/dark/ss_2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n#### Auto Text\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eMenu Auto Text (Light)\u003c/th\u003e\n    \u003cth\u003eAuto Text Inputed (Light)\u003c/th\u003e\n    \u003cth\u003eAuto Text Dashboard (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-1.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-2.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-3.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eEmpty View Auto Text (Light)\u003c/th\u003e\n    \u003cth\u003eAuto Text Editor (Light)\u003c/th\u003e\n    \u003cth\u003eAuto Text Detail (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-4.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-5.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/light/ss_16-6.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eMenu Auto Text (Dark)\u003c/th\u003e\n    \u003cth\u003eAuto Text Inputed (Dark)\u003c/th\u003e\n    \u003cth\u003eAuto Text Dashboard (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-2.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-3.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eEmpty View Auto Text (Dark)\u003c/th\u003e\n    \u003cth\u003eAuto Text Editor (Dark)\u003c/th\u003e\n    \u003cth\u003eAuto Text Detail (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-4.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-5.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/auto-text/dark/ss_16-6.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n### Open To Other App\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eGoogle Search (Light)\u003c/th\u003e\n    \u003cth\u003eGoogle Message (Light)\u003c/th\u003e\n    \u003cth\u003eSign In Google (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/light/ss_12.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/light/ss_13.png\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"360px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/light/ss_14.png\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eGoogle Search (Dark)\u003c/th\u003e\n    \u003cth\u003eGoogle Message (Dark)\u003c/th\u003e\n    \u003cth\u003eSign In Google (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/dark/ss_12.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/dark/ss_13.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/open-to-other-app/dark/ss_14.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\n### Toggle Feature\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eAll Toggle Off (Light)\u003c/th\u003e\n    \u003cth\u003eKeyboard No Feature (Light)\u003c/th\u003e\n    \u003cth\u003eSome Toggle On (Light)\u003c/th\u003e\n    \u003cth\u003eKeyboard With Feature (Light)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_light_1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_light_2.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_light_3.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_light_4.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eAll Toggle Off (Dark)\u003c/th\u003e\n    \u003cth\u003eKeyboard No Feature (Dark)\u003c/th\u003e\n    \u003cth\u003eSome Toggle On (Dark)\u003c/th\u003e\n    \u003cth\u003eKeyboard With Feature (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_dark_1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_dark_2.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_dark_3.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/toggle/ss_dark_4.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\n### Multi Language Support\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eMenu Multi Language (Light)\u003c/th\u003e\n    \u003cth\u003eChange Language (Light)\u003c/th\u003e\n    \u003cth\u003eMenu Multi Language (Dark)\u003c/th\u003e\n    \u003cth\u003eChange Language (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/multi-language/light/ss-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/multi-language/light/ss-2.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/multi-language/dark/ss-1.jpeg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/multi-language/dark/ss-2.jpeg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n### Multi Theme Suppported\n\u003ctable\u003e\n\n\u003ctr\u003e\n    \u003cth\u003eSetup Theme (Light)\u003c/th\u003e\n    \u003cth\u003eTheme Applied (Light)\u003c/th\u003e\n    \u003cth\u003eSetup Theme (Dark)\u003c/th\u003e\n    \u003cth\u003eTheme Applied (Dark)\u003c/th\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/theme/light/ss_1.jpg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/theme/light/ss_2.jpg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/theme/dark/ss_1.jpg\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg width=\"200px\" height=\"420px\" src=\"https://amirisback.github.io/keyboard/docs/image/ss/theme/dark/ss_2.jpg\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n## Documentation\n- https://github.com/SimpleMobileTools/Simple-Keyboard\n  - Clone From This\n- https://github.com/anssih/finqwerty\n  - Keymap app for phones with physical keyboards\n- https://github.com/shiftrot/caps2ctrl\n  - Provides almost all keymaps we need usually\n- https://github.com/kolegad/custom-keyboard\n- https://android.googlesource.com/platform/frameworks/base/+/master/data/keyboards/Generic.kl\n- https://android.googlesource.com/platform/frameworks/base/+/master/data/keyboards/Generic.kcm\n- https://developer.android.com/reference/kotlin/android/hardware/input/InputManager\n- https://source.android.com/devices/input/key-character-map-files\n\n## Frogo Library\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003eNo.\u003c/th\u003e\n        \u003cth\u003eGithub Name / Organization\u003c/th\u003e\n        \u003cth\u003eGithub Project\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/amirisback\"\u003eMuhammad Faisal Amir\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/amirisback/frogo-admob\"\u003efrogo-admob\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e2.\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/amirisback\"\u003eMuhammad Faisal Amir\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/amirisback/frogo-recycler-view\"\u003efrogo-recycler-view\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e3.\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox\"\u003eFrogobox\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox/frogo-sdk\"\u003efrogo-sdk\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e4.\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox\"\u003eFrogobox\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox/frogo-ui\"\u003efrogo-ui\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e5.\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox\"\u003eFrogobox\u003c/a\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003ca href=\"https://github.com/frogobox/frogo-consume-api\"\u003efrogo-consume-api\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## Colaborator\nVery open to anyone, I'll write your name under this, please contribute by sending an email to me\n\n- Mail To faisalamircs@gmail.com\n- Subject : Github _ [Github-Username-Account] _ [Language] _ [Repository-Name]\n- Example : Github_amirisback_kotlin_admob-helper-implementation\n\nName Of Contribute\n- Muhammad Faisal Amir\n- Waiting List\n- Waiting List\n\nWaiting for your contribute\n\n## Attention !!!\n- Please enjoy and don't forget fork and give a star\n- Don't Forget Follow My Github Account\n\n![ScreenShoot Apps](https://raw.githubusercontent.com/amirisback/frogo-recycler-view/master/docs/image/mad_score.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famirisback%2Fkeyboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famirisback%2Fkeyboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famirisback%2Fkeyboard/lists"}