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