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:
hyb1996
2018-10-06 10:32:55 +08:00
parent 4851790ad9
commit 0ff7b1c208
5 changed files with 53 additions and 27 deletions

View File

@@ -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);
} }

View File

@@ -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));
} }
} }

View File

@@ -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);
} }

View File

@@ -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 -> {

View File

@@ -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>