parent
							
								
									a59ecb190a
								
							
						
					
					
						commit
						a2712e904e
					
				| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.app.Activity | import android.app.Activity | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.view.Menu | import android.view.Menu | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.view.View | import android.view.View | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.app.Activity.RESULT_OK | import android.app.Activity.RESULT_OK | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.book.chapterlist | package io.legado.app.ui.book.toc | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| import android.app.Application | import android.app.Application | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.replacerule | package io.legado.app.ui.replace | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import androidx.recyclerview.widget.DiffUtil | import androidx.recyclerview.widget.DiffUtil | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.replacerule | package io.legado.app.ui.replace | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.content.Context | import android.content.Context | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.replacerule | package io.legado.app.ui.replace | ||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| @ -1,4 +1,4 @@ | |||||||
| package io.legado.app.ui.replacerule | package io.legado.app.ui.replace | ||||||
| 
 | 
 | ||||||
| import android.app.Application | import android.app.Application | ||||||
| import android.text.TextUtils | import android.text.TextUtils | ||||||
| @ -0,0 +1,166 @@ | |||||||
|  | package io.legado.app.ui.replace.edit | ||||||
|  | 
 | ||||||
|  | import android.content.Context | ||||||
|  | import android.content.Intent | ||||||
|  | import android.graphics.Rect | ||||||
|  | import android.os.Bundle | ||||||
|  | import android.view.Gravity | ||||||
|  | import android.view.Menu | ||||||
|  | import android.view.MenuItem | ||||||
|  | import android.view.ViewTreeObserver | ||||||
|  | import android.widget.EditText | ||||||
|  | import android.widget.PopupWindow | ||||||
|  | import io.legado.app.R | ||||||
|  | import io.legado.app.base.VMBaseActivity | ||||||
|  | import io.legado.app.constant.AppConst | ||||||
|  | import io.legado.app.constant.EventBus | ||||||
|  | import io.legado.app.data.entities.ReplaceRule | ||||||
|  | import io.legado.app.ui.widget.KeyboardToolPop | ||||||
|  | import io.legado.app.utils.getViewModel | ||||||
|  | import io.legado.app.utils.postEvent | ||||||
|  | import kotlinx.android.synthetic.main.activity_replace_edit.* | ||||||
|  | import org.jetbrains.anko.displayMetrics | ||||||
|  | import org.jetbrains.anko.toast | ||||||
|  | import kotlin.math.abs | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * 编辑替换规则 | ||||||
|  |  */ | ||||||
|  | class ReplaceEditActivity : | ||||||
|  |     VMBaseActivity<ReplaceEditViewModel>(R.layout.activity_replace_edit, false), | ||||||
|  |     ViewTreeObserver.OnGlobalLayoutListener, | ||||||
|  |     KeyboardToolPop.CallBack { | ||||||
|  | 
 | ||||||
|  |     companion object { | ||||||
|  | 
 | ||||||
|  |         fun show( | ||||||
|  |             context: Context, | ||||||
|  |             id: Long = -1, | ||||||
|  |             pattern: String? = null, | ||||||
|  |             isRegex: Boolean = false, | ||||||
|  |             scope: String? = null | ||||||
|  |         ) { | ||||||
|  |             val intent = Intent(context, ReplaceEditActivity::class.java) | ||||||
|  |             intent.putExtra("id", id) | ||||||
|  |             intent.putExtra("pattern", pattern) | ||||||
|  |             intent.putExtra("isRegex", isRegex) | ||||||
|  |             intent.putExtra("scope", scope) | ||||||
|  |             context.startActivity(intent) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override val viewModel: ReplaceEditViewModel | ||||||
|  |         get() = getViewModel(ReplaceEditViewModel::class.java) | ||||||
|  | 
 | ||||||
|  |     private var mSoftKeyboardTool: PopupWindow? = null | ||||||
|  |     private var mIsSoftKeyBoardShowing = false | ||||||
|  | 
 | ||||||
|  |     override fun onActivityCreated(savedInstanceState: Bundle?) { | ||||||
|  |         mSoftKeyboardTool = KeyboardToolPop(this, AppConst.keyboardToolChars, this) | ||||||
|  |         window.decorView.viewTreeObserver.addOnGlobalLayoutListener(this) | ||||||
|  |         viewModel.replaceRuleData.observe(this, { | ||||||
|  |             upReplaceView(it) | ||||||
|  |         }) | ||||||
|  |         viewModel.initData(intent) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { | ||||||
|  |         menuInflater.inflate(R.menu.replace_edit, menu) | ||||||
|  |         return super.onCompatCreateOptionsMenu(menu) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { | ||||||
|  |         when (item.itemId) { | ||||||
|  |             R.id.menu_save -> { | ||||||
|  |                 val rule = getReplaceRule() | ||||||
|  |                 if (!rule.isValid()) { | ||||||
|  |                     toast(R.string.replace_rule_invalid) | ||||||
|  |                 } else { | ||||||
|  |                     viewModel.save(rule) { | ||||||
|  |                         postEvent(EventBus.REPLACE_RULE_SAVE, "") | ||||||
|  |                         finish() | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return true | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun upReplaceView(replaceRule: ReplaceRule) { | ||||||
|  |         et_name.setText(replaceRule.name) | ||||||
|  |         et_group.setText(replaceRule.group) | ||||||
|  |         et_replace_rule.setText(replaceRule.pattern) | ||||||
|  |         cb_use_regex.isChecked = replaceRule.isRegex | ||||||
|  |         et_replace_to.setText(replaceRule.replacement) | ||||||
|  |         et_scope.setText(replaceRule.scope) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun getReplaceRule(): ReplaceRule { | ||||||
|  |         val replaceRule: ReplaceRule = viewModel.replaceRuleData.value ?: ReplaceRule() | ||||||
|  |         replaceRule.name = et_name.text.toString() | ||||||
|  |         replaceRule.group = et_group.text.toString() | ||||||
|  |         replaceRule.pattern = et_replace_rule.text.toString() | ||||||
|  |         replaceRule.isRegex = cb_use_regex.isChecked | ||||||
|  |         replaceRule.replacement = et_replace_to.text.toString() | ||||||
|  |         replaceRule.scope = et_scope.text.toString() | ||||||
|  |         return replaceRule | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun insertText(text: String) { | ||||||
|  |         if (text.isBlank()) return | ||||||
|  |         val view = 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)//光标所在位置插入文字 | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun sendText(text: String) { | ||||||
|  |         if (text == AppConst.keyboardToolChars[0]) { | ||||||
|  |             val view = window?.decorView?.findFocus() | ||||||
|  |             view?.clearFocus() | ||||||
|  |         } else { | ||||||
|  |             insertText(text) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun showKeyboardTopPopupWindow() { | ||||||
|  |         mSoftKeyboardTool?.let { | ||||||
|  |             if (it.isShowing) return | ||||||
|  |             if (!isFinishing) { | ||||||
|  |                 it.showAtLocation(ll_content, Gravity.BOTTOM, 0, 0) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun closePopupWindow() { | ||||||
|  |         mSoftKeyboardTool?.dismiss() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun onGlobalLayout() { | ||||||
|  |         val rect = Rect() | ||||||
|  |         // 获取当前页面窗口的显示范围 | ||||||
|  |         window.decorView.getWindowVisibleDisplayFrame(rect) | ||||||
|  |         val screenHeight = this.displayMetrics.heightPixels | ||||||
|  |         val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 | ||||||
|  |         val preShowing = mIsSoftKeyBoardShowing | ||||||
|  |         if (abs(keyboardHeight) > screenHeight / 5) { | ||||||
|  |             mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 | ||||||
|  |             root_view.setPadding(0, 0, 0, 100) | ||||||
|  |             showKeyboardTopPopupWindow() | ||||||
|  |         } else { | ||||||
|  |             mIsSoftKeyBoardShowing = false | ||||||
|  |             root_view.setPadding(0, 0, 0, 0) | ||||||
|  |             if (preShowing) { | ||||||
|  |                 closePopupWindow() | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -1,158 +0,0 @@ | |||||||
| package io.legado.app.ui.replacerule.edit |  | ||||||
| 
 |  | ||||||
| import android.os.Bundle |  | ||||||
| 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.FragmentManager |  | ||||||
| import io.legado.app.R |  | ||||||
| import io.legado.app.base.BaseDialogFragment |  | ||||||
| import io.legado.app.constant.AppConst |  | ||||||
| import io.legado.app.data.entities.ReplaceRule |  | ||||||
| import io.legado.app.lib.theme.primaryColor |  | ||||||
| import io.legado.app.ui.widget.KeyboardToolPop |  | ||||||
| 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.sdk27.listeners.onFocusChange |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * 编辑替换规则 |  | ||||||
|  */ |  | ||||||
| class ReplaceEditDialog : BaseDialogFragment(), |  | ||||||
|     Toolbar.OnMenuItemClickListener, |  | ||||||
|     KeyboardToolPop.CallBack { |  | ||||||
| 
 |  | ||||||
|     companion object { |  | ||||||
| 
 |  | ||||||
|         fun show( |  | ||||||
|             fragmentManager: FragmentManager, |  | ||||||
|             id: Long = -1, |  | ||||||
|             pattern: String? = null, |  | ||||||
|             isRegex: Boolean = false, |  | ||||||
|             scope: String? = null |  | ||||||
|         ) { |  | ||||||
|             val dialog = ReplaceEditDialog() |  | ||||||
|             val bundle = Bundle() |  | ||||||
|             bundle.putLong("id", id) |  | ||||||
|             bundle.putString("pattern", pattern) |  | ||||||
|             bundle.putBoolean("isRegex", isRegex) |  | ||||||
|             bundle.putString("scope", scope) |  | ||||||
|             dialog.arguments = bundle |  | ||||||
|             dialog.show(fragmentManager, this::class.simpleName) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private lateinit var viewModel: ReplaceEditViewModel |  | ||||||
|     private lateinit var mSoftKeyboardTool: PopupWindow |  | ||||||
| 
 |  | ||||||
|     override fun onStart() { |  | ||||||
|         super.onStart() |  | ||||||
|         dialog?.window?.setLayout(MATCH_PARENT, WRAP_CONTENT) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun onCreateView( |  | ||||||
|         inflater: LayoutInflater, |  | ||||||
|         container: ViewGroup?, |  | ||||||
|         savedInstanceState: Bundle? |  | ||||||
|     ): View? { |  | ||||||
|         viewModel = getViewModel(ReplaceEditViewModel::class.java) |  | ||||||
|         return inflater.inflate(R.layout.dialog_replace_edit, container) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { |  | ||||||
|         tool_bar.setBackgroundColor(primaryColor) |  | ||||||
|         mSoftKeyboardTool = KeyboardToolPop(requireContext(), AppConst.keyboardToolChars, this) |  | ||||||
|         tool_bar.inflateMenu(R.menu.replace_edit) |  | ||||||
|         tool_bar.menu.applyTint(requireContext()) |  | ||||||
|         tool_bar.setOnMenuItemClickListener(this) |  | ||||||
|         viewModel.replaceRuleData.observe(viewLifecycleOwner, { |  | ||||||
|             upReplaceView(it) |  | ||||||
|         }) |  | ||||||
|         arguments?.let { |  | ||||||
|             viewModel.initData(it) |  | ||||||
|         } |  | ||||||
|         et_replace_rule.onFocusChange { v, hasFocus -> |  | ||||||
|             if (hasFocus) { |  | ||||||
|                 mSoftKeyboardTool.width = v.width |  | ||||||
|                 mSoftKeyboardTool.showAsDropDown(v) |  | ||||||
|             } else { |  | ||||||
|                 mSoftKeyboardTool.dismiss() |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun onMenuItemClick(item: MenuItem?): Boolean { |  | ||||||
|         when (item?.itemId) { |  | ||||||
|             R.id.menu_save -> { |  | ||||||
|                 val rule = getReplaceRule() |  | ||||||
|                 if (!rule.isValid()){ |  | ||||||
|                     toast(R.string.replace_rule_invalid) |  | ||||||
|                 } else{ |  | ||||||
|                     viewModel.save(rule) { |  | ||||||
|                         callBack?.onReplaceRuleSave() |  | ||||||
|                         dismiss() |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return true |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private fun upReplaceView(replaceRule: ReplaceRule) { |  | ||||||
|         et_name.setText(replaceRule.name) |  | ||||||
|         et_group.setText(replaceRule.group) |  | ||||||
|         et_replace_rule.setText(replaceRule.pattern) |  | ||||||
|         cb_use_regex.isChecked = replaceRule.isRegex |  | ||||||
|         et_replace_to.setText(replaceRule.replacement) |  | ||||||
|         et_scope.setText(replaceRule.scope) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private fun getReplaceRule(): ReplaceRule { |  | ||||||
|         val replaceRule: ReplaceRule = viewModel.replaceRuleData.value ?: ReplaceRule() |  | ||||||
|         replaceRule.name = et_name.text.toString() |  | ||||||
|         replaceRule.group = et_group.text.toString() |  | ||||||
|         replaceRule.pattern = et_replace_rule.text.toString() |  | ||||||
|         replaceRule.isRegex = cb_use_regex.isChecked |  | ||||||
|         replaceRule.replacement = et_replace_to.text.toString() |  | ||||||
|         replaceRule.scope = et_scope.text.toString() |  | ||||||
|         return replaceRule |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     val callBack get() = activity as? CallBack |  | ||||||
| 
 |  | ||||||
|     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)//光标所在位置插入文字 |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun sendText(text: String) { |  | ||||||
|         if (text == AppConst.keyboardToolChars[0]) { |  | ||||||
|             val view = dialog?.window?.decorView?.findFocus() |  | ||||||
|             view?.clearFocus() |  | ||||||
|         } else { |  | ||||||
|             insertText(text) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     interface CallBack { |  | ||||||
|         fun onReplaceRuleSave() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,19 +1,19 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     android:id="@+id/root_view" | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="match_parent" |     android:layout_height="match_parent" | ||||||
|     android:orientation="vertical"> |     android:orientation="vertical"> | ||||||
| 
 | 
 | ||||||
|     <androidx.appcompat.widget.Toolbar |     <io.legado.app.ui.widget.TitleBar | ||||||
|         android:id="@+id/tool_bar" |         android:id="@+id/title_bar" | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="wrap_content" |         android:layout_height="wrap_content" | ||||||
|         android:background="@color/background_menu" |         app:contentInsetStartWithNavigation="0dp" | ||||||
|         android:theme="?attr/actionBarStyle" |         app:displayHomeAsUp="true" | ||||||
|         app:popupTheme="@style/AppTheme.PopupOverlay" |         app:fitStatusBar="false" | ||||||
|         app:title="@string/replace_rule_edit" |         app:title="@string/replace_rule_edit" /> | ||||||
|         app:titleTextAppearance="@style/ToolbarTitle" /> |  | ||||||
| 
 | 
 | ||||||
|     <ScrollView |     <ScrollView | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
					Loading…
					
					
				
		Reference in new issue