diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java index 3f9b827c..96f9b73d 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java @@ -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); } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/FindOrReplaceDialogBuilder.java b/app/src/main/java/org/autojs/autojs/ui/edit/FindOrReplaceDialogBuilder.java index 7cf9c876..7c2317d3 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/FindOrReplaceDialogBuilder.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/FindOrReplaceDialogBuilder.java @@ -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)); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java index 0c6eeceb..aff768ad 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java @@ -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); } diff --git a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java index 54368f49..67716426 100644 --- a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java @@ -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 -> { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec195a39..0b17927a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -421,4 +421,5 @@ 耳机插拔时 每分钟一次 某些设置(屏幕方向,地区等)更改时 + 正则表达式错误