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

View File

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

View File

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

View File

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

View File

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