diff --git a/app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt b/app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt index e9d34d7b..77c4a150 100644 --- a/app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt +++ b/app/src/main/kotlin/com/simplemobiletools/keyboard/services/SimpleKeyboardIME.kt @@ -15,6 +15,7 @@ import com.simplemobiletools.keyboard.helpers.SHIFT_OFF import com.simplemobiletools.keyboard.helpers.SHIFT_ON_ONE_CHAR import com.simplemobiletools.keyboard.helpers.SHIFT_ON_PERMANENT import com.simplemobiletools.keyboard.views.MyKeyboardView +import kotlinx.android.synthetic.main.keyboard_view_keyboard.view.* // based on https://www.androidauthority.com/lets-build-custom-keyboard-android-832362/ class SimpleKeyboardIME : InputMethodService(), MyKeyboardView.OnKeyboardActionListener { @@ -37,10 +38,12 @@ class SimpleKeyboardIME : InputMethodService(), MyKeyboardView.OnKeyboardActionL } override fun onCreateInputView(): View { - keyboardView = layoutInflater.inflate(R.layout.keyboard_view_keyboard, null) as MyKeyboardView + val keyboardHolder = layoutInflater.inflate(R.layout.keyboard_view_keyboard, null) + keyboardView = keyboardHolder.keyboard_view as MyKeyboardView keyboardView!!.setKeyboard(keyboard!!) + keyboardView!!.setClipboardHolder(keyboardHolder.clipboard_holder) keyboardView!!.mOnKeyboardActionListener = this - return keyboardView!! + return keyboardHolder!! } override fun onPress(primaryCode: Int) { diff --git a/app/src/main/kotlin/com/simplemobiletools/keyboard/views/MyKeyboardView.kt b/app/src/main/kotlin/com/simplemobiletools/keyboard/views/MyKeyboardView.kt index b8a74c35..380f0323 100644 --- a/app/src/main/kotlin/com/simplemobiletools/keyboard/views/MyKeyboardView.kt +++ b/app/src/main/kotlin/com/simplemobiletools/keyboard/views/MyKeyboardView.kt @@ -1,10 +1,14 @@ package com.simplemobiletools.keyboard.views import android.annotation.SuppressLint +import android.content.ClipboardManager import android.content.Context import android.graphics.* import android.graphics.Paint.Align +import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import android.graphics.drawable.LayerDrawable +import android.graphics.drawable.RippleDrawable import android.os.Handler import android.os.Message import android.util.AttributeSet @@ -24,6 +28,7 @@ import com.simplemobiletools.keyboard.helpers.MyKeyboard.Companion.KEYCODE_MODE_ import com.simplemobiletools.keyboard.helpers.MyKeyboard.Companion.KEYCODE_SHIFT import com.simplemobiletools.keyboard.helpers.MyKeyboard.Companion.KEYCODE_SPACE import kotlinx.android.synthetic.main.keyboard_popup_keyboard.view.* +import kotlinx.android.synthetic.main.keyboard_view_keyboard.view.* import java.util.* @SuppressLint("UseCompatLoadingForDrawables") @@ -125,6 +130,8 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut private var mKeyBackground: Drawable? = null private val mDistances = IntArray(MAX_NEARBY_KEYS) + private var mClipboardHolder: View? = null + // For multi-tap private var mLastTapTime = 0L @@ -160,14 +167,13 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut private const val DEBOUNCE_TIME = 70 private const val REPEAT_INTERVAL = 50 // ~20 keys per second private const val REPEAT_START_DELAY = 400 - private const val GENERIC_KEY = -100 private val LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout() private const val MAX_NEARBY_KEYS = 12 } init { val attributes = context.obtainStyledAttributes(attrs, R.styleable.MyKeyboardView, 0, defStyleRes) - val inflate = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val keyTextSize = 0 val indexCnt = attributes.indexCount @@ -193,7 +199,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut mPrimaryColor = context.getAdjustedPrimaryColor() mPreviewPopup = PopupWindow(context) - mPreviewText = inflate.inflate(resources.getLayout(R.layout.keyboard_key_preview), null) as TextView + mPreviewText = inflater.inflate(resources.getLayout(R.layout.keyboard_key_preview), null) as TextView mPreviewTextSizeLarge = context.resources.getDimension(R.dimen.preview_text_size).toInt() mPreviewPopup.contentView = mPreviewText mPreviewPopup.setBackgroundDrawable(null) @@ -275,6 +281,11 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut mAbortKey = true // Until the next ACTION_DOWN } + /** Sets the top row above the keyboard containing the clipboard value **/ + fun setClipboardHolder(clipboardHolder: View) { + mClipboardHolder = clipboardHolder + } + /** * Sets the state of the shift key of the keyboard, if any. * @param shifted whether or not to enable the state of the shift key @@ -388,6 +399,33 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut } canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR) + + if (context.config.showClipboard && mClipboardHolder != null && mPopupParent.id != R.id.mini_keyboard_view) { + val clipboardContent = (context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).primaryClip?.getItemAt(0)?.text + if (clipboardContent?.trim()?.isNotEmpty() == true) { + val rippleBg = resources.getDrawable(R.drawable.clipboard_background, context.theme) as RippleDrawable + val layerDrawable = rippleBg.findDrawableByLayerId(R.id.clipboard_background_holder) as LayerDrawable + layerDrawable.findDrawableByLayerId(R.id.clipboard_background_shape).applyColorFilter(mBackgroundColor) + + mClipboardHolder?.apply { + background = ColorDrawable(mBackgroundColor.darkenColor()) + beVisible() + clipboard_value.apply { + text = clipboardContent + background = rippleBg + setTextColor(mTextColor) + setOnClickListener { + + } + } + } + } else { + mClipboardHolder?.beGone() + } + } else { + mClipboardHolder?.beGone() + } + val keyCount = keys.size for (i in 0 until keyCount) { val key = keys[i] @@ -974,8 +1012,7 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut return true } - // Needs to be called after the gesture detector gets a turn, as it may have - // displayed the mini keyboard + // Needs to be called after the gesture detector gets a turn, as it may have displayed the mini keyboard if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) { return true } @@ -1056,7 +1093,6 @@ class MyKeyboardView @JvmOverloads constructor(context: Context, attrs: Attribut } val diff = mLastX - mLastSpaceMoveX - if (diff < -mSpaceMoveThreshold) { for (i in diff / mSpaceMoveThreshold until 0) { mOnKeyboardActionListener?.moveCursorLeft() diff --git a/app/src/main/res/drawable/clipboard_background.xml b/app/src/main/res/drawable/clipboard_background.xml new file mode 100644 index 00000000..55a2985f --- /dev/null +++ b/app/src/main/res/drawable/clipboard_background.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/keyboard_view_keyboard.xml b/app/src/main/res/layout/keyboard_view_keyboard.xml index fffea308..f90290c8 100644 --- a/app/src/main/res/layout/keyboard_view_keyboard.xml +++ b/app/src/main/res/layout/keyboard_view_keyboard.xml @@ -1,7 +1,40 @@ - + android:layout_height="wrap_content"> + + + + + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0164e9b4..bcf3b2b3 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,6 +2,7 @@ 60dp 12dp 18dp + 50dp 60dp -10dp