Merge branch 'main' into patch-1
2
.github/workflows/image-minimizer.js
vendored
@@ -34,7 +34,7 @@ module.exports = async ({github, context}) => {
|
||||
|
||||
// Regex for finding images (simple variant) 
|
||||
const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[(.*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
|
||||
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/[-\w\d]+\/[-\w\d]+\/assets\/\d+\/[\-0-9a-f]{32,512})\)/gm;
|
||||
const REGEX_ASSETS_IMAGE_LOCKUP = /\!\[(.*)\]\((https:\/\/github\.com\/user-attachments\/assets\/[\-0-9a-f]{36,})\)/gm;
|
||||
|
||||
// Check if we found something
|
||||
let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)
|
||||
|
||||
9
.github/workflows/pr.yml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
name: PR
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
call-pr-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/pr.yml@main
|
||||
10
.github/workflows/testing-build.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
name: Testing build (on PR)
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
types: [ labeled, opened, synchronize, reopened ]
|
||||
|
||||
jobs:
|
||||
call-testing-build-workflow:
|
||||
uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<img alt="Logo" src="graphics/icon.webp" width="120" />
|
||||
|
||||
<a href="https://f-droid.org/packages/org.fossify.keyboard/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" height=80/></a> <a href="https://apt.izzysoft.de/fdroid/index/apk/org.fossify.keyboard"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height=80/></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=org.fossify.keyboard"><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' height=80/></a> <a href="https://f-droid.org/packages/org.fossify.keyboard/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" height=80/></a> <a href="https://apt.izzysoft.de/fdroid/index/apk/org.fossify.keyboard"><img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height=80/></a>
|
||||
|
||||
Introducing Fossify Keyboard – your go-to solution for effortless and efficient typing. Experience a seamless typing experience designed to cater to all your needs, whether chatting with friends or inserting texts, numbers, or symbols.
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ plugins {
|
||||
alias(libs.plugins.android)
|
||||
alias(libs.plugins.kotlinAndroid)
|
||||
alias(libs.plugins.ksp)
|
||||
alias(libs.plugins.detekt)
|
||||
}
|
||||
|
||||
val keystorePropertiesFile: File = rootProject.file("keystore.properties")
|
||||
@@ -53,6 +54,7 @@ android {
|
||||
}
|
||||
release {
|
||||
isMinifyEnabled = true
|
||||
isShrinkResources = true
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
@@ -92,8 +94,21 @@ android {
|
||||
|
||||
lint {
|
||||
checkReleaseBuilds = false
|
||||
abortOnError = false
|
||||
abortOnError = true
|
||||
warningsAsErrors = true
|
||||
baseline = file("lint-baseline.xml")
|
||||
}
|
||||
|
||||
bundle {
|
||||
language {
|
||||
@Suppress("UnstableApiUsage")
|
||||
enableSplit = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
detekt {
|
||||
baseline = file("detekt-baseline.xml")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
185
app/detekt-baseline.xml
Normal file
@@ -0,0 +1,185 @@
|
||||
<?xml version="1.0" ?>
|
||||
<SmellBaseline>
|
||||
<ManuallySuppressedIssues></ManuallySuppressedIssues>
|
||||
<CurrentIssues>
|
||||
<ID>ComplexCondition:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$requestCode == PICK_EXPORT_CLIPS_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>ComplexCondition:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$requestCode == PICK_IMPORT_CLIPS_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null</ID>
|
||||
<ID>ComplexCondition:MyKeyboardView.kt$MyKeyboardView$!newLabel.isNullOrEmpty() && mKeyboard!!.mShiftState != ShiftState.OFF && newLabel.length < 3 && Character.isLowerCase(newLabel[0])</ID>
|
||||
<ID>ComplexCondition:MyKeyboardView.kt$MyKeyboardView$(show && keyboardViewBinding?.clipboardValue!!.alpha == 0f) || (!show && keyboardViewBinding?.clipboardValue!!.alpha == 1f)</ID>
|
||||
<ID>ComplexCondition:MyKeyboardView.kt$MyKeyboardView$key.label.isNotEmpty() && key.code != KEYCODE_MODE_CHANGE && key.code != KEYCODE_SYMBOLS_MODE_CHANGE && key.code != KEYCODE_SHIFT</ID>
|
||||
<ID>ComplexCondition:MyKeyboardView.kt$MyKeyboardView$mBuffer == null || mKeyboardChanged && (mBuffer!!.width != width || mBuffer!!.height != height)</ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$fun Context.getKeyboardLanguageText(language: Int): String</ID>
|
||||
<ID>CyclomaticComplexMethod:Context.kt$fun Context.setupKeyboardDialogStuff( windowToken: IBinder, view: View, dialog: AlertDialog.Builder, titleId: Int = 0, titleText: String = "", cancelOnTouchOutside: Boolean = true, callback: ((alertDialog: AlertDialog) -> Unit)? = null )</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboard.kt$MyKeyboard$@SuppressLint("UseCompatLoadingForDrawables") private fun loadKeyboard(context: Context, parser: XmlResourceParser)</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboardView.kt$MyKeyboardView$@SuppressLint("UseCompatLoadingForDrawables") private fun onBufferDraw()</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboardView.kt$MyKeyboardView$override fun onTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboardView.kt$MyKeyboardView$private fun onModifiedTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboardView.kt$MyKeyboardView$private fun setupEmojiAdapter(emojis: List<EmojiData>)</ID>
|
||||
<ID>CyclomaticComplexMethod:MyKeyboardView.kt$MyKeyboardView$private fun setupKeyBackground(key: MyKeyboard.Key, keyCode: Int, canvas: Canvas)</ID>
|
||||
<ID>CyclomaticComplexMethod:SimpleKeyboardIME.kt$SimpleKeyboardIME$override fun onKey(code: Int)</ID>
|
||||
<ID>CyclomaticComplexMethod:SimpleKeyboardIME.kt$SimpleKeyboardIME$private fun getKeyboardLayoutXML(): Int</ID>
|
||||
<ID>EmptyCatchBlock:MyKeyboard.kt$MyKeyboard${ }</ID>
|
||||
<ID>EmptyFunctionBlock:ClipsActivityAdapter.kt$ClipsActivityAdapter${}</ID>
|
||||
<ID>ForbiddenComment:SimpleKeyboardIME.kt$SimpleKeyboardIME$// TODO: Change keyboardMode to enum class</ID>
|
||||
<ID>LargeClass:MyKeyboardView.kt$MyKeyboardView : View</ID>
|
||||
<ID>LongMethod:Context.kt$fun Context.setupKeyboardDialogStuff( windowToken: IBinder, view: View, dialog: AlertDialog.Builder, titleId: Int = 0, titleText: String = "", cancelOnTouchOutside: Boolean = true, callback: ((alertDialog: AlertDialog) -> Unit)? = null )</ID>
|
||||
<ID>LongMethod:MyKeyboard.kt$MyKeyboard$@SuppressLint("UseCompatLoadingForDrawables") private fun loadKeyboard(context: Context, parser: XmlResourceParser)</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$@SuppressLint("UseCompatLoadingForDrawables") private fun onBufferDraw()</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$fun setKeyboardHolder(binding: KeyboardViewKeyboardBinding)</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$fun setupKeyboard(changedView: View? = null)</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$override fun onTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$private fun onLongPress(popupKey: MyKeyboard.Key, me: MotionEvent): Boolean</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$private fun onModifiedTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$private fun setupEmojiAdapter(emojis: List<EmojiData>)</ID>
|
||||
<ID>LongMethod:MyKeyboardView.kt$MyKeyboardView$private fun showKey(keyIndex: Int)</ID>
|
||||
<ID>LongMethod:SimpleKeyboardIME.kt$SimpleKeyboardIME$override fun onKey(code: Int)</ID>
|
||||
<ID>LongParameterList:Context.kt$( windowToken: IBinder, view: View, dialog: AlertDialog.Builder, titleId: Int = 0, titleText: String = "", cancelOnTouchOutside: Boolean = true, callback: ((alertDialog: AlertDialog) -> Unit)? = null )</ID>
|
||||
<ID>LoopWithTooManyJumpStatements:MyKeyboard.kt$MyKeyboard$while</ID>
|
||||
<ID>MagicNumber:Config.kt$Config$100</ID>
|
||||
<ID>MagicNumber:EmojiHelper.kt$3</ID>
|
||||
<ID>MagicNumber:EmojisAdapter.kt$EmojisAdapter.EmojiCategoryViewHolder$0.6f</ID>
|
||||
<ID>MagicNumber:MyKeyboard.kt$MyKeyboard$10</ID>
|
||||
<ID>MagicNumber:MyKeyboard.kt$MyKeyboard$100.0F</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.1f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.2f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.5f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.6f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.8f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$0.9f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$1.4f</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$10</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$12</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$14</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$150</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$18</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$2.5</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$255</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$3</ID>
|
||||
<ID>MagicNumber:MyKeyboardView.kt$MyKeyboardView$4</ID>
|
||||
<ID>MagicNumber:SimpleKeyboardIME.kt$SimpleKeyboardIME$100</ID>
|
||||
<ID>MagicNumber:SimpleKeyboardIME.kt$SimpleKeyboardIME$8</ID>
|
||||
<ID>MatchingDeclarationName:Constants.kt$ShiftState</ID>
|
||||
<ID>MaxLineLength:ClipsActivityAdapter.kt$ClipsActivityAdapter$activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:ClipsActivityAdapter.kt$ClipsActivityAdapter$override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)</ID>
|
||||
<ID>MaxLineLength:ClipsKeyboardAdapter.kt$ClipsKeyboardAdapter$layerDrawable.findDrawableByLayerId(R.id.clipboard_background_stroke).applyColorFilter(context.getStrokeColor())</ID>
|
||||
<ID>MaxLineLength:Config.kt$Config$set(lastExportedClipsFolder) = prefs.edit().putString(LAST_EXPORTED_CLIPS_FOLDER, lastExportedClipsFolder).apply()</ID>
|
||||
<ID>MaxLineLength:Context.kt$baseConfig.isUsingSystemTheme -> ResourcesCompat.getDrawable(resources, R.drawable.dialog_you_background, theme)</ID>
|
||||
<ID>MaxLineLength:Context.kt$fun</ID>
|
||||
<ID>MaxLineLength:Context.kt$isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(resources, R.drawable.black_dialog_background, theme)</ID>
|
||||
<ID>MaxLineLength:EmojisAdapter.kt$EmojisAdapter.EmojiCategoryViewHolder$inner</ID>
|
||||
<ID>MaxLineLength:ExportClipsDialog.kt$ExportClipsDialog$exportClipsFilename.setText("${activity.getString(R.string.app_launcher_name)}_${activity.getCurrentFormattedDateTime()}")</ID>
|
||||
<ID>MaxLineLength:ExportClipsDialog.kt$ExportClipsDialog$val activity: BaseSimpleActivity</ID>
|
||||
<ID>MaxLineLength:ExportClipsDialog.kt$ExportClipsDialog$val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newPath.getFilenameFromPath())</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$(applyBackground as LayerDrawable).findDrawableByLayerId(R.id.button_background_holder).applyColorFilter(getProperPrimaryColor())</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$ConfirmationAdvancedDialog</ID>
|
||||
<ID>MaxLineLength:MainActivity.kt$MainActivity$updateMaterialActivityViews(mainCoordinator, mainHolder, useTransparentNavigation = false, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$clipboardItemsPlaceholder.text = "${getText(R.string.manage_clipboard_empty)}\n\n${getText(R.string.manage_clips)}"</ID>
|
||||
<ID>MaxLineLength:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$if</ID>
|
||||
<ID>MaxLineLength:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$updateMaterialActivityViews(clipboardCoordinator, clipboardItemsList, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$val msg = if (clipsImported > 0) R.string.importing_successful else R.string.no_new_entries_for_importing</ID>
|
||||
<ID>MaxLineLength:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$}</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard$*</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard$EditorInfo.IME_ACTION_NEXT, EditorInfo.IME_ACTION_GO -> R.drawable.ic_arrow_right_vector</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard$constructor</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Key$*</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Key$gap = getDimensionOrFraction(a, R.styleable.MyKeyboard_horizontalGap, keyboard.mDisplayWidth, parent.defaultHorizontalGap)</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Key$return ((x >= this.x || leftEdge && x <= this.x + width) && (x < this.x + width || rightEdge && x >= this.x) && (y >= this.y && y <= this.y + height) && (y < this.y + height && y >= this.y))</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Key$width = getDimensionOrFraction(a, R.styleable.MyKeyboard_keyWidth, keyboard.mDisplayWidth, parent.defaultWidth)</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Row$*</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Row$defaultHorizontalGap = getDimensionOrFraction(a, R.styleable.MyKeyboard_horizontalGap, parent.mDisplayWidth, parent.mDefaultHorizontalGap)</ID>
|
||||
<ID>MaxLineLength:MyKeyboard.kt$MyKeyboard.Row$defaultWidth = getDimensionOrFraction(a, R.styleable.MyKeyboard_keyWidth, parent.mDisplayWidth, parent.mDefaultWidth)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$*</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$// And therefore the width of the key might be smaller than width declared in MyKeyboard.Key.width for the main keyboard.</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$// For 'number' and 'phone' keyboards the count of popup keys might be bigger than count of keys in the main keyboard.</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$// if the user presses a key while still holding down the previous, type in both chars and ignore the later gestures</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$// make sure we highlight the proper key right after long pressing it, before any ACTION_MOVE event occurs</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$class</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$if</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$keyboardViewBinding!!.emojiPaletteTopBar.elevation = if (offset > 4) context.resources.getDimensionPixelSize(R.dimen.one_dp).toFloat() else 0f</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$keyboardViewBinding?.emojiCategoriesStrip?.children?.filterIsInstance<ImageButton>()</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$layerDrawable.findDrawableByLayerId(R.id.clipboard_background_shape).applyColorFilter(mBackgroundColor)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$mMiniKeyboard = mMiniKeyboardCache[popupKey]?.let(KeyboardPopupKeyboardBinding::bind)?.miniKeyboardView</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$mPreviewText!!.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$me.x - (coords[0] + mMiniKeyboard!!.measuredWidth) > mPopupMaxMoveDistance</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$setupEmojiPalette(toolbarColor = mKeyboardBackgroundColor, backgroundColor = mBackgroundColor, textColor = mTextColor)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$systemFontPaint.hasGlyph(emoji.emoji)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val clipboardClearAnimation = ObjectAnimator.ofFloat(keyboardViewBinding!!.clipboardClear, "alpha", newAlpha)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val clipboardValueAnimation = ObjectAnimator.ofFloat(keyboardViewBinding!!.clipboardValue, "alpha", newAlpha)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val id = emojiCategoryIds.entries.first { it.value == (activeCategory.value as EmojisAdapter.Item.Category).value }.key</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val isCurrentClipPinnedToo = pinnedClips.any { clipboardContent?.isNotEmpty() == true && it.value.trim() == clipboardContent }</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val layerDrawable = (this as RippleDrawable).findDrawableByLayerId(R.id.clipboard_background_holder) as LayerDrawable</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val popupKeyWidth = popupKey.calcKeyWidth(containerWidth = mMiniKeyboardContainer?.measuredWidth ?: width)</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val startY = (key.height / 2f) + ((textSize - paint.descent()) / 2f) - ((textSize / 2f) * (rows.size - 1))</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView$val widthToUse = mMiniKeyboardContainer!!.measuredWidth - (popupKey.popupCharacters!!.length / 2) * popupKeyWidth</ID>
|
||||
<ID>MaxLineLength:MyKeyboardView.kt$MyKeyboardView.<no name provided>$override</ID>
|
||||
<ID>MaxLineLength:OnKeyboardActionListener.kt$OnKeyboardActionListener$*</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$RadioItem(KEYBOARD_HEIGHT_100_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_100_PERCENT))</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$RadioItem(KEYBOARD_HEIGHT_120_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_120_PERCENT))</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$RadioItem(KEYBOARD_HEIGHT_140_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_140_PERCENT))</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$RadioItem(KEYBOARD_HEIGHT_160_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_160_PERCENT))</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsKeyboardHeightMultiplier.text = getKeyboardHeightPercentageText(config.keyboardHeightPercentage)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsVoiceInputMethodValue.text = getCurrentVoiceInputMethod()?.first?.loadLabel(packageManager) ?: getString(R.string.none)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$settingsVoiceInputMethodValue.text = getCurrentVoiceInputMethod(inputMethods)?.first?.loadLabel(packageManager) ?: getString(R.string.none)</ID>
|
||||
<ID>MaxLineLength:SettingsActivity.kt$SettingsActivity$updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$// If the keyboard is set to symbols and the user presses space, we usually should switch back to the letters keyboard.</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$System.currentTimeMillis() - lastShiftPressTS < SHIFT_PERM_TOGGLE_SPEED -> keyboard!!.mShiftState = ShiftState.ON_PERMANENT</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$class</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$if</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$inputConnection.setComposingRegion(fullText.length - shouldChangeText.length, fullText.length)</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$inputConnection.setComposingText(cachedVNTelexData[shouldChangeText], fullText.length)</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$it</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$layerDrawable.findDrawableByLayerId(R.id.clipboard_background_shape).applyColorFilter(getProperBackgroundColor())</ID>
|
||||
<ID>MaxLineLength:SimpleKeyboardIME.kt$SimpleKeyboardIME$override</ID>
|
||||
<ID>MaxLineLength:SwitchLanguageDialog.kt$SwitchLanguageDialog$addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))</ID>
|
||||
<ID>NestedBlockDepth:Context.kt$fun Context.setupKeyboardDialogStuff( windowToken: IBinder, view: View, dialog: AlertDialog.Builder, titleId: Int = 0, titleText: String = "", cancelOnTouchOutside: Boolean = true, callback: ((alertDialog: AlertDialog) -> Unit)? = null )</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboard.kt$MyKeyboard$@SuppressLint("UseCompatLoadingForDrawables") private fun loadKeyboard(context: Context, parser: XmlResourceParser)</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboardView.kt$MyKeyboardView$@SuppressLint("UseCompatLoadingForDrawables") private fun onBufferDraw()</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboardView.kt$MyKeyboardView$override fun onTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboardView.kt$MyKeyboardView$private fun handleClipboard()</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboardView.kt$MyKeyboardView$private fun onLongPress(popupKey: MyKeyboard.Key, me: MotionEvent): Boolean</ID>
|
||||
<ID>NestedBlockDepth:MyKeyboardView.kt$MyKeyboardView$private fun onModifiedTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>NestedBlockDepth:SimpleKeyboardIME.kt$SimpleKeyboardIME$override fun onKey(code: Int)</ID>
|
||||
<ID>ReturnCount:EmojiHelper.kt$fun parseRawJsonSpecsFile(context: Context, path: String): HashMap<String, String></ID>
|
||||
<ID>ReturnCount:MyKeyboardView.kt$MyKeyboardView$private fun onLongPress(popupKey: MyKeyboard.Key, me: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:MyKeyboardView.kt$MyKeyboardView$private fun onModifiedTouchEvent(me: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:MyKeyboardView.kt$MyKeyboardView$private fun openPopupIfRequired(me: MotionEvent): Boolean</ID>
|
||||
<ID>ReturnCount:SimpleKeyboardIME.kt$SimpleKeyboardIME$private fun getCountToDelete(inputConnection: InputConnection): Int</ID>
|
||||
<ID>SpreadOperator:MyKeyboardView.kt$MyKeyboardView$(*animations.toTypedArray())</ID>
|
||||
<ID>SwallowedException:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$e: ActivityNotFoundException</ID>
|
||||
<ID>SwallowedException:MyKeyboard.kt$MyKeyboard$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity$e: Exception</ID>
|
||||
<ID>TooGenericExceptionCaught:MyKeyboard.kt$MyKeyboard$e: Exception</ID>
|
||||
<ID>TooManyFunctions:ClipsActivityAdapter.kt$ClipsActivityAdapter : MyRecyclerViewAdapterItemTouchHelperContract</ID>
|
||||
<ID>TooManyFunctions:ManageClipboardItemsActivity.kt$ManageClipboardItemsActivity : SimpleActivityRefreshRecyclerViewListener</ID>
|
||||
<ID>TooManyFunctions:MyKeyboardView.kt$MyKeyboardView : View</ID>
|
||||
<ID>TooManyFunctions:SettingsActivity.kt$SettingsActivity : SimpleActivity</ID>
|
||||
<ID>TooManyFunctions:SimpleKeyboardIME.kt$SimpleKeyboardIME : InputMethodServiceOnKeyboardActionListenerOnSharedPreferenceChangeListener</ID>
|
||||
<ID>WildcardImport:ClipsKeyboardAdapter.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:Context.kt$import org.fossify.keyboard.helpers.*</ID>
|
||||
<ID>WildcardImport:ExportClipsDialog.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MainActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ManageClipboardItemsActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:ManageClipboardItemsActivity.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import android.graphics.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import android.graphics.drawable.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import android.view.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import androidx.core.view.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import org.fossify.keyboard.extensions.*</ID>
|
||||
<ID>WildcardImport:MyKeyboardView.kt$import org.fossify.keyboard.helpers.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.keyboard.extensions.*</ID>
|
||||
<ID>WildcardImport:SettingsActivity.kt$import org.fossify.keyboard.helpers.*</ID>
|
||||
<ID>WildcardImport:SimpleKeyboardIME.kt$import android.text.InputType.*</ID>
|
||||
<ID>WildcardImport:SimpleKeyboardIME.kt$import android.view.inputmethod.*</ID>
|
||||
<ID>WildcardImport:SimpleKeyboardIME.kt$import org.fossify.commons.extensions.*</ID>
|
||||
<ID>WildcardImport:SimpleKeyboardIME.kt$import org.fossify.commons.helpers.*</ID>
|
||||
<ID>WildcardImport:SimpleKeyboardIME.kt$import org.fossify.keyboard.helpers.*</ID>
|
||||
<ID>WildcardImport:SwitchLanguageDialog.kt$import org.fossify.keyboard.extensions.*</ID>
|
||||
</CurrentIssues>
|
||||
</SmellBaseline>
|
||||
920
app/lint-baseline.xml
Normal file
@@ -0,0 +1,920 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<issues format="6" by="lint 8.2.0" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.0)" variant="all" version="8.2.0">
|
||||
|
||||
<issue
|
||||
id="ObsoleteLintCustomCheck"
|
||||
message="Library lint checks reference invalid APIs; these checks **will be skipped**!

Lint found an issue registry (`androidx.compose.runtime.lint.RuntimeIssueRegistry`)
which contains some references to invalid API:
org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider: org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenFactory getTokenFactory()
(Referenced from androidx/compose/runtime/lint/AutoboxingStateCreationDetector.class)

Therefore, this lint check library is **not** included
in analysis. This affects the following lint checks:
`AutoboxingStateValueProperty`
`AutoboxingStateCreation`
`CoroutineCreationDuringComposition`
`FlowOperatorInvokedInComposition`
`ComposableLambdaParameterNaming`
`ComposableLambdaParameterPosition`
`ComposableNaming`
`StateFlowValueCalledInComposition`
`CompositionLocalNaming`
`MutableCollectionMutableState`
`ProduceStateDoesNotAssignValue`
`RememberReturnType`
`OpaqueUnitKey`
`UnrememberedMutableState`

To use this lint check, upgrade to a more recent version
of the library.">
|
||||
<location
|
||||
file="$GRADLE_USER_HOME/caches/transforms-3/797cd4cfe7f9859d707cf7eadef869ed/transformed/jetified-runtime-release/jars/lint.jar"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="NewApi"
|
||||
message="Call requires API level 33 (current min is 23): `launchChangeAppLanguageIntent`"
|
||||
errorLine1=" launchChangeAppLanguageIntent()"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/activities/SettingsActivity.kt"
|
||||
line="101"
|
||||
column="17"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="NotificationPermission"
|
||||
message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from org.fossify.commons.asynctasks.CopyMoveTask)">
|
||||
<location
|
||||
file="src/main/AndroidManifest.xml"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedAttribute"
|
||||
message="Attribute `appCategory` is only used in API level 26 and higher (current min is 23)"
|
||||
errorLine1=" android:appCategory="productivity""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/AndroidManifest.xml"
|
||||
line="17"
|
||||
column="9"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedAttribute"
|
||||
message="Attribute `localeConfig` is only used in API level 33 and higher (current min is 23)"
|
||||
errorLine1=" android:localeConfig="@xml/locale_config""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/AndroidManifest.xml"
|
||||
line="20"
|
||||
column="9"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedAttribute"
|
||||
message="Attribute `directBootAware` is only used in API level 24 and higher (current min is 23)"
|
||||
errorLine1=" android:directBootAware="true""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/AndroidManifest.xml"
|
||||
line="44"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="CustomSplashScreen"
|
||||
message="The application should not provide its own launch screen"
|
||||
errorLine1="class SplashActivity : BaseSplashActivity() {"
|
||||
errorLine2=" ~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/activities/SplashActivity.kt"
|
||||
line="6"
|
||||
column="7"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="GradleDependency"
|
||||
message="A newer version of org.jetbrains.kotlin.android than 1.9.23 is available: 1.9.25"
|
||||
errorLine1="kotlin = "1.9.23""
|
||||
errorLine2=" ~~~~~~~~">
|
||||
<location
|
||||
file="$HOME/Projects/Community/FossifyOrg/Keyboard/gradle/libs.versions.toml"
|
||||
line="3"
|
||||
column="10"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="GradleDependency"
|
||||
message="A newer version of androidx.emoji2:emoji2-bundled than 1.4.0 is available: 1.5.0"
|
||||
errorLine1="androidx-emoji2 = "1.4.0""
|
||||
errorLine2=" ~~~~~~~">
|
||||
<location
|
||||
file="$HOME/Projects/Community/FossifyOrg/Keyboard/gradle/libs.versions.toml"
|
||||
line="6"
|
||||
column="19"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="GradleDependency"
|
||||
message="A newer version of com.google.devtools.ksp than 1.9.23-1.0.19 is available: 1.9.25-1.0.20"
|
||||
errorLine1="ksp = "1.9.23-1.0.19""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="$HOME/Projects/Community/FossifyOrg/Keyboard/gradle/libs.versions.toml"
|
||||
line="8"
|
||||
column="7"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="GradleDependency"
|
||||
message="A newer version of com.android.application than 8.2.0 is available: 8.6.1"
|
||||
errorLine1="gradlePlugins-agp = "8.2.0""
|
||||
errorLine2=" ~~~~~~~">
|
||||
<location
|
||||
file="$HOME/Projects/Community/FossifyOrg/Keyboard/gradle/libs.versions.toml"
|
||||
line="16"
|
||||
column="21"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UseCompatLoadingForDrawables"
|
||||
message="Use `ResourcesCompat.getDrawable()`"
|
||||
errorLine1=" val applyBackground = resources.getDrawable(R.drawable.button_background_rounded, theme) as RippleDrawable"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/activities/MainActivity.kt"
|
||||
line="94"
|
||||
column="31"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""app_launcher_name" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="app_launcher_name">Keyboard_debug</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/debug/res/values/strings.xml"
|
||||
line="3"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""app_launcher_name" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="app_launcher_name">Keyboard</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="3"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""redirection_note" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""
|
||||
errorLine1=" <string name="redirection_note">Please enable Fossify Keyboard on the next screen, to make it an available keyboard. Press \'Back\' once enabled.</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="4"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""change_keyboard" is not translated in "fil" (Filipino; Pilipino), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="change_keyboard">Change Keyboard</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="5"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""manage_clipboard_items" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="manage_clipboard_items">Manage clipboard items</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="7"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""manage_clipboard_empty" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="manage_clipboard_empty">Your clipboard is empty.</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="8"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""manage_clipboard_label" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="manage_clipboard_label">Once you copy some text, it will show up here. You can also pin clips so they won\'t disappear later.</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="9"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clear_clipboard_data" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clear_clipboard_data">Clear clipboard data</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="10"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clear_clipboard_data_confirmation" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clear_clipboard_data_confirmation">Are you sure you want to clear the clipboard data?</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="11"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clipboard" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clipboard">Clipboard</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="12"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clipboard_recent" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clipboard_recent">Recent</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="13"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clipboard_current" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clipboard_current">Current</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="14"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clipboard_pinned" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clipboard_pinned">Pinned</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="15"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""add_new_item" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="add_new_item">Add a new item</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="16"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""manage_keyboard_languages" is not translated in "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""
|
||||
errorLine1=" <string name="manage_keyboard_languages">Manage keyboard languages</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="17"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""manage_clips" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="manage_clips">You can manage or add clips here for quick access.</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="18"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""clip_text" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="clip_text">Clip text</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="19"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""pin_text" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="pin_text">Pin text</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="20"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""text_pinned" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="text_pinned">Text has been pinned</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="21"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""export_clipboard_items" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="export_clipboard_items">Export clipboard items</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="22"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""import_clipboard_items" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="import_clipboard_items">Import clipboard items</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="23"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keycode_delete" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keycode_delete">Delete</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="25"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keycode_mode_change" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keycode_mode_change">Change keyboard type</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="26"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keycode_shift" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keycode_shift">Shift</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="27"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keycode_enter" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "lv" (Latvian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "ar" (Arabic), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keycode_enter">Enter</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="28"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keycode_space" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keycode_space">Spacebar</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="29"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""show_clipboard_content" is not translated in "fil" (Filipino; Pilipino), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="show_clipboard_content">Show clipboard content if available</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="31"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""show_popup" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="show_popup">Show a popup on keypress</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="32"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""vibrate_on_keypress" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="vibrate_on_keypress">Vibrate on keypress</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="33"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keyboard_language" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keyboard_language">Keyboard language</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="34"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""keyboard_height" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="keyboard_height">Keyboard height</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="35"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""show_key_borders" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="show_key_borders">Show key borders</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="36"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""show_numbers_row" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="show_numbers_row">Show numbers on a separate row</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="37"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""start_sentences_capitalized" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "ms" (Malay), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="start_sentences_capitalized">Start sentences with a capital letter</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="38"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""emojis" is not translated in "fil" (Filipino; Pilipino), "lt" (Lithuanian), "ia" (Interlingua), "mk" (Macedonian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "my" (Burmese), "eu" (Basque), "nb" (Norwegian Bokmål), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "nn" (Norwegian Nynorsk), "bn" (Bangla), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "zgh" (Standard Moroccan Tamazight), "ltg", "kn" (Kannada), "or" (Odia), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "te" (Telugu), "th" (Thai), "cy" (Welsh)"
|
||||
errorLine1=" <string name="emojis">Emojis</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="40"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""recently_used" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="recently_used">Recently used</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="41"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""smileys_and_emotions" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="smileys_and_emotions">Smileys and emotions</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="42"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""people_and_body" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="people_and_body">People and body</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="43"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""animals_and_nature" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="animals_and_nature">Animals and nature</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="44"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""food_and_drink" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="food_and_drink">Food and drink</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="45"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""travel_and_places" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="travel_and_places">Travel and places</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="46"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""activities" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="activities">Activities</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="47"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""objects" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="objects">Objects</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="48"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""symbols" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="symbols">Symbols</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="49"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""flags" is not translated in "de" (German), "hi" (Hindi), "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "uk" (Ukrainian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "es" (Spanish), "iw" (Hebrew), "zh" (Chinese), "et" (Estonian), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nl" (Dutch), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "ru" (Russian), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ca" (Catalan), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "sv" (Swedish), "ko" (Korean), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "cs" (Czech), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb", "pl" (Polish), "da" (Danish), "tr" (Turkish)"
|
||||
errorLine1=" <string name="flags">Flags</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="50"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""voice_typing_method" is not translated in "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""
|
||||
errorLine1=" <string name="voice_typing_method">Voice typing method</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="52"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="MissingTranslation"
|
||||
message=""switch_to_voice_typing" is not translated in "pt" (Portuguese), "fil" (Filipino; Pilipino), "lt" (Lithuanian), "hr" (Croatian), "lv" (Latvian), "hu" (Hungarian), "ia" (Interlingua), "mk" (Macedonian), "ml" (Malayalam), "in" (Indonesian), "ms" (Malay), "el" (Greek), "en" (English), "eo" (Esperanto), "is" (Icelandic), "it" (Italian), "my" (Burmese), "iw" (Hebrew), "eu" (Basque), "ar" (Arabic), "vi" (Vietnamese), "nb" (Norwegian Bokmål), "ja" (Japanese), "ne" (Nepali), "az" (Azerbaijani), "fa" (Persian), "ro" (Romanian), "nn" (Norwegian Nynorsk), "be" (Belarusian), "fi" (Finnish), "bg" (Bulgarian), "bn" (Bangla), "fr" (French), "br" (Breton), "bs" (Bosnian), "si" (Sinhala), "sk" (Slovak), "sl" (Slovenian), "zgh" (Standard Moroccan Tamazight), "ltg", "sr" (Serbian), "kn" (Kannada), "or" (Odia), "gl" (Galician), "kr" (Kanuri), "sat" (Santali), "ta" (Tamil), "cr" (Cree), "pa" (Punjabi), "te" (Telugu), "th" (Thai), "cy" (Welsh), "ckb""
|
||||
errorLine1=" <string name="switch_to_voice_typing">Switch to voice typing</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="53"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="NotifyDataSetChanged"
|
||||
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
|
||||
errorLine1=" notifyDataSetChanged()"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/adapters/ClipsActivityAdapter.kt"
|
||||
line="78"
|
||||
column="9"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="NotifyDataSetChanged"
|
||||
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
|
||||
errorLine1=" notifyDataSetChanged()"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/adapters/ClipsActivityAdapter.kt"
|
||||
line="91"
|
||||
column="21"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="NotifyDataSetChanged"
|
||||
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
|
||||
errorLine1=" notifyDataSetChanged()"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/adapters/ClipsActivityAdapter.kt"
|
||||
line="95"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="VectorPath"
|
||||
message="Very long vector path (1294 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
|
||||
errorLine1=" <path android:fillColor="@android:color/white" android:pathData="M13.49,10.51c-0.43,-0.43 -0.94,-0.73 -1.49,-0.93V8h-1v1.38c-0.11,-0.01 -0.23,-0.03 -0.34,-0.03c-1.02,0 -2.05,0.39 -2.83,1.17c-0.16,0.16 -0.3,0.34 -0.43,0.53L6,10.52c-1.56,-0.55 -3.28,0.27 -3.83,1.82c0,0 0,0 0,0c-0.27,0.75 -0.23,1.57 0.12,2.29c0.23,0.48 0.58,0.87 1,1.16c-0.38,1.35 -0.06,2.85 1,3.91c1.06,1.06 2.57,1.38 3.91,1c0.29,0.42 0.68,0.77 1.16,1C9.78,21.9 10.21,22 10.65,22c0.34,0 0.68,-0.06 1.01,-0.17c0,0 0,0 0,0c1.56,-0.55 2.38,-2.27 1.82,-3.85l-0.52,-1.37c0.18,-0.13 0.36,-0.27 0.53,-0.43c0.87,-0.87 1.24,-2.04 1.14,-3.17H16v-1h-1.59C14.22,11.46 13.92,10.95 13.49,10.51zM4.67,14.29c-0.25,-0.09 -0.45,-0.27 -0.57,-0.51s-0.13,-0.51 -0.04,-0.76c0.19,-0.52 0.76,-0.79 1.26,-0.61l3.16,1.19C7.33,14.2 5.85,14.71 4.67,14.29zM10.99,19.94c-0.25,0.09 -0.52,0.08 -0.76,-0.04c-0.24,-0.11 -0.42,-0.32 -0.51,-0.57c-0.42,-1.18 0.09,-2.65 0.7,-3.8l1.18,3.13C11.78,19.18 11.51,19.76 10.99,19.94zM12.2,14.6l-0.61,-1.61c0,-0.01 -0.01,-0.02 -0.02,-0.03c-0.02,-0.04 -0.04,-0.08 -0.06,-0.12c-0.02,-0.04 -0.04,-0.07 -0.07,-0.11c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.07,-0.05 -0.11,-0.07c-0.04,-0.02 -0.07,-0.05 -0.12,-0.06c-0.01,0 -0.02,-0.01 -0.03,-0.02L9.4,11.8c0.36,-0.29 0.79,-0.46 1.26,-0.46c0.53,0 1.04,0.21 1.41,0.59C12.8,12.66 12.84,13.81 12.2,14.6z"/>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/drawable/ic_emoji_category_animals.xml"
|
||||
line="5"
|
||||
column="70"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="VectorPath"
|
||||
message="Very long vector path (910 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
|
||||
errorLine1=" <path android:fillColor="@android:color/white" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2s0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2s0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2s-0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2s-0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z"/>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/drawable/ic_language_outlined.xml"
|
||||
line="4"
|
||||
column="70"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="VectorPath"
|
||||
message="Very long vector path (1824 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
|
||||
errorLine1=" <path android:fillColor="#ffffff" android:pathData="M171.2 330.2q-8.74 0-14.97-6.23T150 309V203q0-8.74 6.23-14.97t14.97-6.23h169.6q8.74 0 14.97 6.23T362 203v106q0 8.74-6.23 14.97-6.22 6.23-14.97 6.23zm0-21.2h169.6V203H171.2zm53-10.6h63.6q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.05-3.05-7.55-3.05h-63.6q-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm-53 10.6V203zm21.2-74.2q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.04 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05Q309 219.7 309 224.2q0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm-127.2 31.8q4.51 0 7.55-3.05Q203 260.51 203 256t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.04-3.05 7.55t3.05 7.55q3.04 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05Q309 251.49 309 256t3.05 7.55q3.05 3.05 7.55 3.05z" android:strokeWidth="0.265"/>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/drawable/ic_launcher_foreground.xml"
|
||||
line="2"
|
||||
column="57"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="VectorPath"
|
||||
message="Very long vector path (1824 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
|
||||
errorLine1=" <path android:fillColor="#ffffff" android:pathData="M171.2 330.2q-8.74 0-14.97-6.23T150 309V203q0-8.74 6.23-14.97t14.97-6.23h169.6q8.74 0 14.97 6.23T362 203v106q0 8.74-6.23 14.97-6.22 6.23-14.97 6.23zm0-21.2h169.6V203H171.2zm53-10.6h63.6q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.05-3.05-7.55-3.05h-63.6q-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm-53 10.6V203zm21.2-74.2q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.04 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.05-3.05 7.55 0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.05 3.05-7.55 0-4.51-3.05-7.55-3.04-3.05-7.55-3.05t-7.55 3.05Q309 219.7 309 224.2q0 4.51 3.05 7.55 3.05 3.05 7.55 3.05zm-127.2 31.8q4.51 0 7.55-3.05Q203 260.51 203 256t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05q-3.05 3.04-3.05 7.55t3.05 7.55q3.04 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.05-3.05-7.55-3.05-4.51 0-7.55 3.05-3.05 3.04-3.05 7.55t3.05 7.55q3.05 3.05 7.55 3.05zm31.8 0q4.51 0 7.55-3.05 3.05-3.04 3.05-7.55t-3.05-7.55q-3.04-3.05-7.55-3.05t-7.55 3.05Q309 251.49 309 256t3.05 7.55q3.05 3.05 7.55 3.05z" android:strokeWidth="0.265"/>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/drawable/ic_launcher_monochrome.xml"
|
||||
line="2"
|
||||
column="57"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.color.key_press_color` appears to be unused"
|
||||
errorLine1=" <color name="key_press_color">#11ffffff</color>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/colors.xml"
|
||||
line="3"
|
||||
column="12"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.dimen.emoji_category_item_size` appears to be unused"
|
||||
errorLine1=" <dimen name="emoji_category_item_size">24dp</dimen>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/dimens.xml"
|
||||
line="12"
|
||||
column="12"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.layout.emoji_list` appears to be unused"
|
||||
errorLine1="<org.fossify.commons.views.MyRecyclerView xmlns:android="http://schemas.android.com/apk/res/android""
|
||||
errorLine2="^">
|
||||
<location
|
||||
file="src/main/res/layout/emoji_list.xml"
|
||||
line="1"
|
||||
column="1"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.mipmap.ic_launcher_foreground` appears to be unused">
|
||||
<location
|
||||
file="src/main/res/mipmap-hdpi/ic_launcher_foreground.png"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.string.clear_clipboard_data_confirmation` appears to be unused"
|
||||
errorLine1=" <string name="clear_clipboard_data_confirmation">Are you sure you want to clear the clipboard data?</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="11"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="UnusedResources"
|
||||
message="The resource `R.string.clipboard_recent` appears to be unused"
|
||||
errorLine1=" <string name="clipboard_recent">Recent</string>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/values/strings.xml"
|
||||
line="13"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="AlwaysShowAction"
|
||||
message="Prefer "`ifRoom`" instead of "`always`""
|
||||
errorLine1=" app:showAsAction="always" />"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/menu/cab_clips.xml"
|
||||
line="8"
|
||||
column="9"/>
|
||||
<location
|
||||
file="src/main/res/menu/cab_clips.xml"
|
||||
line="13"
|
||||
column="9"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ClickableViewAccessibility"
|
||||
message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
|
||||
errorLine1=" clipDragHandle.setOnTouchListener { v, event ->"
|
||||
errorLine2=" ^">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/adapters/ClipsActivityAdapter.kt"
|
||||
line="165"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ClickableViewAccessibility"
|
||||
message="`onTouch` lambda should call `View#performClick` when a click is detected"
|
||||
errorLine1=" clipDragHandle.setOnTouchListener { v, event ->"
|
||||
errorLine2=" ^">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/adapters/ClipsActivityAdapter.kt"
|
||||
line="165"
|
||||
column="47"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ContentDescription"
|
||||
message="Missing `contentDescription` attribute on image"
|
||||
errorLine1=" <ImageView"
|
||||
errorLine2=" ~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/item_clip_in_activity.xml"
|
||||
line="23"
|
||||
column="6"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ContentDescription"
|
||||
message="Missing `contentDescription` attribute on image"
|
||||
errorLine1=" <ImageView"
|
||||
errorLine2=" ~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/item_section_label.xml"
|
||||
line="16"
|
||||
column="6"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ContentDescription"
|
||||
message="Missing `contentDescription` attribute on image"
|
||||
errorLine1=" <ImageView"
|
||||
errorLine2=" ~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/keyboard_view_keyboard.xml"
|
||||
line="113"
|
||||
column="10"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="ContentDescription"
|
||||
message="Missing `contentDescription` attribute on image"
|
||||
errorLine1=" <ImageView"
|
||||
errorLine2=" ~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/keyboard_view_keyboard.xml"
|
||||
line="344"
|
||||
column="10"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="KeyboardInaccessibleWidget"
|
||||
message="'clickable' attribute found, please also add 'focusable'"
|
||||
errorLine1=" android:clickable="true""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/keyboard_view_keyboard.xml"
|
||||
line="246"
|
||||
column="9"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="SetTextI18n"
|
||||
message="Do not concatenate text displayed with `setText`. Use resource string with placeholders."
|
||||
errorLine1=" exportClipsFilename.setText("${activity.getString(R.string.app_launcher_name)}_${activity.getCurrentFormattedDateTime()}")"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/dialogs/ExportClipsDialog.kt"
|
||||
line="23"
|
||||
column="41"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="SetTextI18n"
|
||||
message="Do not concatenate text displayed with `setText`. Use resource string with placeholders."
|
||||
errorLine1=" clipboardItemsPlaceholder.text = "${getText(R.string.manage_clipboard_empty)}\n\n${getText(R.string.manage_clips)}""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/kotlin/org/fossify/keyboard/activities/ManageClipboardItemsActivity.kt"
|
||||
line="47"
|
||||
column="46"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="RtlSymmetry"
|
||||
message="When you define `paddingStart` you should probably also define `paddingEnd` for right-to-left symmetry"
|
||||
errorLine1=" android:paddingStart="@dimen/small_margin""
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/dialog_export_clips.xml"
|
||||
line="29"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="RtlSymmetry"
|
||||
message="When you define `paddingEnd` you should probably also define `paddingStart` for right-to-left symmetry"
|
||||
errorLine1=" android:paddingEnd="@dimen/normal_margin">"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="src/main/res/layout/item_clip_in_activity.xml"
|
||||
line="8"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
</issues>
|
||||
@@ -1,50 +0,0 @@
|
||||
{
|
||||
"formatVersion": 1,
|
||||
"database": {
|
||||
"version": 1,
|
||||
"identityHash": "af614a2263d4c4176a70e1121a2d16bc",
|
||||
"entities": [
|
||||
{
|
||||
"tableName": "clips",
|
||||
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `value` TEXT NOT NULL)",
|
||||
"fields": [
|
||||
{
|
||||
"fieldPath": "id",
|
||||
"columnName": "id",
|
||||
"affinity": "INTEGER",
|
||||
"notNull": false
|
||||
},
|
||||
{
|
||||
"fieldPath": "value",
|
||||
"columnName": "value",
|
||||
"affinity": "TEXT",
|
||||
"notNull": true
|
||||
}
|
||||
],
|
||||
"primaryKey": {
|
||||
"autoGenerate": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
]
|
||||
},
|
||||
"indices": [
|
||||
{
|
||||
"name": "index_clips_id",
|
||||
"unique": true,
|
||||
"columnNames": [
|
||||
"id"
|
||||
],
|
||||
"orders": [],
|
||||
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_clips_id` ON `${TABLE_NAME}` (`id`)"
|
||||
}
|
||||
],
|
||||
"foreignKeys": []
|
||||
}
|
||||
],
|
||||
"views": [],
|
||||
"setupQueries": [
|
||||
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
|
||||
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'af614a2263d4c4176a70e1121a2d16bc')"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,14 @@ import android.graphics.drawable.RippleDrawable
|
||||
import android.os.Bundle
|
||||
import android.provider.Settings
|
||||
import org.fossify.commons.dialogs.ConfirmationAdvancedDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.appLaunched
|
||||
import org.fossify.commons.extensions.applyColorFilter
|
||||
import org.fossify.commons.extensions.getContrastColor
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.hideKeyboard
|
||||
import org.fossify.commons.extensions.launchMoreAppsFromUsIntent
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.LICENSE_GSON
|
||||
import org.fossify.commons.models.FAQItem
|
||||
import org.fossify.keyboard.BuildConfig
|
||||
@@ -26,7 +33,12 @@ class MainActivity : SimpleActivity() {
|
||||
refreshMenuItems()
|
||||
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(mainCoordinator, mainHolder, useTransparentNavigation = false, useTopSearchMenu = false)
|
||||
updateMaterialActivityViews(
|
||||
mainCoordinator,
|
||||
mainHolder,
|
||||
useTransparentNavigation = false,
|
||||
useTopSearchMenu = false
|
||||
)
|
||||
setupMaterialScrollListener(mainNestedScrollview, mainToolbar)
|
||||
|
||||
changeKeyboardHolder.setOnClickListener {
|
||||
@@ -39,7 +51,12 @@ class MainActivity : SimpleActivity() {
|
||||
super.onResume()
|
||||
setupToolbar(binding.mainToolbar)
|
||||
if (!isKeyboardEnabled()) {
|
||||
ConfirmationAdvancedDialog(this, messageId = R.string.redirection_note, positive = R.string.ok, negative = 0) { success ->
|
||||
ConfirmationAdvancedDialog(
|
||||
activity = this,
|
||||
messageId = R.string.redirection_note,
|
||||
positive = R.string.ok,
|
||||
negative = 0
|
||||
) { success ->
|
||||
if (success) {
|
||||
Intent(Settings.ACTION_INPUT_METHOD_SETTINGS).apply {
|
||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
@@ -69,7 +86,8 @@ class MainActivity : SimpleActivity() {
|
||||
|
||||
private fun refreshMenuItems() {
|
||||
binding.mainToolbar.menu.apply {
|
||||
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations)
|
||||
findItem(R.id.more_apps_from_us).isVisible =
|
||||
!resources.getBoolean(R.bool.hide_google_relations)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,8 +109,10 @@ class MainActivity : SimpleActivity() {
|
||||
}
|
||||
|
||||
private fun updateChangeKeyboardColor() {
|
||||
val applyBackground = resources.getDrawable(R.drawable.button_background_rounded, theme) as RippleDrawable
|
||||
(applyBackground as LayerDrawable).findDrawableByLayerId(R.id.button_background_holder).applyColorFilter(getProperPrimaryColor())
|
||||
val applyBackground =
|
||||
resources.getDrawable(R.drawable.button_background_rounded, theme) as RippleDrawable
|
||||
(applyBackground as LayerDrawable).findDrawableByLayerId(R.id.button_background_holder)
|
||||
.applyColorFilter(getProperPrimaryColor())
|
||||
binding.changeKeyboard.apply {
|
||||
background = applyBackground
|
||||
setTextColor(getProperPrimaryColor().getContrastColor())
|
||||
|
||||
@@ -3,15 +3,34 @@ package org.fossify.keyboard.activities
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import org.fossify.commons.dialogs.RadioGroupDialog
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.beGoneIf
|
||||
import org.fossify.commons.extensions.beVisibleIf
|
||||
import org.fossify.commons.extensions.getCustomizeColorsString
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.isOrWasThankYouInstalled
|
||||
import org.fossify.commons.extensions.launchPurchaseThankYouIntent
|
||||
import org.fossify.commons.extensions.toast
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.extensions.viewBinding
|
||||
import org.fossify.commons.helpers.NavigationIcon
|
||||
import org.fossify.commons.helpers.isTiramisuPlus
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.keyboard.R
|
||||
import org.fossify.keyboard.databinding.ActivitySettingsBinding
|
||||
import org.fossify.keyboard.dialogs.ManageKeyboardLanguagesDialog
|
||||
import org.fossify.keyboard.extensions.*
|
||||
import org.fossify.keyboard.helpers.*
|
||||
import org.fossify.keyboard.extensions.config
|
||||
import org.fossify.keyboard.extensions.getCurrentVoiceInputMethod
|
||||
import org.fossify.keyboard.extensions.getKeyboardLanguageText
|
||||
import org.fossify.keyboard.extensions.getKeyboardLanguagesRadioItems
|
||||
import org.fossify.keyboard.extensions.getVoiceInputMethods
|
||||
import org.fossify.keyboard.extensions.getVoiceInputRadioItems
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_100_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_120_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_140_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_160_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_70_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_80_PERCENT
|
||||
import org.fossify.keyboard.helpers.KEYBOARD_HEIGHT_90_PERCENT
|
||||
import java.util.Locale
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
@@ -24,7 +43,12 @@ class SettingsActivity : SimpleActivity() {
|
||||
setContentView(binding.root)
|
||||
|
||||
binding.apply {
|
||||
updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
|
||||
updateMaterialActivityViews(
|
||||
mainCoordinatorLayout = settingsCoordinator,
|
||||
nestedView = settingsHolder,
|
||||
useTransparentNavigation = true,
|
||||
useTopSearchMenu = false
|
||||
)
|
||||
setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
|
||||
}
|
||||
}
|
||||
@@ -166,27 +190,51 @@ class SettingsActivity : SimpleActivity() {
|
||||
|
||||
private fun setupKeyboardHeightMultiplier() {
|
||||
binding.apply {
|
||||
settingsKeyboardHeightMultiplier.text = getKeyboardHeightPercentageText(config.keyboardHeightPercentage)
|
||||
settingsKeyboardHeightMultiplier.text =
|
||||
getKeyboardHeightPercentageText(config.keyboardHeightPercentage)
|
||||
settingsKeyboardHeightMultiplierHolder.setOnClickListener {
|
||||
val items = arrayListOf(
|
||||
RadioItem(KEYBOARD_HEIGHT_70_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_70_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_80_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_80_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_90_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_90_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_100_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_100_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_120_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_120_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_140_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_140_PERCENT)),
|
||||
RadioItem(KEYBOARD_HEIGHT_160_PERCENT, getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_160_PERCENT)),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_70_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_70_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_80_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_80_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_90_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_90_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_100_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_100_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_120_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_120_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_140_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_140_PERCENT)
|
||||
),
|
||||
RadioItem(
|
||||
id = KEYBOARD_HEIGHT_160_PERCENT,
|
||||
title = getKeyboardHeightPercentageText(KEYBOARD_HEIGHT_160_PERCENT)
|
||||
),
|
||||
)
|
||||
|
||||
RadioGroupDialog(this@SettingsActivity, items, config.keyboardHeightPercentage) {
|
||||
config.keyboardHeightPercentage = it as Int
|
||||
settingsKeyboardHeightMultiplier.text = getKeyboardHeightPercentageText(config.keyboardHeightPercentage)
|
||||
settingsKeyboardHeightMultiplier.text =
|
||||
getKeyboardHeightPercentageText(config.keyboardHeightPercentage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getKeyboardHeightPercentageText(keyboardHeightPercentage: Int): String = "$keyboardHeightPercentage%"
|
||||
private fun getKeyboardHeightPercentageText(keyboardHeightPercentage: Int): String =
|
||||
"$keyboardHeightPercentage%"
|
||||
|
||||
private fun setupShowClipboardContent() {
|
||||
binding.apply {
|
||||
@@ -220,7 +268,9 @@ class SettingsActivity : SimpleActivity() {
|
||||
|
||||
private fun setupVoiceInputMethod() {
|
||||
binding.apply {
|
||||
settingsVoiceInputMethodValue.text = getCurrentVoiceInputMethod()?.first?.loadLabel(packageManager) ?: getString(R.string.none)
|
||||
settingsVoiceInputMethodValue.text =
|
||||
getCurrentVoiceInputMethod()?.first?.loadLabel(packageManager)
|
||||
?: getString(R.string.none)
|
||||
settingsVoiceInputMethodHolder.setOnClickListener {
|
||||
val inputMethods = getVoiceInputMethods()
|
||||
if (inputMethods.isEmpty()) {
|
||||
@@ -234,7 +284,9 @@ class SettingsActivity : SimpleActivity() {
|
||||
checkedItemId = inputMethods.indexOf(getCurrentVoiceInputMethod(inputMethods))
|
||||
) {
|
||||
config.voiceInputMethod = inputMethods.getOrNull(it as Int)?.first?.id.orEmpty()
|
||||
settingsVoiceInputMethodValue.text = getCurrentVoiceInputMethod(inputMethods)?.first?.loadLabel(packageManager) ?: getString(R.string.none)
|
||||
settingsVoiceInputMethodValue.text =
|
||||
getCurrentVoiceInputMethod(inputMethods)?.first?.loadLabel(packageManager)
|
||||
?: getString(R.string.none)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,4 +27,6 @@ open class SimpleActivity : BaseSimpleActivity() {
|
||||
)
|
||||
|
||||
override fun getAppLauncherName() = getString(R.string.app_launcher_name)
|
||||
|
||||
override fun getRepositoryName() = "Keyboard"
|
||||
}
|
||||
|
||||
@@ -7,7 +7,11 @@ import android.graphics.Color
|
||||
import android.inputmethodservice.InputMethodService
|
||||
import android.os.IBinder
|
||||
import android.os.UserManager
|
||||
import android.view.*
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.Window
|
||||
import android.view.WindowManager
|
||||
import android.view.inputmethod.InputMethodInfo
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.view.inputmethod.InputMethodSubtype
|
||||
@@ -16,13 +20,48 @@ import androidx.appcompat.app.AlertDialog
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.fossify.commons.databinding.DialogTitleBinding
|
||||
import org.fossify.commons.extensions.*
|
||||
import org.fossify.commons.extensions.baseConfig
|
||||
import org.fossify.commons.extensions.darkenColor
|
||||
import org.fossify.commons.extensions.getColoredDrawableWithColor
|
||||
import org.fossify.commons.extensions.getProperBackgroundColor
|
||||
import org.fossify.commons.extensions.getProperPrimaryColor
|
||||
import org.fossify.commons.extensions.getProperTextColor
|
||||
import org.fossify.commons.extensions.isBlackAndWhiteTheme
|
||||
import org.fossify.commons.extensions.isDynamicTheme
|
||||
import org.fossify.commons.extensions.isSystemInDarkMode
|
||||
import org.fossify.commons.extensions.lightenColor
|
||||
import org.fossify.commons.extensions.updateTextColors
|
||||
import org.fossify.commons.helpers.isNougatPlus
|
||||
import org.fossify.commons.models.RadioItem
|
||||
import org.fossify.commons.views.MyTextView
|
||||
import org.fossify.keyboard.R
|
||||
import org.fossify.keyboard.databases.ClipsDatabase
|
||||
import org.fossify.keyboard.helpers.*
|
||||
import org.fossify.keyboard.helpers.Config
|
||||
import org.fossify.keyboard.helpers.INPUT_METHOD_SUBTYPE_VOICE
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_ARABIC
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_BENGALI
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_BULGARIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_CHUVASH
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_DANISH
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_ENGLISH_DVORAK
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_ENGLISH_QWERTZ
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_ESPERANTO
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_FRENCH_AZERTY
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_FRENCH_BEPO
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_GERMAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_GREEK
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_HEBREW
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_LITHUANIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_NORWEGIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_POLISH
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_ROMANIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_RUSSIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_SLOVENIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_SPANISH
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_SWEDISH
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_TURKISH_Q
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_UKRAINIAN
|
||||
import org.fossify.keyboard.helpers.LANGUAGE_VIETNAMESE_TELEX
|
||||
import org.fossify.keyboard.interfaces.ClipsDao
|
||||
|
||||
val Context.config: Config get() = Config.newInstance(applicationContext.safeStorageContext)
|
||||
@@ -58,7 +97,7 @@ fun Context.getCurrentClip(): String? {
|
||||
}
|
||||
|
||||
fun Context.getKeyboardBackgroundColor(): Int {
|
||||
val color = if (config.isUsingSystemTheme) {
|
||||
val color = if (isDynamicTheme()) {
|
||||
resources.getColor(R.color.you_keyboard_background_color, theme)
|
||||
} else {
|
||||
getProperBackgroundColor().darkenColor(2)
|
||||
@@ -78,8 +117,8 @@ fun Context.getKeyboardBackgroundColor(): Int {
|
||||
}
|
||||
|
||||
fun Context.getStrokeColor(): Int {
|
||||
return if (config.isUsingSystemTheme) {
|
||||
if (isUsingSystemDarkTheme()) {
|
||||
return if (isDynamicTheme()) {
|
||||
if (isSystemInDarkMode()) {
|
||||
resources.getColor(R.color.md_grey_800, theme)
|
||||
} else {
|
||||
resources.getColor(R.color.md_grey_400, theme)
|
||||
@@ -94,7 +133,7 @@ fun Context.getStrokeColor(): Int {
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.getKeyboardDialogBuilder() = if (safeStorageContext.baseConfig.isUsingSystemTheme) {
|
||||
fun Context.getKeyboardDialogBuilder() = if (safeStorageContext.isDynamicTheme()) {
|
||||
MaterialAlertDialogBuilder(this, R.style.MyKeyboard_Alert)
|
||||
} else {
|
||||
AlertDialog.Builder(this, R.style.MyKeyboard_Alert)
|
||||
@@ -137,9 +176,18 @@ fun Context.setupKeyboardDialogStuff(
|
||||
show()
|
||||
|
||||
val bgDrawable = when {
|
||||
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(resources, R.drawable.black_dialog_background, theme)
|
||||
baseConfig.isUsingSystemTheme -> ResourcesCompat.getDrawable(resources, R.drawable.dialog_you_background, theme)
|
||||
else -> resources.getColoredDrawableWithColor(R.drawable.dialog_bg, baseConfig.backgroundColor)
|
||||
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(
|
||||
resources, R.drawable.black_dialog_background, theme
|
||||
)
|
||||
|
||||
isDynamicTheme() -> ResourcesCompat.getDrawable(
|
||||
resources, R.drawable.dialog_you_background, theme
|
||||
)
|
||||
|
||||
else -> resources.getColoredDrawableWithColor(
|
||||
drawableId = R.drawable.dialog_bg,
|
||||
color = baseConfig.backgroundColor
|
||||
)
|
||||
}
|
||||
|
||||
window?.setBackgroundDrawable(bgDrawable)
|
||||
@@ -148,14 +196,17 @@ fun Context.setupKeyboardDialogStuff(
|
||||
} else {
|
||||
var title: TextView? = null
|
||||
if (titleId != 0 || titleText.isNotEmpty()) {
|
||||
title = DialogTitleBinding.inflate(LayoutInflater.from(this)).dialogTitleTextview.apply {
|
||||
if (titleText.isNotEmpty()) {
|
||||
text = titleText
|
||||
} else {
|
||||
setText(titleId)
|
||||
}
|
||||
setTextColor(textColor)
|
||||
}
|
||||
title =
|
||||
DialogTitleBinding
|
||||
.inflate(LayoutInflater.from(this))
|
||||
.dialogTitleTextview.apply {
|
||||
if (titleText.isNotEmpty()) {
|
||||
text = titleText
|
||||
} else {
|
||||
setText(titleId)
|
||||
}
|
||||
setTextColor(textColor)
|
||||
}
|
||||
}
|
||||
|
||||
// if we use the same primary and background color, use the text color for dialog confirmation buttons
|
||||
@@ -183,9 +234,18 @@ fun Context.setupKeyboardDialogStuff(
|
||||
getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(dialogButtonColor)
|
||||
|
||||
val bgDrawable = when {
|
||||
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(resources, R.drawable.black_dialog_background, theme)
|
||||
baseConfig.isUsingSystemTheme -> ResourcesCompat.getDrawable(resources, R.drawable.dialog_you_background, theme)
|
||||
else -> resources.getColoredDrawableWithColor(R.drawable.dialog_bg, baseConfig.backgroundColor)
|
||||
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(
|
||||
resources, R.drawable.black_dialog_background, theme
|
||||
)
|
||||
|
||||
isDynamicTheme() -> ResourcesCompat.getDrawable(
|
||||
resources, R.drawable.dialog_you_background, theme
|
||||
)
|
||||
|
||||
else -> resources.getColoredDrawableWithColor(
|
||||
drawableId = R.drawable.dialog_bg,
|
||||
color = baseConfig.backgroundColor
|
||||
)
|
||||
}
|
||||
|
||||
window?.setBackgroundDrawable(bgDrawable)
|
||||
|
||||
@@ -523,7 +523,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared
|
||||
if (key != null && key in arrayOf(
|
||||
SHOW_KEY_BORDERS, KEYBOARD_LANGUAGE, HEIGHT_PERCENTAGE, SHOW_NUMBERS_ROW, VOICE_INPUT_METHOD,
|
||||
TEXT_COLOR, BACKGROUND_COLOR, PRIMARY_COLOR, ACCENT_COLOR, CUSTOM_TEXT_COLOR, CUSTOM_BACKGROUND_COLOR,
|
||||
CUSTOM_PRIMARY_COLOR, CUSTOM_ACCENT_COLOR, IS_USING_SHARED_THEME, IS_USING_SYSTEM_THEME
|
||||
CUSTOM_PRIMARY_COLOR, CUSTOM_ACCENT_COLOR, IS_GLOBAL_THEME_ENABLED, IS_SYSTEM_THEME_ENABLED
|
||||
)
|
||||
) {
|
||||
keyboardView?.setupKeyboard()
|
||||
|
||||
@@ -61,7 +61,11 @@ import org.fossify.keyboard.models.ListItem
|
||||
import java.util.*
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables", "ClickableViewAccessibility")
|
||||
class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: AttributeSet?, defStyleRes: Int = 0) : View(context, attrs, defStyleRes) {
|
||||
class MyKeyboardView @JvmOverloads constructor(
|
||||
context: Context,
|
||||
attrs: AttributeSet?,
|
||||
defStyleRes: Int = 0
|
||||
) : View(context, attrs, defStyleRes) {
|
||||
|
||||
override fun dispatchHoverEvent(event: MotionEvent): Boolean {
|
||||
return if (accessHelper?.dispatchHoverEvent(event) == true) {
|
||||
@@ -184,7 +188,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
init {
|
||||
val attributes = context.obtainStyledAttributes(attrs, R.styleable.MyKeyboardView, 0, defStyleRes)
|
||||
val attributes =
|
||||
context.obtainStyledAttributes(attrs, R.styleable.MyKeyboardView, 0, defStyleRes)
|
||||
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
val keyTextSize = 0
|
||||
val indexCnt = attributes.indexCount
|
||||
@@ -192,7 +197,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
try {
|
||||
for (i in 0 until indexCnt) {
|
||||
when (val attr = attributes.getIndex(i)) {
|
||||
R.styleable.MyKeyboardView_keyTextSize -> mKeyTextSize = attributes.getDimensionPixelSize(attr, 18)
|
||||
R.styleable.MyKeyboardView_keyTextSize -> mKeyTextSize =
|
||||
attributes.getDimensionPixelSize(attr, 18)
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
@@ -338,14 +344,25 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
suggestionsHolder.addOnLayoutChangeListener(object : OnLayoutChangeListener {
|
||||
override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {
|
||||
override fun onLayoutChange(
|
||||
v: View?,
|
||||
left: Int,
|
||||
top: Int,
|
||||
right: Int,
|
||||
bottom: Int,
|
||||
oldLeft: Int,
|
||||
oldTop: Int,
|
||||
oldRight: Int,
|
||||
oldBottom: Int
|
||||
) {
|
||||
updateSuggestionsToolbarLayout()
|
||||
binding.suggestionsHolder.removeOnLayoutChangeListener(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
val clipboardManager = (context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager)
|
||||
val clipboardManager =
|
||||
(context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager)
|
||||
clipboardManager.addPrimaryClipChangedListener {
|
||||
val clipboardContent = clipboardManager.primaryClip?.getItemAt(0)?.text?.trim()
|
||||
if (clipboardContent?.isNotEmpty() == true) {
|
||||
@@ -376,7 +393,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
fun setEditorInfo(editorInfo: EditorInfo) {
|
||||
emojiCompatMetadataVersion = editorInfo.extras?.getInt(EmojiCompat.EDITOR_INFO_METAVERSION_KEY, 0) ?: 0
|
||||
emojiCompatMetadataVersion =
|
||||
editorInfo.extras?.getInt(EmojiCompat.EDITOR_INFO_METAVERSION_KEY, 0) ?: 0
|
||||
}
|
||||
|
||||
fun setupKeyboard(changedView: View? = null) {
|
||||
@@ -388,7 +406,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
mStrokeColor = getStrokeColor()
|
||||
|
||||
mShowKeyBorders = config.showKeyBorders
|
||||
mUsingSystemTheme = config.isUsingSystemTheme
|
||||
mUsingSystemTheme = isDynamicTheme()
|
||||
mVoiceInputMethod = config.voiceInputMethod
|
||||
}
|
||||
|
||||
@@ -403,8 +421,10 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
if (!isMainKeyboard) {
|
||||
val previewBackground = background as LayerDrawable
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_shape).applyColorFilter(mBackgroundColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_stroke).applyColorFilter(mStrokeColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_shape)
|
||||
.applyColorFilter(mBackgroundColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_stroke)
|
||||
.applyColorFilter(mStrokeColor)
|
||||
background = previewBackground
|
||||
} else {
|
||||
background.applyColorFilter(mKeyboardBackgroundColor)
|
||||
@@ -417,11 +437,15 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
mToolbarHolder?.background = ColorDrawable(mKeyboardBackgroundColor)
|
||||
|
||||
clipboardValue.apply {
|
||||
background = resources.getDrawable(R.drawable.clipboard_background, context.theme).apply {
|
||||
val layerDrawable = (this as RippleDrawable).findDrawableByLayerId(R.id.clipboard_background_holder) as LayerDrawable
|
||||
layerDrawable.findDrawableByLayerId(R.id.clipboard_background_stroke).applyColorFilter(mStrokeColor)
|
||||
layerDrawable.findDrawableByLayerId(R.id.clipboard_background_shape).applyColorFilter(mBackgroundColor)
|
||||
}
|
||||
background =
|
||||
resources.getDrawable(R.drawable.clipboard_background, context.theme).apply {
|
||||
val layerDrawable = (this as RippleDrawable)
|
||||
.findDrawableByLayerId(R.id.clipboard_background_holder) as LayerDrawable
|
||||
layerDrawable.findDrawableByLayerId(R.id.clipboard_background_stroke)
|
||||
.applyColorFilter(mStrokeColor)
|
||||
layerDrawable.findDrawableByLayerId(R.id.clipboard_background_shape)
|
||||
.applyColorFilter(mBackgroundColor)
|
||||
}
|
||||
|
||||
setTextColor(mTextColor)
|
||||
setLinkTextColor(mTextColor)
|
||||
@@ -448,7 +472,11 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
clipboardContentPlaceholder2.setTextColor(mTextColor)
|
||||
}
|
||||
|
||||
setupEmojiPalette(toolbarColor = mKeyboardBackgroundColor, backgroundColor = mBackgroundColor, textColor = mTextColor)
|
||||
setupEmojiPalette(
|
||||
toolbarColor = mKeyboardBackgroundColor,
|
||||
backgroundColor = mBackgroundColor,
|
||||
textColor = mTextColor
|
||||
)
|
||||
if (context.config.keyboardLanguage == LANGUAGE_VIETNAMESE_TELEX) {
|
||||
setupLanguageTelex()
|
||||
} else {
|
||||
@@ -492,7 +520,12 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
private fun adjustCase(label: CharSequence): CharSequence? {
|
||||
var newLabel: CharSequence? = label
|
||||
if (!newLabel.isNullOrEmpty() && mKeyboard!!.mShiftState != ShiftState.OFF && newLabel.length < 3 && Character.isLowerCase(newLabel[0])) {
|
||||
if (
|
||||
!newLabel.isNullOrEmpty()
|
||||
&& mKeyboard!!.mShiftState != ShiftState.OFF
|
||||
&& newLabel.length < 3
|
||||
&& Character.isLowerCase(newLabel[0])
|
||||
) {
|
||||
if (context.config.keyboardLanguage == LANGUAGE_TURKISH_Q) {
|
||||
newLabel = newLabel.toString().uppercase(Locale.forLanguageTag("tr"))
|
||||
} else {
|
||||
@@ -610,14 +643,23 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
val rows = label.split("\n")
|
||||
val textSize = paint.textSize
|
||||
val startY = (key.height / 2f) + ((textSize - paint.descent()) / 2f) - ((textSize / 2f) * (rows.size - 1))
|
||||
val startY =
|
||||
(key.height / 2f) + ((textSize - paint.descent()) / 2f) - ((textSize / 2f) * (rows.size - 1))
|
||||
rows.forEachIndexed { index, row ->
|
||||
canvas.drawText(row, key.width / 2f, startY + textSize * index, paint)
|
||||
}
|
||||
|
||||
if (key.topSmallNumber.isNotEmpty() && !(context.config.showNumbersRow && Regex("\\d").matches(key.topSmallNumber))) {
|
||||
if (key.topSmallNumber.isNotEmpty() && !(context.config.showNumbersRow && Regex("\\d").matches(
|
||||
key.topSmallNumber
|
||||
))
|
||||
) {
|
||||
val bounds = Rect().also {
|
||||
smallLetterPaint.getTextBounds(key.topSmallNumber, 0, key.topSmallNumber.length, it)
|
||||
smallLetterPaint.getTextBounds(
|
||||
key.topSmallNumber,
|
||||
0,
|
||||
key.topSmallNumber.length,
|
||||
it
|
||||
)
|
||||
}
|
||||
|
||||
smallLetterPaint.color = if (key.pressed) {
|
||||
@@ -675,11 +717,17 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
val keyIconLeft = centerX - keyIconWidth / 2
|
||||
val keyIconTop = centerY - keyIconHeight / 2
|
||||
|
||||
keyIcon.setBounds(keyIconLeft, keyIconTop, keyIconLeft + keyIconWidth, keyIconTop + keyIconHeight)
|
||||
keyIcon.setBounds(
|
||||
keyIconLeft,
|
||||
keyIconTop,
|
||||
keyIconLeft + keyIconWidth,
|
||||
keyIconTop + keyIconHeight
|
||||
)
|
||||
keyIcon.draw(canvas)
|
||||
|
||||
val secondaryIconPaddingRight = 10
|
||||
val secondaryIconLeft = key.width - secondaryIconPaddingRight - secondaryIconWidth
|
||||
val secondaryIconLeft =
|
||||
key.width - secondaryIconPaddingRight - secondaryIconWidth
|
||||
val secondaryIconRight = secondaryIconLeft + secondaryIconWidth
|
||||
|
||||
val secondaryIconTop = 14 // This will act as a topPadding
|
||||
@@ -810,7 +858,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
private fun clearClipboardContent() {
|
||||
val clipboardManager = (context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager) ?: return
|
||||
val clipboardManager =
|
||||
(context.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager) ?: return
|
||||
if (isPiePlus()) {
|
||||
clipboardManager.clearPrimaryClip()
|
||||
} else {
|
||||
@@ -820,13 +869,20 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
private fun toggleClipboardVisibility(show: Boolean) {
|
||||
if ((show && keyboardViewBinding?.clipboardValue!!.alpha == 0f) || (!show && keyboardViewBinding?.clipboardValue!!.alpha == 1f)) {
|
||||
if (
|
||||
(show && keyboardViewBinding?.clipboardValue!!.alpha == 0f) ||
|
||||
(!show && keyboardViewBinding?.clipboardValue!!.alpha == 1f)
|
||||
) {
|
||||
val newAlpha = if (show) 1f else 0f
|
||||
val animations = ArrayList<ObjectAnimator>()
|
||||
val clipboardValueAnimation = ObjectAnimator.ofFloat(keyboardViewBinding!!.clipboardValue, "alpha", newAlpha)
|
||||
val clipboardValueAnimation = ObjectAnimator.ofFloat(
|
||||
keyboardViewBinding!!.clipboardValue, "alpha", newAlpha
|
||||
)
|
||||
animations.add(clipboardValueAnimation)
|
||||
|
||||
val clipboardClearAnimation = ObjectAnimator.ofFloat(keyboardViewBinding!!.clipboardClear, "alpha", newAlpha)
|
||||
val clipboardClearAnimation = ObjectAnimator.ofFloat(
|
||||
keyboardViewBinding!!.clipboardClear, "alpha", newAlpha
|
||||
)
|
||||
animations.add(clipboardClearAnimation)
|
||||
|
||||
val animSet = AnimatorSet()
|
||||
@@ -904,7 +960,10 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
mPreviewText!!.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize.toFloat())
|
||||
mPreviewText!!.typeface = Typeface.DEFAULT_BOLD
|
||||
} else {
|
||||
mPreviewText!!.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge.toFloat())
|
||||
mPreviewText!!.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
mPreviewTextSizeLarge.toFloat()
|
||||
)
|
||||
mPreviewText!!.typeface = Typeface.DEFAULT
|
||||
}
|
||||
|
||||
@@ -916,12 +975,17 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
val previewBackground = mPreviewText!!.background as LayerDrawable
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_shape).applyColorFilter(mBackgroundColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_stroke).applyColorFilter(mStrokeColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_shape)
|
||||
.applyColorFilter(mBackgroundColor)
|
||||
previewBackground.findDrawableByLayerId(R.id.button_background_stroke)
|
||||
.applyColorFilter(mStrokeColor)
|
||||
mPreviewText!!.background = previewBackground
|
||||
|
||||
mPreviewText!!.setTextColor(mTextColor)
|
||||
mPreviewText!!.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED))
|
||||
mPreviewText!!.measure(
|
||||
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
|
||||
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
|
||||
)
|
||||
val popupWidth = Math.max(mPreviewText!!.measuredWidth, key.width)
|
||||
val popupHeight = mPreviewHeight
|
||||
val lp = mPreviewText!!.layoutParams
|
||||
@@ -961,10 +1025,20 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
previewPopup.dismiss()
|
||||
|
||||
if (key.label.isNotEmpty() && key.code != KEYCODE_MODE_CHANGE && key.code != KEYCODE_SYMBOLS_MODE_CHANGE && key.code != KEYCODE_SHIFT) {
|
||||
if (
|
||||
key.label.isNotEmpty()
|
||||
&& key.code != KEYCODE_MODE_CHANGE
|
||||
&& key.code != KEYCODE_SYMBOLS_MODE_CHANGE
|
||||
&& key.code != KEYCODE_SHIFT
|
||||
) {
|
||||
previewPopup.width = popupWidth
|
||||
previewPopup.height = popupHeight
|
||||
previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY, mPopupPreviewX, mPopupPreviewY)
|
||||
previewPopup.showAtLocation(
|
||||
mPopupParent,
|
||||
Gravity.NO_GRAVITY,
|
||||
mPopupPreviewX,
|
||||
mPopupPreviewY
|
||||
)
|
||||
mPreviewText!!.visibility = VISIBLE
|
||||
}
|
||||
}
|
||||
@@ -1042,35 +1116,46 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
// For 'number' and 'phone' keyboards the count of popup keys might be bigger than count of keys in the main keyboard.
|
||||
// And therefore the width of the key might be smaller than width declared in MyKeyboard.Key.width for the main keyboard.
|
||||
val popupKeyWidth = popupKey.calcKeyWidth(containerWidth = mMiniKeyboardContainer?.measuredWidth ?: width)
|
||||
val popupKeyWidth = popupKey.calcKeyWidth(
|
||||
containerWidth = mMiniKeyboardContainer?.measuredWidth ?: width
|
||||
)
|
||||
|
||||
if (mMiniKeyboardContainer == null) {
|
||||
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
val inflater =
|
||||
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
keyboardPopupBinding = KeyboardPopupKeyboardBinding.inflate(inflater).apply {
|
||||
mMiniKeyboardContainer = root
|
||||
mMiniKeyboard = miniKeyboardView
|
||||
}
|
||||
|
||||
val keyboard = if (popupKey.popupCharacters != null) {
|
||||
MyKeyboard(context, popupKeyboardId, popupKey.popupCharacters!!, popupKeyWidth)
|
||||
MyKeyboard(
|
||||
context = context,
|
||||
layoutTemplateResId = popupKeyboardId,
|
||||
characters = popupKey.popupCharacters!!,
|
||||
keyWidth = popupKeyWidth
|
||||
)
|
||||
} else {
|
||||
MyKeyboard(context, popupKeyboardId, 0)
|
||||
}
|
||||
mMiniKeyboard!!.setKeyboard(keyboard)
|
||||
mPopupParent = this
|
||||
mMiniKeyboardContainer!!.measure(
|
||||
MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)
|
||||
MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
|
||||
MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)
|
||||
)
|
||||
mMiniKeyboardCache[popupKey] = mMiniKeyboardContainer
|
||||
} else {
|
||||
mMiniKeyboard = mMiniKeyboardCache[popupKey]?.let(KeyboardPopupKeyboardBinding::bind)?.miniKeyboardView
|
||||
mMiniKeyboard =
|
||||
mMiniKeyboardCache[popupKey]?.let(KeyboardPopupKeyboardBinding::bind)?.miniKeyboardView
|
||||
}
|
||||
|
||||
getLocationInWindow(mCoordinates)
|
||||
mPopupX = popupKey.x
|
||||
mPopupY = popupKey.y
|
||||
|
||||
val widthToUse = mMiniKeyboardContainer!!.measuredWidth - (popupKey.popupCharacters!!.length / 2) * popupKeyWidth
|
||||
val widthToUse =
|
||||
mMiniKeyboardContainer!!.measuredWidth - (popupKey.popupCharacters!!.length / 2) * popupKeyWidth
|
||||
mPopupX = mPopupX + popupKeyWidth - widthToUse
|
||||
mPopupY -= mMiniKeyboardContainer!!.measuredHeight
|
||||
val x = mPopupX + mCoordinates[0]
|
||||
@@ -1086,7 +1171,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
val keysCnt = mMiniKeyboard!!.mKeys.size
|
||||
var selectedKeyIndex = Math.floor((me.x - miniKeyboardX) / popupKeyWidth.toDouble()).toInt()
|
||||
var selectedKeyIndex =
|
||||
Math.floor((me.x - miniKeyboardX) / popupKeyWidth.toDouble()).toInt()
|
||||
if (keysCnt > MAX_KEYS_PER_MINI_ROW) {
|
||||
selectedKeyIndex += MAX_KEYS_PER_MINI_ROW
|
||||
}
|
||||
@@ -1152,7 +1238,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
mMiniKeyboard!!.width / lastRowKeyCount
|
||||
}
|
||||
|
||||
var selectedKeyIndex = Math.floor((me.x - coords[0]) / widthPerKey.toDouble()).toInt()
|
||||
var selectedKeyIndex =
|
||||
Math.floor((me.x - coords[0]) / widthPerKey.toDouble()).toInt()
|
||||
if (keysCnt > MAX_KEYS_PER_MINI_ROW) {
|
||||
selectedKeyIndex = Math.max(0, selectedKeyIndex)
|
||||
selectedKeyIndex += MAX_KEYS_PER_MINI_ROW
|
||||
@@ -1344,6 +1431,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP -> {
|
||||
setCurrentKeyPressed(false)
|
||||
|
||||
mLastSpaceMoveX = 0
|
||||
removeMessages()
|
||||
if (keyIndex == mCurrentKey) {
|
||||
@@ -1372,10 +1461,6 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
detectAndSendKey(mCurrentKey, touchX, touchY, eventTime)
|
||||
}
|
||||
|
||||
if (mLastKeyPressedCode != KEYCODE_MODE_CHANGE && mLastKeyPressedCode != KEYCODE_SYMBOLS_MODE_CHANGE) {
|
||||
setCurrentKeyPressed(false)
|
||||
}
|
||||
|
||||
mRepeatKeyIndex = NOT_A_KEY
|
||||
mOnKeyboardActionListener!!.onActionUp()
|
||||
mIsLongPressingSpace = false
|
||||
@@ -1388,6 +1473,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
dismissPopupKeyboard()
|
||||
mAbortKey = true
|
||||
showPreview(NOT_A_KEY)
|
||||
setCurrentKeyPressed(false)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1436,7 +1522,9 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
val clipboardContent = context.getCurrentClip()
|
||||
|
||||
val pinnedClips = context.clipsDB.getClips()
|
||||
val isCurrentClipPinnedToo = pinnedClips.any { clipboardContent?.isNotEmpty() == true && it.value.trim() == clipboardContent }
|
||||
val isCurrentClipPinnedToo = pinnedClips.any {
|
||||
clipboardContent?.isNotEmpty() == true && it.value.trim() == clipboardContent
|
||||
}
|
||||
|
||||
if (!isCurrentClipPinnedToo && clipboardContent?.isNotEmpty() == true) {
|
||||
val section = ClipsSectionLabel(context.getString(R.string.clipboard_current), true)
|
||||
@@ -1471,7 +1559,11 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
}
|
||||
}
|
||||
|
||||
val adapter = ClipsKeyboardAdapter(safeStorageContext, clips, refreshClipsListener) { clip ->
|
||||
val adapter = ClipsKeyboardAdapter(
|
||||
context = safeStorageContext,
|
||||
items = clips,
|
||||
refreshClipsListener = refreshClipsListener
|
||||
) { clip ->
|
||||
mOnKeyboardActionListener!!.onText(clip.value)
|
||||
vibrateIfNeeded()
|
||||
}
|
||||
@@ -1590,7 +1682,10 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
val emojiCategories = prepareEmojiCategories(emojis)
|
||||
var emojiItems = prepareEmojiItems(emojiCategories)
|
||||
|
||||
val emojiLayoutManager = AutoGridLayoutManager(context, context.resources.getDimensionPixelSize(R.dimen.emoji_item_size)).apply {
|
||||
val emojiLayoutManager = AutoGridLayoutManager(
|
||||
context = context,
|
||||
itemWidth = context.resources.getDimensionPixelSize(R.dimen.emoji_item_size)
|
||||
).apply {
|
||||
spanSizeLookup = object : SpanSizeLookup() {
|
||||
override fun getSpanSize(position: Int): Int {
|
||||
return if (emojiItems[position] is EmojisAdapter.Item.Category) {
|
||||
@@ -1609,7 +1704,11 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
val strip = this
|
||||
removeAllViews()
|
||||
emojiCategories.entries.forEach { (category, _) ->
|
||||
ItemEmojiCategoryBinding.inflate(LayoutInflater.from(context), this, true).root.apply {
|
||||
ItemEmojiCategoryBinding.inflate(
|
||||
LayoutInflater.from(context),
|
||||
this,
|
||||
true
|
||||
).root.apply {
|
||||
id = generateViewId()
|
||||
emojiCategoryIds[id] = category
|
||||
setImageResource(getCategoryIconRes(category))
|
||||
@@ -1625,7 +1724,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
applyColorFilter(mPrimaryColor)
|
||||
keyboardViewBinding?.emojisList?.stopScroll()
|
||||
emojiLayoutManager.scrollToPositionWithOffset(
|
||||
emojiItems.indexOfFirst { it is EmojisAdapter.Item.Category && it.value == category }, 0
|
||||
emojiItems.indexOfFirst { it is EmojisAdapter.Item.Category && it.value == category },
|
||||
0
|
||||
)
|
||||
}
|
||||
applyColorFilter(emojiCategoryColor)
|
||||
@@ -1648,21 +1748,33 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
|
||||
clearOnScrollListeners()
|
||||
onScroll { offset ->
|
||||
keyboardViewBinding!!.emojiPaletteTopBar.elevation = if (offset > 4) context.resources.getDimensionPixelSize(R.dimen.one_dp).toFloat() else 0f
|
||||
emojiLayoutManager.findFirstCompletelyVisibleItemPosition().also { firstVisibleIndex ->
|
||||
emojiItems
|
||||
.withIndex()
|
||||
.lastOrNull { it.value is EmojisAdapter.Item.Category && it.index <= firstVisibleIndex }
|
||||
?.also { activeCategory ->
|
||||
val id = emojiCategoryIds.entries.first { it.value == (activeCategory.value as EmojisAdapter.Item.Category).value }.key
|
||||
keyboardViewBinding?.emojiCategoriesStrip?.children?.filterIsInstance<ImageButton>()?.forEach { button ->
|
||||
val selected = button.id == id
|
||||
button.applyColorFilter(
|
||||
if (selected) mPrimaryColor else emojiCategoryColor
|
||||
)
|
||||
}
|
||||
}
|
||||
keyboardViewBinding!!.emojiPaletteTopBar.elevation = when {
|
||||
offset > 4 -> context.resources.getDimensionPixelSize(R.dimen.one_dp).toFloat()
|
||||
else -> 0f
|
||||
}
|
||||
|
||||
emojiLayoutManager.findFirstCompletelyVisibleItemPosition()
|
||||
.also { firstVisibleIndex ->
|
||||
emojiItems
|
||||
.withIndex()
|
||||
.lastOrNull { it.value is EmojisAdapter.Item.Category && it.index <= firstVisibleIndex }
|
||||
?.also { activeCategory ->
|
||||
val id = emojiCategoryIds.entries.first {
|
||||
it.value == (activeCategory.value as EmojisAdapter.Item.Category).value
|
||||
}.key
|
||||
|
||||
keyboardViewBinding
|
||||
?.emojiCategoriesStrip
|
||||
?.children
|
||||
?.filterIsInstance<ImageButton>()
|
||||
?.forEach { button ->
|
||||
val selected = button.id == id
|
||||
button.applyColorFilter(
|
||||
if (selected) mPrimaryColor else emojiCategoryColor
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1702,7 +1814,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
private fun getKeyColor(): Int {
|
||||
val backgroundColor = safeStorageContext.getKeyboardBackgroundColor()
|
||||
val lighterColor = backgroundColor.lightenColor()
|
||||
val keyColor = if (context.config.isUsingSystemTheme) {
|
||||
val keyColor = if (context.isDynamicTheme()) {
|
||||
lighterColor
|
||||
} else {
|
||||
if (backgroundColor == Color.BLACK) {
|
||||
@@ -1740,7 +1852,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
if (hasInlineViews()) {
|
||||
// make room on suggestion toolbar for inline views
|
||||
suggestionsItemsHolder.gravity = Gravity.NO_GRAVITY
|
||||
clipboardValue.maxWidth = resources.getDimensionPixelSize(R.dimen.suggestion_max_width)
|
||||
clipboardValue.maxWidth =
|
||||
resources.getDimensionPixelSize(R.dimen.suggestion_max_width)
|
||||
} else {
|
||||
// restore original clipboard toolbar appearance
|
||||
suggestionsItemsHolder.gravity = Gravity.CENTER_HORIZONTAL
|
||||
@@ -1754,7 +1867,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut
|
||||
/**
|
||||
* Returns true if there are [InlineContentView]s in [autofill_suggestions_holder]
|
||||
*/
|
||||
private fun hasInlineViews() = (keyboardViewBinding?.autofillSuggestionsHolder?.childCount ?: 0) > 0
|
||||
private fun hasInlineViews() =
|
||||
(keyboardViewBinding?.autofillSuggestionsHolder?.childCount ?: 0) > 0
|
||||
|
||||
/**
|
||||
* Returns: Popup Key width depends on popup keys count
|
||||
|
||||
@@ -80,13 +80,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_use_english_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_use_english"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/use_english_language" />
|
||||
@@ -167,13 +167,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_vibrate_on_keypress_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_vibrate_on_keypress"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/vibrate_on_keypress" />
|
||||
@@ -182,13 +182,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_show_popup_on_keypress_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_show_popup_on_keypress"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_popup" />
|
||||
@@ -197,13 +197,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_show_key_borders_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_show_key_borders"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_key_borders" />
|
||||
@@ -212,13 +212,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_show_numbers_row_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_show_numbers_row"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_numbers_row" />
|
||||
@@ -227,13 +227,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_start_sentences_capitalized_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_start_sentences_capitalized"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/start_sentences_capitalized" />
|
||||
@@ -315,13 +315,13 @@
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/settings_show_clipboard_content_holder"
|
||||
style="@style/SettingsHolderCheckboxStyle"
|
||||
style="@style/SettingsHolderSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.fossify.commons.views.MyAppCompatCheckbox
|
||||
<org.fossify.commons.views.MyMaterialSwitch
|
||||
android:id="@+id/settings_show_clipboard_content"
|
||||
style="@style/SettingsCheckboxStyle"
|
||||
style="@style/SettingsSwitchStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/show_clipboard_content" />
|
||||
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |