|  |  |  | @ -1,10 +1,13 @@ | 
			
		
	
		
			
				
					|  |  |  |  | package io.legado.app.ui.replacerule.edit | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import android.graphics.Rect | 
			
		
	
		
			
				
					|  |  |  |  | import android.os.Bundle | 
			
		
	
		
			
				
					|  |  |  |  | import android.util.DisplayMetrics | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.* | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.LayoutInflater | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.MenuItem | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.View | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.ViewGroup | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.ViewGroup.LayoutParams.MATCH_PARENT | 
			
		
	
		
			
				
					|  |  |  |  | import android.view.ViewGroup.LayoutParams.WRAP_CONTENT | 
			
		
	
		
			
				
					|  |  |  |  | import android.widget.EditText | 
			
		
	
		
			
				
					|  |  |  |  | import android.widget.PopupWindow | 
			
		
	
		
			
				
					|  |  |  |  | import androidx.appcompat.widget.Toolbar | 
			
		
	
		
			
				
					|  |  |  |  | import androidx.fragment.app.DialogFragment | 
			
		
	
	
		
			
				
					|  |  |  | @ -19,8 +22,7 @@ import io.legado.app.utils.applyTint | 
			
		
	
		
			
				
					|  |  |  |  | import io.legado.app.utils.getViewModel | 
			
		
	
		
			
				
					|  |  |  |  | import io.legado.app.utils.toast | 
			
		
	
		
			
				
					|  |  |  |  | import kotlinx.android.synthetic.main.dialog_replace_edit.* | 
			
		
	
		
			
				
					|  |  |  |  | import org.jetbrains.anko.displayMetrics | 
			
		
	
		
			
				
					|  |  |  |  | import kotlin.math.abs | 
			
		
	
		
			
				
					|  |  |  |  | import org.jetbrains.anko.sdk27.listeners.onFocusChange | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | class ReplaceEditDialog : DialogFragment(), | 
			
		
	
		
			
				
					|  |  |  |  |     Toolbar.OnMenuItemClickListener, | 
			
		
	
	
		
			
				
					|  |  |  | @ -45,14 +47,11 @@ class ReplaceEditDialog : DialogFragment(), | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private lateinit var viewModel: ReplaceEditViewModel | 
			
		
	
		
			
				
					|  |  |  |  |     private var mSoftKeyboardTool: PopupWindow? = null | 
			
		
	
		
			
				
					|  |  |  |  |     private var mIsSoftKeyBoardShowing = false | 
			
		
	
		
			
				
					|  |  |  |  |     private lateinit var mSoftKeyboardTool: PopupWindow | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     override fun onStart() { | 
			
		
	
		
			
				
					|  |  |  |  |         super.onStart() | 
			
		
	
		
			
				
					|  |  |  |  |         val dm = DisplayMetrics() | 
			
		
	
		
			
				
					|  |  |  |  |         activity?.windowManager?.defaultDisplay?.getMetrics(dm) | 
			
		
	
		
			
				
					|  |  |  |  |         dialog?.window?.setLayout((dm.widthPixels * 0.9).toInt(), WRAP_CONTENT) | 
			
		
	
		
			
				
					|  |  |  |  |         dialog?.window?.setLayout(MATCH_PARENT, WRAP_CONTENT) | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     override fun onCreateView( | 
			
		
	
	
		
			
				
					|  |  |  | @ -67,7 +66,6 @@ class ReplaceEditDialog : DialogFragment(), | 
			
		
	
		
			
				
					|  |  |  |  |     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | 
			
		
	
		
			
				
					|  |  |  |  |         super.onViewCreated(view, savedInstanceState) | 
			
		
	
		
			
				
					|  |  |  |  |         mSoftKeyboardTool = KeyboardToolPop(requireContext(), AppConst.keyboardToolChars, this) | 
			
		
	
		
			
				
					|  |  |  |  |         ll_content.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) | 
			
		
	
		
			
				
					|  |  |  |  |         tool_bar.inflateMenu(R.menu.replace_edit) | 
			
		
	
		
			
				
					|  |  |  |  |         tool_bar.menu.applyTint(requireContext(), Theme.getTheme()) | 
			
		
	
		
			
				
					|  |  |  |  |         tool_bar.setOnMenuItemClickListener(this) | 
			
		
	
	
		
			
				
					|  |  |  | @ -77,6 +75,14 @@ class ReplaceEditDialog : DialogFragment(), | 
			
		
	
		
			
				
					|  |  |  |  |         arguments?.let { | 
			
		
	
		
			
				
					|  |  |  |  |             viewModel.initData(it) | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         et_replace_rule.onFocusChange { v, hasFocus -> | 
			
		
	
		
			
				
					|  |  |  |  |             if (hasFocus) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mSoftKeyboardTool.width = et_replace_rule.width | 
			
		
	
		
			
				
					|  |  |  |  |                 mSoftKeyboardTool.showAsDropDown(v) | 
			
		
	
		
			
				
					|  |  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |  |                 mSoftKeyboardTool.dismiss() | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     override fun onMenuItemClick(item: MenuItem?): Boolean { | 
			
		
	
	
		
			
				
					|  |  |  | @ -119,42 +125,27 @@ class ReplaceEditDialog : DialogFragment(), | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     val callBack get() = activity as? CallBack | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     override fun sendText(text: String) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private fun showKeyboardTopPopupWindow() { | 
			
		
	
		
			
				
					|  |  |  |  |         mSoftKeyboardTool?.let { | 
			
		
	
		
			
				
					|  |  |  |  |             if (it.isShowing) return | 
			
		
	
		
			
				
					|  |  |  |  |             view?.let { view -> | 
			
		
	
		
			
				
					|  |  |  |  |                 it.showAtLocation(view, Gravity.BOTTOM, 0, 0) | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |     private fun insertText(text: String) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (text.isBlank()) return | 
			
		
	
		
			
				
					|  |  |  |  |         val view = dialog?.window?.decorView?.findFocus() | 
			
		
	
		
			
				
					|  |  |  |  |         if (view is EditText) { | 
			
		
	
		
			
				
					|  |  |  |  |             val start = view.selectionStart | 
			
		
	
		
			
				
					|  |  |  |  |             val end = view.selectionEnd | 
			
		
	
		
			
				
					|  |  |  |  |             val edit = view.editableText//获取EditText的文字 | 
			
		
	
		
			
				
					|  |  |  |  |             if (start < 0 || start >= edit.length) { | 
			
		
	
		
			
				
					|  |  |  |  |                 edit.append(text) | 
			
		
	
		
			
				
					|  |  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |  |                 edit.replace(start, end, text)//光标所在位置插入文字 | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private fun closePopupWindow() { | 
			
		
	
		
			
				
					|  |  |  |  |         mSoftKeyboardTool?.dismiss() | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private inner class KeyboardOnGlobalChangeListener : ViewTreeObserver.OnGlobalLayoutListener { | 
			
		
	
		
			
				
					|  |  |  |  |         override fun onGlobalLayout() { | 
			
		
	
		
			
				
					|  |  |  |  |             activity?.let { | 
			
		
	
		
			
				
					|  |  |  |  |                 val rect = Rect() | 
			
		
	
		
			
				
					|  |  |  |  |                 // 获取当前页面窗口的显示范围 | 
			
		
	
		
			
				
					|  |  |  |  |                 dialog?.window?.decorView?.getWindowVisibleDisplayFrame(rect) | 
			
		
	
		
			
				
					|  |  |  |  |                 val screenHeight = it.displayMetrics.heightPixels | 
			
		
	
		
			
				
					|  |  |  |  |                 val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 | 
			
		
	
		
			
				
					|  |  |  |  |                 val preShowing = mIsSoftKeyBoardShowing | 
			
		
	
		
			
				
					|  |  |  |  |                 if (abs(keyboardHeight) > screenHeight / 5) { | 
			
		
	
		
			
				
					|  |  |  |  |                     mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 | 
			
		
	
		
			
				
					|  |  |  |  |                     showKeyboardTopPopupWindow() | 
			
		
	
		
			
				
					|  |  |  |  |     override fun sendText(text: String) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (text == AppConst.keyboardToolChars[0]) { | 
			
		
	
		
			
				
					|  |  |  |  |             val view = dialog?.window?.decorView?.findFocus() | 
			
		
	
		
			
				
					|  |  |  |  |             view?.clearFocus() | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |                     mIsSoftKeyBoardShowing = false | 
			
		
	
		
			
				
					|  |  |  |  |                     if (preShowing) { | 
			
		
	
		
			
				
					|  |  |  |  |                         closePopupWindow() | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             insertText(text) | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |