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:
@@ -532,7 +532,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
|
|||||||
return mEditor;
|
return mEditor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void find(String keywords, boolean usingRegex) {
|
public void find(String keywords, boolean usingRegex) throws CodeEditor.CheckedPatternSyntaxException {
|
||||||
mEditor.find(keywords, usingRegex);
|
mEditor.find(keywords, usingRegex);
|
||||||
showSearchToolbar(false);
|
showSearchToolbar(false);
|
||||||
}
|
}
|
||||||
@@ -547,12 +547,12 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
|
|||||||
.commit();
|
.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);
|
mEditor.replace(keywords, replacement, usingRegex);
|
||||||
showSearchToolbar(true);
|
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);
|
mEditor.replaceAll(keywords, replacement, usingRegex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,11 @@ import android.widget.CheckBox;
|
|||||||
|
|
||||||
import com.afollestad.materialdialogs.DialogAction;
|
import com.afollestad.materialdialogs.DialogAction;
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
|
import com.stardust.app.GlobalAppContext;
|
||||||
|
|
||||||
import org.autojs.autojs.R;
|
import org.autojs.autojs.R;
|
||||||
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
|
import org.autojs.autojs.ui.edit.editor.CodeEditor;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
@@ -43,20 +46,16 @@ public class FindOrReplaceDialogBuilder extends ThemeColorMaterialDialogBuilder
|
|||||||
|
|
||||||
private EditorView mEditorView;
|
private EditorView mEditorView;
|
||||||
|
|
||||||
|
|
||||||
public FindOrReplaceDialogBuilder(@NonNull Context context, EditorView editorView) {
|
public FindOrReplaceDialogBuilder(@NonNull Context context, EditorView editorView) {
|
||||||
super(context);
|
super(context);
|
||||||
mEditorView = editorView;
|
mEditorView = editorView;
|
||||||
setupViews();
|
setupViews();
|
||||||
restoreState();
|
restoreState();
|
||||||
onPositive(new MaterialDialog.SingleButtonCallback() {
|
autoDismiss(false);
|
||||||
|
onNegative((dialog, which)-> dialog.dismiss());
|
||||||
@Override
|
onPositive((dialog, which) -> {
|
||||||
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
|
storeState();
|
||||||
storeState();
|
findOrReplace(dialog);
|
||||||
findOrReplace();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,21 +95,27 @@ public class FindOrReplaceDialogBuilder extends ThemeColorMaterialDialogBuilder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void findOrReplace() {
|
private void findOrReplace(MaterialDialog dialog) {
|
||||||
String keywords = mKeywordsEditText.getText().toString();
|
String keywords = mKeywordsEditText.getText().toString();
|
||||||
if (keywords.isEmpty()) {
|
if (keywords.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean usingRegex = mRegexCheckBox.isChecked();
|
try {
|
||||||
if (!mReplaceCheckBox.isChecked()) {
|
boolean usingRegex = mRegexCheckBox.isChecked();
|
||||||
mEditorView.find(keywords, usingRegex);
|
if (!mReplaceCheckBox.isChecked()) {
|
||||||
} else {
|
mEditorView.find(keywords, usingRegex);
|
||||||
String replacement = mReplacementEditText.getText().toString();
|
|
||||||
if (mReplaceAllCheckBox.isChecked()) {
|
|
||||||
mEditorView.replaceAll(keywords, replacement, usingRegex);
|
|
||||||
} else {
|
} 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.LinkedHashMap;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
|
|
||||||
@@ -41,6 +42,11 @@ import io.reactivex.Observable;
|
|||||||
*/
|
*/
|
||||||
public class CodeEditor extends HVScrollView {
|
public class CodeEditor extends HVScrollView {
|
||||||
|
|
||||||
|
public static class CheckedPatternSyntaxException extends Exception {
|
||||||
|
public CheckedPatternSyntaxException(PatternSyntaxException cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public interface CursorChangeCallback {
|
public interface CursorChangeCallback {
|
||||||
|
|
||||||
@@ -222,9 +228,13 @@ public class CodeEditor extends HVScrollView {
|
|||||||
mTextViewRedoUndo.redo();
|
mTextViewRedoUndo.redo();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void find(String keywords, boolean usingRegex) {
|
public void find(String keywords, boolean usingRegex) throws CheckedPatternSyntaxException {
|
||||||
if (usingRegex) {
|
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;
|
mKeywords = null;
|
||||||
} else {
|
} else {
|
||||||
mKeywords = keywords;
|
mKeywords = keywords;
|
||||||
@@ -233,17 +243,21 @@ public class CodeEditor extends HVScrollView {
|
|||||||
findNext();
|
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;
|
mReplacement = replacement == null ? "" : replacement;
|
||||||
find(keywords, usingRegex);
|
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) {
|
if (!usingRegex) {
|
||||||
keywords = Pattern.quote(keywords);
|
keywords = Pattern.quote(keywords);
|
||||||
}
|
}
|
||||||
String text = mCodeEditText.getText().toString();
|
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);
|
setText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.content.pm.PackageManager;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.PersistableBundle;
|
import android.os.PersistableBundle;
|
||||||
@@ -131,6 +132,7 @@ public class ShortcutCreateActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressLint("CheckResult")
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
if (resultCode != RESULT_OK) {
|
if (resultCode != RESULT_OK) {
|
||||||
@@ -146,7 +148,11 @@ public class ShortcutCreateActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
return;
|
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())
|
.subscribeOn(Schedulers.computation())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe((bitmap -> {
|
.subscribe((bitmap -> {
|
||||||
|
|||||||
@@ -421,4 +421,5 @@
|
|||||||
<string name="text_run_on_headset_plug">耳机插拔时</string>
|
<string name="text_run_on_headset_plug">耳机插拔时</string>
|
||||||
<string name="text_run_on_time_tick">每分钟一次</string>
|
<string name="text_run_on_time_tick">每分钟一次</string>
|
||||||
<string name="text_run_on_config_change">某些设置(屏幕方向,地区等)更改时</string>
|
<string name="text_run_on_config_change">某些设置(屏幕方向,地区等)更改时</string>
|
||||||
|
<string name="error_pattern_syntax">正则表达式错误</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user