mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-21 21:01:43 +08:00
fix: 5028 java.util.regex.PatternSyntaxException
java.util.regex.Pattern.compileImpl(Native Method) 2 java.util.regex.Pattern.compile(Pattern.java:1340) 3 java.util.regex.Pattern.<init>(Pattern.java:1324) 4 java.util.regex.Pattern.compile(Pattern.java:946) 5 java.lang.String.replaceAll(String.java:2216) 6 org.autojs.autojs.ui.edit.editor.CodeEditor.replaceAll(CodeEditor.java:246) 7 org.autojs.autojs.ui.edit.EditorView.replaceAll(EditorView.java:556) 8 org.autojs.autojs.ui.edit.FindOrReplaceDialogBuilder.findOrReplace(FindOrReplaceDialogBuilder.java:110) 9 org.autojs.autojs.ui.edit.FindOrReplaceDialogBuilder.access$100(FindOrReplaceDialogBuilder.java:25) 10 org.autojs.autojs.ui.edit.FindOrReplaceDialogBuilder$1.onClick(FindOrReplaceDialogBuilder.java:57)
This commit is contained in:
parent
4851790ad9
commit
0ff7b1c208
@ -532,7 +532,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
|
||||
return mEditor;
|
||||
}
|
||||
|
||||
public void find(String keywords, boolean usingRegex) {
|
||||
public void find(String keywords, boolean usingRegex) throws CodeEditor.CheckedPatternSyntaxException {
|
||||
mEditor.find(keywords, usingRegex);
|
||||
showSearchToolbar(false);
|
||||
}
|
||||
@ -547,12 +547,12 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
|
||||
.commit();
|
||||
}
|
||||
|
||||
public void replace(String keywords, String replacement, boolean usingRegex) {
|
||||
public void replace(String keywords, String replacement, boolean usingRegex) throws CodeEditor.CheckedPatternSyntaxException {
|
||||
mEditor.replace(keywords, replacement, usingRegex);
|
||||
showSearchToolbar(true);
|
||||
}
|
||||
|
||||
public void replaceAll(String keywords, String replacement, boolean usingRegex) {
|
||||
public void replaceAll(String keywords, String replacement, boolean usingRegex) throws CodeEditor.CheckedPatternSyntaxException {
|
||||
mEditor.replaceAll(keywords, replacement, usingRegex);
|
||||
}
|
||||
|
||||
|
||||
@ -10,8 +10,11 @@ import android.widget.CheckBox;
|
||||
|
||||
import com.afollestad.materialdialogs.DialogAction;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.stardust.app.GlobalAppContext;
|
||||
|
||||
import org.autojs.autojs.R;
|
||||
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||
import org.autojs.autojs.ui.edit.editor.CodeEditor;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
@ -43,20 +46,16 @@ public class FindOrReplaceDialogBuilder extends ThemeColorMaterialDialogBuilder
|
||||
|
||||
private EditorView mEditorView;
|
||||
|
||||
|
||||
public FindOrReplaceDialogBuilder(@NonNull Context context, EditorView editorView) {
|
||||
super(context);
|
||||
mEditorView = editorView;
|
||||
setupViews();
|
||||
restoreState();
|
||||
onPositive(new MaterialDialog.SingleButtonCallback() {
|
||||
|
||||
@Override
|
||||
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
|
||||
storeState();
|
||||
findOrReplace();
|
||||
}
|
||||
|
||||
autoDismiss(false);
|
||||
onNegative((dialog, which)-> dialog.dismiss());
|
||||
onPositive((dialog, which) -> {
|
||||
storeState();
|
||||
findOrReplace(dialog);
|
||||
});
|
||||
}
|
||||
|
||||
@ -96,21 +95,27 @@ public class FindOrReplaceDialogBuilder extends ThemeColorMaterialDialogBuilder
|
||||
}
|
||||
}
|
||||
|
||||
private void findOrReplace() {
|
||||
private void findOrReplace(MaterialDialog dialog) {
|
||||
String keywords = mKeywordsEditText.getText().toString();
|
||||
if (keywords.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
boolean usingRegex = mRegexCheckBox.isChecked();
|
||||
if (!mReplaceCheckBox.isChecked()) {
|
||||
mEditorView.find(keywords, usingRegex);
|
||||
} else {
|
||||
String replacement = mReplacementEditText.getText().toString();
|
||||
if (mReplaceAllCheckBox.isChecked()) {
|
||||
mEditorView.replaceAll(keywords, replacement, usingRegex);
|
||||
try {
|
||||
boolean usingRegex = mRegexCheckBox.isChecked();
|
||||
if (!mReplaceCheckBox.isChecked()) {
|
||||
mEditorView.find(keywords, usingRegex);
|
||||
} else {
|
||||
mEditorView.replace(keywords, replacement, usingRegex);
|
||||
String replacement = mReplacementEditText.getText().toString();
|
||||
if (mReplaceAllCheckBox.isChecked()) {
|
||||
mEditorView.replaceAll(keywords, replacement, usingRegex);
|
||||
} else {
|
||||
mEditorView.replace(keywords, replacement, usingRegex);
|
||||
}
|
||||
}
|
||||
dialog.dismiss();
|
||||
} catch (CodeEditor.CheckedPatternSyntaxException e) {
|
||||
e.printStackTrace();
|
||||
mKeywordsEditText.setError(getContext().getString(R.string.error_pattern_syntax));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ import com.stardust.util.TextUtils;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.regex.PatternSyntaxException;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
|
||||
@ -41,6 +42,11 @@ import io.reactivex.Observable;
|
||||
*/
|
||||
public class CodeEditor extends HVScrollView {
|
||||
|
||||
public static class CheckedPatternSyntaxException extends Exception {
|
||||
public CheckedPatternSyntaxException(PatternSyntaxException cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
||||
|
||||
public interface CursorChangeCallback {
|
||||
|
||||
@ -222,9 +228,13 @@ public class CodeEditor extends HVScrollView {
|
||||
mTextViewRedoUndo.redo();
|
||||
}
|
||||
|
||||
public void find(String keywords, boolean usingRegex) {
|
||||
public void find(String keywords, boolean usingRegex) throws CheckedPatternSyntaxException {
|
||||
if (usingRegex) {
|
||||
mMatcher = Pattern.compile(keywords).matcher(mCodeEditText.getText());
|
||||
try {
|
||||
mMatcher = Pattern.compile(keywords).matcher(mCodeEditText.getText());
|
||||
}catch (PatternSyntaxException e){
|
||||
throw new CheckedPatternSyntaxException(e);
|
||||
}
|
||||
mKeywords = null;
|
||||
} else {
|
||||
mKeywords = keywords;
|
||||
@ -233,17 +243,21 @@ public class CodeEditor extends HVScrollView {
|
||||
findNext();
|
||||
}
|
||||
|
||||
public void replace(String keywords, String replacement, boolean usingRegex) {
|
||||
public void replace(String keywords, String replacement, boolean usingRegex) throws CheckedPatternSyntaxException {
|
||||
mReplacement = replacement == null ? "" : replacement;
|
||||
find(keywords, usingRegex);
|
||||
}
|
||||
|
||||
public void replaceAll(String keywords, String replacement, boolean usingRegex) {
|
||||
public void replaceAll(String keywords, String replacement, boolean usingRegex) throws CheckedPatternSyntaxException {
|
||||
if (!usingRegex) {
|
||||
keywords = Pattern.quote(keywords);
|
||||
}
|
||||
String text = mCodeEditText.getText().toString();
|
||||
text = text.replaceAll(keywords, replacement);
|
||||
try {
|
||||
text = text.replaceAll(keywords, replacement);
|
||||
}catch (PatternSyntaxException e){
|
||||
throw new CheckedPatternSyntaxException(e);
|
||||
}
|
||||
setText(text);
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ import android.content.pm.PackageManager;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.PersistableBundle;
|
||||
@ -131,6 +132,7 @@ public class ShortcutCreateActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (resultCode != RESULT_OK) {
|
||||
@ -146,7 +148,11 @@ public class ShortcutCreateActivity extends AppCompatActivity {
|
||||
}
|
||||
return;
|
||||
}
|
||||
Observable.fromCallable(() -> BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())))
|
||||
Uri uri = data.getData();
|
||||
if(uri == null){
|
||||
return;
|
||||
}
|
||||
Observable.fromCallable(() -> BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)))
|
||||
.subscribeOn(Schedulers.computation())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe((bitmap -> {
|
||||
|
||||
@ -421,4 +421,5 @@
|
||||
<string name="text_run_on_headset_plug">耳机插拔时</string>
|
||||
<string name="text_run_on_time_tick">每分钟一次</string>
|
||||
<string name="text_run_on_config_change">某些设置(屏幕方向,地区等)更改时</string>
|
||||
<string name="error_pattern_syntax">正则表达式错误</string>
|
||||
</resources>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user