From dbcb0257a2ab9fe3a4a1b37cb071b6b70a5ddfb0 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 24 Oct 2018 17:55:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=94=AF=E6=8C=81Content?= =?UTF-8?q?=20Uri=E7=BC=96=E8=BE=91=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/open/EditIntentActivity.java | 31 ++++++++++++++-- .../autojs/autojs/model/script/Scripts.java | 6 ++-- .../autojs/autojs/ui/edit/EditActivity.java | 11 ++++-- .../org/autojs/autojs/ui/edit/EditorMenu.java | 2 +- .../org/autojs/autojs/ui/edit/EditorView.java | 35 ++++++++++++------- .../ui/edit/toolbar/DebugToolbarFragment.java | 2 +- .../main/java/com/stardust/pio/PFiles.java | 7 ++-- .../java/com/stardust/util/IntentUtil.java | 19 ++++++++++ 8 files changed, 89 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/external/open/EditIntentActivity.java b/app/src/main/java/org/autojs/autojs/external/open/EditIntentActivity.java index 3e2f9244..b8616493 100644 --- a/app/src/main/java/org/autojs/autojs/external/open/EditIntentActivity.java +++ b/app/src/main/java/org/autojs/autojs/external/open/EditIntentActivity.java @@ -1,21 +1,30 @@ package org.autojs.autojs.external.open; +import android.content.ContentResolver; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.os.Environment; import android.support.annotation.Nullable; import android.text.TextUtils; import android.widget.Toast; +import com.stardust.pio.PFiles; + import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.edit.EditActivity; import org.autojs.autojs.R; +import java.io.File; + /** * Created by Stardust on 2017/2/2. */ public class EditIntentActivity extends BaseActivity { + private static final String EXTERNAL_FILES = "external_files"; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -30,8 +39,26 @@ public class EditIntentActivity extends BaseActivity { private void handleIntent() { Intent intent = getIntent(); - String path = intent.getData().getPath(); - if (!TextUtils.isEmpty(path)) + Uri uri = intent.getData(); + String path = null; + if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) { + path = uri.getPath(); + } else { + int i = uri.getPath().indexOf(EXTERNAL_FILES); + if (i >= 0) { + path = uri.getPath().substring(i + EXTERNAL_FILES.length()); + if (!PFiles.exists(path)) { + path = new File(Environment.getExternalStorageDirectory(), path).getPath(); + if (!PFiles.exists(path)) { + path = null; + } + } + } + } + if (!TextUtils.isEmpty(path)) { EditActivity.editFile(this, path); + } else { + EditActivity.editFile(this, uri); + } } } diff --git a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java index e5fd0de9..c323d22f 100644 --- a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java +++ b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java @@ -74,12 +74,12 @@ public class Scripts { }; - public static void openByOtherApps(String path) { - IntentUtil.viewFile(GlobalAppContext.get(), path, "text/plain", AppFileProvider.AUTHORITY); + public static void openByOtherApps(Uri uri) { + IntentUtil.viewFile(GlobalAppContext.get(), uri, "text/plain", AppFileProvider.AUTHORITY); } public static void openByOtherApps(File file) { - openByOtherApps(file.getPath()); + openByOtherApps(Uri.fromFile(file)); } public static void createShortcut(ScriptFile scriptFile) { diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java index 2ce91f04..bf30ee25 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java @@ -3,6 +3,7 @@ package org.autojs.autojs.ui.edit; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -61,6 +62,12 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo editFile(context, null, path); } + public static void editFile(Context context, Uri uri) { + context.startActivity(new Intent(context, EditActivity_.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setData(uri)); + } + public static void editFile(Context context, String name, String path) { context.startActivity(new Intent(context, EditActivity_.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) @@ -166,13 +173,13 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo @Override public ActionMode startActionMode(ActionMode.Callback callback, int type) { - Log.d(LOG_TAG, "startActionMode: callback = " + callback + ", type = " + type); + Log.d(LOG_TAG, "startActionMode: callback = " + callback + ", type = " + type); return super.startActionMode(callback, type); } @Override public ActionMode startActionMode(ActionMode.Callback callback) { - Log.d(LOG_TAG, "startActionMode: callback = " + callback ); + Log.d(LOG_TAG, "startActionMode: callback = " + callback); return super.startActionMode(callback); } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java index 2c4eda6b..c603f8bf 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java @@ -190,7 +190,7 @@ public class EditorMenu { private void startBuildApkActivity() { BuildActivity_.intent(mContext) - .extra(BuildActivity.EXTRA_SOURCE, mEditorView.getFile().getPath()) + .extra(BuildActivity.EXTRA_SOURCE, mEditorView.getUri().getPath()) .start(); } 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 17401c53..52b3dedb 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 @@ -7,6 +7,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; +import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.Nullable; @@ -31,6 +32,7 @@ import com.stardust.autojs.execution.ScriptExecution; import com.stardust.pio.PFiles; import com.stardust.util.BackPressedHandler; import com.stardust.util.Callback; +import com.stardust.util.IntentUtil; import com.stardust.util.ViewUtils; import org.androidannotations.annotations.AfterViews; @@ -116,7 +118,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC DrawerLayout mDrawerLayout; private String mName; - private File mFile; + private Uri mUri; private boolean mReadOnly = false; private int mScriptExecutionId; private AutoCompletion mAutoCompletion; @@ -179,8 +181,8 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } } - public File getFile() { - return mFile; + public Uri getUri() { + return mUri; } public Observable handleIntent(Intent intent) { @@ -215,21 +217,26 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC return Observable.just(content); } else { if (path == null) { - return Observable.error(new IllegalArgumentException("path and content is empty")); + if (intent.getData() == null) { + return Observable.error(new IllegalArgumentException("path and content is empty")); + } else { + mUri = intent.getData(); + } + } else { + mUri = Uri.fromFile(new File(path)); } - mFile = new File(path); if (mName == null) { - mName = mFile.getName(); + mName = PFiles.getNameWithoutExtension(mUri.getPath()); } - return loadFile(mFile); + return loadUri(mUri); } } @SuppressLint("CheckResult") - private Observable loadFile(final File file) { + private Observable loadUri(final Uri uri) { mEditor.setProgress(true); - return Observable.fromCallable(() -> PFiles.read(file)) + return Observable.fromCallable(() -> PFiles.read(getContext().getContentResolver().openInputStream(uri))) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(s -> { @@ -393,7 +400,8 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC if (showMessage) { Snackbar.make(this, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); } - ScriptExecution execution = Scripts.runWithBroadcastSender(mFile); + // TODO: 2018/10/24 + ScriptExecution execution = Scripts.runWithBroadcastSender(new File(mUri.getPath())); if (execution == null) { return null; } @@ -414,7 +422,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC public Observable save() { return Observable.just(mEditor.getText()) .observeOn(Schedulers.io()) - .doOnNext(s -> PFiles.write(mFile, s)) + .doOnNext(s -> PFiles.write(getContext().getContentResolver().openOutputStream(mUri), s)) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(s -> { mEditor.markTextAsSaved(); @@ -489,8 +497,9 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } public void openByOtherApps() { - if (mFile != null) - Scripts.openByOtherApps(mFile); + if (mUri != null) { + Scripts.openByOtherApps(mUri); + } } public void beautifyCode() { diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java index a88ebc25..f43b26e4 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java @@ -75,7 +75,7 @@ public class DebugToolbarFragment extends ToolbarFragment implements DebugCallba mDebugger = DebuggerSingleton.get(); mDebugger.setWeakDebugCallback(new WeakReference<>(this)); setInterrupted(false); - mCurrentEditorSourceUrl = mInitialEditorSourceUrl = mEditorView.getFile().toString(); + mCurrentEditorSourceUrl = mInitialEditorSourceUrl = mEditorView.getUri().toString(); mInitialEditorSource = mEditorView.getEditor().getText(); setupEditor(); ScriptExecution execution = mEditorView.run(false); diff --git a/common/src/main/java/com/stardust/pio/PFiles.java b/common/src/main/java/com/stardust/pio/PFiles.java index c867c24b..abb2fd0e 100644 --- a/common/src/main/java/com/stardust/pio/PFiles.java +++ b/common/src/main/java/com/stardust/pio/PFiles.java @@ -136,6 +136,8 @@ public class PFiles { return new String(bytes, encoding); } catch (IOException e) { throw new UncheckedIOException(e); + } finally { + closeSilently(is); } } @@ -218,7 +220,7 @@ public class PFiles { } } - public static void write(FileOutputStream fileOutputStream, String text) { + public static void write(OutputStream fileOutputStream, String text) { write(fileOutputStream, text, "utf-8"); } @@ -226,9 +228,10 @@ public class PFiles { public static void write(OutputStream outputStream, String text, String encoding) { try { outputStream.write(text.getBytes(encoding)); - outputStream.close(); } catch (IOException e) { throw new UncheckedIOException(e); + } finally { + closeSilently(outputStream); } } diff --git a/common/src/main/java/com/stardust/util/IntentUtil.java b/common/src/main/java/com/stardust/util/IntentUtil.java index 148979ee..8636f4b6 100644 --- a/common/src/main/java/com/stardust/util/IntentUtil.java +++ b/common/src/main/java/com/stardust/util/IntentUtil.java @@ -134,6 +134,25 @@ public class IntentUtil { return uri; } + public static boolean viewFile(Context context, Uri uri, String mimeType, String fileProviderAuthority) { + if (uri.getScheme().equals("file")) { + return viewFile(context, uri.getPath(), mimeType, fileProviderAuthority); + } else { + try { + context.startActivity(new Intent(Intent.ACTION_VIEW) + .setDataAndType(uri, mimeType) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + } + public static boolean viewFile(Context context, String path, String mimeType, String fileProviderAuthority) { try { Uri uri = getUriOfFile(context, path, fileProviderAuthority);