diff --git a/app/src/main/java/com/stardust/scriptdroid/io/SampleFileProvider.java b/app/src/main/java/com/stardust/scriptdroid/io/SampleFileProvider.java new file mode 100644 index 00000000..1f50bfe2 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/io/SampleFileProvider.java @@ -0,0 +1,74 @@ +package com.stardust.scriptdroid.io; + +import android.content.Context; +import android.content.res.AssetManager; +import android.support.annotation.NonNull; + +import com.stardust.pio.PFile; +import com.stardust.pio.PFiles; +import com.stardust.scriptdroid.model.script.ScriptFile; + +import java.io.File; + +import io.reactivex.Observable; + +/** + * Created by Stardust on 2017/10/28. + */ + +public class SampleFileProvider extends StorageFileProvider { + + private AssetManager mAssetManager; + private Context mContext; + + public SampleFileProvider(String path, Context context) { + super(path, 10); + mContext = context; + mAssetManager = context.getAssets(); + } + + public SampleFileProvider(Context context) { + this("sample/", context); + } + + @Override + protected Observable listFiles(PFile directory) { + return Observable.just(directory) + .flatMap(dir -> Observable.fromArray(mAssetManager.list(directory.getPath()))) + .map(path -> { + String absPath = new File(directory, path).getPath(); + if (!absPath.endsWith(".js")) { + return new AssetDirectory(absPath); + } + PFile file = new PFile(mContext.getFilesDir(), absPath); + if (!file.exists()) { + copySample(mContext, absPath, file.getPath()); + } + return file; + }); + + } + + public static boolean copySample(Context context, String samplePath, String pathTo) { + PFiles.ensureDir(pathTo); + return PFiles.copyAsset(context, samplePath, pathTo); + } + + public static class AssetDirectory extends ScriptFile { + + public AssetDirectory(@NonNull String pathname) { + super(pathname); + } + + @Override + public boolean isDirectory() { + return true; + } + + @Override + public boolean isFile() { + return false; + } + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/io/StorageFileProvider.java b/app/src/main/java/com/stardust/scriptdroid/io/StorageFileProvider.java index 260c5d30..acabf5fa 100644 --- a/app/src/main/java/com/stardust/scriptdroid/io/StorageFileProvider.java +++ b/app/src/main/java/com/stardust/scriptdroid/io/StorageFileProvider.java @@ -16,9 +16,6 @@ import java.util.List; import java.util.Map; import io.reactivex.Observable; -import io.reactivex.ObservableSource; -import io.reactivex.annotations.NonNull; -import io.reactivex.functions.Function; /** * Created by Stardust on 2017/3/31. @@ -82,6 +79,7 @@ public class StorageFileProvider { private EventBus mDirectoryEventBus = new EventBus(); private LimitedHashMap> mPFileCache; private PFile mInitialDirectory; + private FileFilter mFileFilter; public StorageFileProvider(PFile initialDirectory, int cacheSize, FileFilter fileFilter) { mInitialDirectory = initialDirectory; @@ -89,7 +87,6 @@ public class StorageFileProvider { mPFileCache = new LimitedHashMap<>(cacheSize); } - private FileFilter mFileFilter; public StorageFileProvider(String path, int cacheSize) { this(new PFile(path), cacheSize); @@ -185,23 +182,20 @@ public class StorageFileProvider { } - private Observable listFiles(PFile directory) { + protected Observable listFiles(PFile directory) { return Observable.just(directory) - .flatMap(new Function>() { - @Override - public ObservableSource apply(@NonNull PFile dir) throws Exception { - PFile[] files; - if (mFileFilter == null) { - files = dir.listFiles(); - } else { - files = dir.listFiles(mFileFilter); - } - if (files == null) { - return Observable.empty(); - } - mPFileCache.put(dir.getPath(), new ArrayList<>(Arrays.asList(files))); - return Observable.fromArray(files); + .flatMap(dir -> { + PFile[] files; + if (mFileFilter == null) { + files = dir.listFiles(); + } else { + files = dir.listFiles(mFileFilter); } + if (files == null) { + return Observable.empty(); + } + mPFileCache.put(dir.getPath(), new ArrayList<>(Arrays.asList(files))); + return Observable.fromArray(files); }); } diff --git a/app/src/main/java/com/stardust/scriptdroid/model/sample/Sample.java b/app/src/main/java/com/stardust/scriptdroid/model/sample/Sample.java deleted file mode 100644 index 06dff709..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/model/sample/Sample.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.stardust.scriptdroid.model.sample; - -import java.io.Serializable; - -/** - * Created by Stardust on 2017/3/13. - */ - -public class Sample implements Serializable { - public String name; - public String path; - - public Sample(String name, String path) { - this.name = name; - this.path = path; - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFile.java b/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFile.java new file mode 100644 index 00000000..dbb3c9f1 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFile.java @@ -0,0 +1,112 @@ +package com.stardust.scriptdroid.model.sample; + +import android.content.res.AssetManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.stardust.autojs.script.JavaScriptSource; +import com.stardust.autojs.script.ScriptSource; +import com.stardust.pio.PFiles; +import com.stardust.pio.UncheckedIOException; +import com.stardust.scriptdroid.model.script.ScriptFile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; + +/** + * Created by Stardust on 2017/10/28. + */ + +public class SampleFile extends ScriptFile { + + private long mLength; + private AssetManager mAssetManager; + + public SampleFile(@NonNull String pathname, AssetManager assetManager) { + super(pathname); + mAssetManager = assetManager; + init(); + } + + private void init() { + if (isDirectory()) { + mLength = 0; + return; + } + try { + InputStream inputStream = openInputStream(); + mLength = inputStream.available(); + inputStream.close(); + } catch (IOException e) { + mLength = 0; + } + } + + public SampleFile(String parent, @NonNull String child, AssetManager assetManager) { + super(parent, child); + mAssetManager = assetManager; + init(); + } + + public SampleFile(File parent, @NonNull String child, AssetManager assetManager) { + super(parent, child); + mAssetManager = assetManager; + init(); + } + + @Override + public boolean isFile() { + return getName().endsWith(".js"); + } + + @Override + public boolean isDirectory() { + return !isFile(); + } + + @Override + public long length() { + return mLength; + } + + @Override + public String[] list() { + try { + return mAssetManager.list(getPath()); + } catch (IOException e) { + return null; + } + } + + @Override + public ScriptSource toSource() { + return new JavaScriptSource(getSimplifiedName()) { + @NonNull + @Override + public String getScript() { + try { + return PFiles.read(openInputStream()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Nullable + @Override + public Reader getScriptReader() { + try { + return new InputStreamReader(openInputStream()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + }; + } + + public InputStream openInputStream() throws IOException { + return mAssetManager.open(getPath()); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFileManager.java b/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFileManager.java deleted file mode 100644 index 028c2dde..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleFileManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.stardust.scriptdroid.model.sample; - -import android.content.Context; -import android.content.res.AssetManager; - -import com.stardust.pio.PFiles; -import com.stardust.scriptdroid.App; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/1/30. - */ -public class SampleFileManager { - - private static SampleFileManager instance = new SampleFileManager(); - - public static SampleFileManager getInstance() { - return instance; - } - - private Context getContext() { - return App.getApp(); - } - - public List getSamplesFromAssets(AssetManager assets, String path) { - List sampleGroups = new ArrayList<>(); - try { - String[] groups = assets.list(path); - for (String groupName : groups) { - sampleGroups.add(getSampleGroupFromAssets(assets, groupName, path + "/" + groupName)); - } - return sampleGroups; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private SampleGroup getSampleGroupFromAssets(AssetManager assets, String groupName, String path) { - SampleGroup group = new SampleGroup(groupName); - try { - String[] samples = assets.list(path); - for (String sample : samples) { - group.add(new Sample(PFiles.getNameWithoutExtension(sample), path + "/" + sample)); - } - return group; - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleGroup.java b/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleGroup.java deleted file mode 100644 index 7a1d28fc..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/model/sample/SampleGroup.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.stardust.scriptdroid.model.sample; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/3/13. - */ - -public class SampleGroup { - - public String name; - public List sampleList; - - public SampleGroup(String name) { - this(name, new ArrayList()); - } - - public SampleGroup(String name, List samples) { - this.name = name; - sampleList = samples; - } - - public void add(Sample sample){ - sampleList.add(sample); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/model/script/ScriptFile.java b/app/src/main/java/com/stardust/scriptdroid/model/script/ScriptFile.java index 0a43b7bd..18519d1a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/model/script/ScriptFile.java +++ b/app/src/main/java/com/stardust/scriptdroid/model/script/ScriptFile.java @@ -34,7 +34,7 @@ public class ScriptFile extends PFile { super(parent, name); } - public ScriptFile(ScriptFile parent, String child) { + public ScriptFile(File parent, String child) { super(parent, child); } diff --git a/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java index 86c06307..35d2e322 100644 --- a/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java @@ -1,6 +1,5 @@ package com.stardust.scriptdroid.model.script; -import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; @@ -11,7 +10,6 @@ import com.stardust.autojs.execution.ScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.script.ScriptSource; -import com.stardust.autojs.script.StringScriptSource; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; @@ -19,9 +17,7 @@ import com.stardust.scriptdroid.external.CommonUtils; import com.stardust.scriptdroid.external.shortcut.Shortcut; import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; import com.stardust.scriptdroid.io.StorageFileProvider; -import com.stardust.scriptdroid.model.sample.Sample; import com.stardust.scriptdroid.ui.edit.EditActivity; -import com.stardust.util.AssetsCache; import org.mozilla.javascript.RhinoException; @@ -113,10 +109,6 @@ public class Scripts { new ExecutionConfig().path(directoryPath, StorageFileProvider.DEFAULT_DIRECTORY_PATH)); } - public static ScriptExecution run(Context context, Sample file) { - ScriptSource source = new StringScriptSource(file.name, AssetsCache.get(context.getAssets(), file.path)); - return AutoJs.getInstance().getScriptEngineService().execute(source); - } public static ScriptExecution runWithBroadcastSender(ScriptSource source) { return AutoJs.getInstance().getScriptEngineService().execute(source, BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER, diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java index f75754b6..3ce97c28 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java @@ -22,10 +22,10 @@ import com.stardust.pio.UncheckedIOException; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.io.TmpScriptFiles; +import com.stardust.scriptdroid.model.sample.SampleFile; import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.model.script.Scripts; import com.stardust.scriptdroid.io.StorageFileProvider; -import com.stardust.scriptdroid.model.sample.Sample; import com.stardust.scriptdroid.network.download.DownloadManager; import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder; import com.stardust.scriptdroid.ui.shortcut.ShortcutCreateActivity; @@ -207,9 +207,9 @@ public class ScriptOperations { return mContext.getString(resId); } - public Observable importSample(Sample sample) { + public Observable importSample(SampleFile sample) { try { - return importFile(sample.name, mContext.getAssets().open(sample.path), PFiles.getExtension(sample.path)); + return importFile(sample.getSimplifiedName(), sample.openInputStream(), sample.getExtension()); } catch (IOException e) { e.printStackTrace(); showMessage(R.string.text_import_fail); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/CodeMirrorEditor.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/CodeMirrorEditor.java index 47d3ac2a..9d303289 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/CodeMirrorEditor.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/CodeMirrorEditor.java @@ -172,28 +172,22 @@ public class CodeMirrorEditor extends FrameLayout { mWebView.setWebChromeClient(new MyWebChromeClient()); } + public void setReadOnly(boolean readOnly) { + evalJavaScript(String.format("editor.setOption('readOnly', %b);", readOnly)); + } + public void setProgress(boolean onProgress) { mProgressBarContainer.setVisibility(onProgress ? VISIBLE : GONE); } public void setText(final String text) { mTextFromAndroid = text; - mPageFinished.promise().done(new DoneCallback() { - @Override - public void onDone(Void result) { - evalJavaScript("editor.setValue(__bridge__.getStringFromAndroid());"); - } - }); + mPageFinished.promise().done(result -> evalJavaScript("editor.setValue(__bridge__.getStringFromAndroid());")); } public void insert(String text) { mTextFromAndroid = text; - mPageFinished.promise().done(new DoneCallback() { - @Override - public void onDone(Void result) { - evalJavaScript("editor.replaceSelection(__bridge__.getStringFromAndroid());"); - } - }); + mPageFinished.promise().done(result -> evalJavaScript("editor.replaceSelection(__bridge__.getStringFromAndroid());")); } public void loadFile(final File file) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java index 10fa1658..5ce82801 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java @@ -14,8 +14,10 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT; import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME; import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_PATH; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_READ_ONLY; /** * Created by Stardust on 2017/1/29. @@ -41,8 +43,12 @@ public class EditActivity extends BaseActivity { .putExtra(EXTRA_NAME, name)); } - public static void editFile(Context context, ScriptFile file) { - editFile(context, file.getSimplifiedName(), file.getPath()); + public static void viewContent(Context context, String name, String content) { + context.startActivity(new Intent(context, EditActivity_.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_CONTENT, content) + .putExtra(EXTRA_NAME, name) + .putExtra(EXTRA_READ_ONLY, true)); } @AfterViews diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java index 787c1450..a10e92e8 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java @@ -151,6 +151,9 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC if (!intent.getBooleanExtra(EXTRA_RUN_ENABLED, true)) { findViewById(R.id.run).setVisibility(GONE); } + if(mReadOnly){ + mEditor.setReadOnly(true); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java index 38867705..a9f4056a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java @@ -17,7 +17,7 @@ import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.model.sample.Sample; +import com.stardust.scriptdroid.model.sample.SampleFile; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.common.ScriptOperations; import com.stardust.theme.ThemeColorManager; @@ -41,14 +41,14 @@ import static com.stardust.scriptdroid.model.script.Scripts.EXTRA_EXCEPTION_MESS public class ViewSampleActivity extends AppCompatActivity implements OnActivityResultDelegate.DelegateHost { - public static void view(Context context, Sample sample) { + public static void view(Context context, SampleFile sample) { context.startActivity(new Intent(context, ViewSampleActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra("sample", sample)); + .putExtra("sample_path", sample.getPath())); } private View mView; - private Sample mSample; + private SampleFile mSample; private ScriptExecution mScriptExecution; private SparseArray mMenuMap; private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator(); @@ -76,8 +76,7 @@ public class ViewSampleActivity extends AppCompatActivity implements OnActivityR } private void handleIntent(Intent intent) { - mSample = (Sample) intent.getSerializableExtra("sample"); - String content = AssetsCache.get(this, mSample.path); + mSample = new SampleFile(intent.getStringExtra("sample_path"), getAssets()); } private void setUpUI() { @@ -92,7 +91,7 @@ public class ViewSampleActivity extends AppCompatActivity implements OnActivityR } private void setUpToolbar() { - BaseActivity.setToolbarAsBack(this, R.id.toolbar, mSample.name); + BaseActivity.setToolbarAsBack(this, R.id.toolbar, mSample.getSimplifiedName()); } @OnClick(R.id.run) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index d28a39ba..db1b6f08 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -31,6 +31,8 @@ import com.stardust.scriptdroid.ui.doc.OnlineDocsFragment_; import com.stardust.scriptdroid.ui.floating.FloatyWindowManger; import com.stardust.scriptdroid.io.StorageFileProvider; import com.stardust.scriptdroid.ui.main.community.CommunityFragment_; +import com.stardust.scriptdroid.ui.main.sample.SampleListFragment; +import com.stardust.scriptdroid.ui.main.sample.SampleListFragment_; import com.stardust.scriptdroid.ui.main.scripts.MyScriptListFragment_; import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment_; import com.stardust.theme.ThemeColorManager; @@ -145,6 +147,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega .add(new MyScriptListFragment_(), R.string.text_script) .add(new OnlineDocsFragment_(), R.string.text_tutorial) .add(new CommunityFragment_(), R.string.text_community) + .add(new SampleListFragment_(), R.string.text_sample) .add(new TaskManagerFragment_(), R.string.text_manage) .build(); mViewPager.setAdapter(mPagerAdapter); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListFragment.java new file mode 100644 index 00000000..01c94696 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListFragment.java @@ -0,0 +1,108 @@ +package com.stardust.scriptdroid.ui.main.sample; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.FloatingActionButton; + +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.io.SampleFileProvider; +import com.stardust.scriptdroid.io.StorageFileProvider; +import com.stardust.scriptdroid.model.script.Scripts; +import com.stardust.scriptdroid.tool.SimpleObserver; +import com.stardust.scriptdroid.ui.common.ScriptOperations; +import com.stardust.scriptdroid.ui.main.FloatingActionMenu; +import com.stardust.scriptdroid.ui.main.QueryEvent; +import com.stardust.scriptdroid.ui.main.ViewPagerFragment; +import com.stardust.scriptdroid.ui.main.scripts.ScriptListView; +import com.stardust.util.BackPressedHandler; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.EFragment; +import org.androidannotations.annotations.ViewById; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; + +import io.reactivex.android.schedulers.AndroidSchedulers; + +/** + * Created by Stardust on 2017/10/28. + */ +@EFragment(R.layout.fragment_sample_list) +public class SampleListFragment extends ViewPagerFragment implements BackPressedHandler { + + + public SampleListFragment() { + super(ROTATION_GONE); + } + + @ViewById(R.id.sample_list) + ScriptListView mScriptFileList; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EventBus.getDefault().register(this); + } + + @AfterViews + void setUpViews() { + mScriptFileList.setDirectorySpanSize(2); + mScriptFileList.setStorageFileProvider(new SampleFileProvider(getContext())); + mScriptFileList.setOnScriptFileClickListener((view, file) -> Scripts.edit(file)); + } + + @Override + public void onResume() { + super.onResume(); + ((BackPressedHandler.HostActivity) getActivity()) + .getBackPressedObserver() + .registerHandlerAtFront(this); + } + + @Override + public void onPause() { + super.onPause(); + ((BackPressedHandler.HostActivity) getActivity()) + .getBackPressedObserver() + .unregisterHandler(this); + } + + @Override + protected void onFabClick(FloatingActionButton fab) { + + } + + + @Override + public boolean onBackPressed(Activity activity) { + if (mScriptFileList.canGoBack()) { + mScriptFileList.goBack(); + return true; + } + return false; + } + + + @Subscribe + public void onQuerySummit(QueryEvent event) { + if (!isShown()) { + return; + } + if (event == QueryEvent.CLEAR) { + mScriptFileList.setFilter(null); + return; + } + String query = event.getQuery(); + mScriptFileList.setFilter((file -> file.getSimplifiedName().contains(query))); + } + + + @Override + public void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + } + + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListView.java new file mode 100644 index 00000000..93599f25 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample/SampleListView.java @@ -0,0 +1,149 @@ +package com.stardust.scriptdroid.ui.main.sample; + +import android.content.Context; +import android.graphics.drawable.GradientDrawable; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.support.v4.content.res.ResourcesCompat; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.PopupMenu; +import android.widget.TextView; + +import com.stardust.pio.PFiles; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.io.SampleFileProvider; +import com.stardust.scriptdroid.io.StorageFileProvider; +import com.stardust.scriptdroid.model.script.ScriptFile; +import com.stardust.scriptdroid.model.script.Scripts; +import com.stardust.scriptdroid.ui.common.ScriptOperations; +import com.stardust.scriptdroid.ui.main.scripts.ScriptListView; +import com.stardust.scriptdroid.ui.widget.BindableViewHolder; + +import java.io.File; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * Created by Stardust on 2017/10/28. + */ + +public class SampleListView extends ScriptListView { + public SampleListView(Context context) { + super(context); + } + + public SampleListView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.copy_to_my_script: + new ScriptOperations(getContext(), this) + .importFile(mSelectedScriptFile.getPath()) + .subscribe(); + return true; + case R.id.reset: + resetSample(); + return true; + default: + return super.onMenuItemClick(item); + } + } + + private void resetSample() { + String samplePath = new File(getCurrentDirectory(), mSelectedScriptFile.getName()).getPath(); + if (SampleFileProvider.copySample(getContext(), samplePath, mSelectedScriptFile.getPath())) { + Snackbar.make(this, R.string.text_reset_succeed, Snackbar.LENGTH_SHORT).show(); + } else { + Snackbar.make(this, R.string.text_reset_fail, Snackbar.LENGTH_SHORT).show(); + } + } + + @Override + protected BindableViewHolder onCreateViewHolder(LayoutInflater inflater, ViewGroup parent, int viewType) { + if (viewType == VIEW_TYPE_FILE) { + return new SampleFileViewHolder(inflater.inflate(R.layout.script_file_list_file, parent, false)); + } else if (viewType == VIEW_TYPE_DIRECTORY) { + DirectoryViewHolder viewHolder = (DirectoryViewHolder) super.onCreateViewHolder(inflater, parent, viewType); + viewHolder.mOptions.setVisibility(GONE); + return viewHolder; + } + return super.onCreateViewHolder(inflater, parent, viewType); + } + + class SampleFileViewHolder extends BindableViewHolder { + + @BindView(R.id.name) + TextView mName; + @BindView(R.id.first_char) + TextView mFirstChar; + @BindView(R.id.desc) + TextView mDesc; + @BindView(R.id.more) + View mOptions; + @BindView(R.id.edit) + View mEdit; + GradientDrawable mFirstCharBackground; + private ScriptFile mScriptFile; + + SampleFileViewHolder(View itemView) { + super(itemView); + ButterKnife.bind(this, itemView); + mFirstCharBackground = (GradientDrawable) mFirstChar.getBackground(); + } + + @Override + public void bind(ScriptFile file, int position) { + mScriptFile = file; + mName.setText(file.getSimplifiedName()); + mDesc.setText(PFiles.getHumanReadableSize(file.length())); + if (file.getType() == ScriptFile.TYPE_JAVA_SCRIPT) { + mFirstChar.setText("J"); + mFirstCharBackground.setColor(ResourcesCompat.getColor(getResources(), R.color.color_j, getContext().getTheme())); + mEdit.setVisibility(VISIBLE); + } else { + mFirstChar.setText("R"); + mFirstCharBackground.setColor(ResourcesCompat.getColor(getResources(), R.color.color_r, getContext().getTheme())); + mEdit.setVisibility(GONE); + } + } + + @OnClick(R.id.item) + void onItemClick() { + if (mOnScriptFileClickListener != null) { + mOnScriptFileClickListener.onScriptFileClick(itemView, mScriptFile); + } + notifyOperated(); + } + + @OnClick(R.id.run) + void run() { + Scripts.run(mScriptFile); + notifyOperated(); + } + + @OnClick(R.id.edit) + void edit() { + Scripts.edit(mScriptFile); + notifyOperated(); + } + + @OnClick(R.id.more) + void showOptionMenu() { + mSelectedScriptFile = mScriptFile; + PopupMenu popupMenu = new PopupMenu(getContext(), mOptions); + popupMenu.inflate(R.menu.menu_sample_options); + popupMenu.setOnMenuItemClickListener(SampleListView.this); + popupMenu.show(); + } + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java index 1a763414..fc51465d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java @@ -66,10 +66,10 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa private RecyclerView mScriptListView; private ScriptListAdapter mScriptListAdapter = new ScriptListAdapter(); private ScriptFile mCurrentDirectory; - private OnScriptFileClickListener mOnScriptFileClickListener; + protected OnScriptFileClickListener mOnScriptFileClickListener; private Function mFilter; private OnItemOperatedListener mOnItemOperatedListener; - private ScriptFile mSelectedScriptFile; + protected ScriptFile mSelectedScriptFile; private StorageFileProvider mStorageFileProvider; private boolean mDirSortMenuShowing = false; private boolean mDirsCollapsed; @@ -174,9 +174,13 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa mStorageFileProvider.getDirectoryFiles(mCurrentDirectory) .subscribeOn(Schedulers.io()) .filter(f -> mFilter == null ? true : mFilter.apply(f)) - .collectInto(mScriptList.cloneConfig(), (list, file) -> - list.add(new ScriptFile(file)) - ) + .collectInto(mScriptList.cloneConfig(), (list, file) -> { + if (file instanceof ScriptFile) { + list.add((ScriptFile) file); + } else { + list.add(new ScriptFile(file)); + } + }) .observeOn(Schedulers.computation()) .doOnSuccess(ScriptList::sort) .observeOn(AndroidSchedulers.mainThread()) @@ -248,7 +252,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa return true; } - private void notifyOperated() { + protected void notifyOperated() { if (mOnItemOperatedListener != null) { mOnItemOperatedListener.OnItemOperated(mSelectedScriptFile); } @@ -345,7 +349,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa } } - class ScriptFileViewHolder extends BindableViewHolder { + protected class ScriptFileViewHolder extends BindableViewHolder { @BindView(R.id.name) @@ -413,12 +417,12 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa } } - class DirectoryViewHolder extends BindableViewHolder { + protected class DirectoryViewHolder extends BindableViewHolder { @BindView(R.id.name) - TextView mName; + public TextView mName; @BindView(R.id.more) - View mOptions; + public View mOptions; private ScriptFile mScriptFile; diff --git a/app/src/main/res/layout/fragment_sample_list.xml b/app/src/main/res/layout/fragment_sample_list.xml new file mode 100644 index 00000000..2e1f3a9f --- /dev/null +++ b/app/src/main/res/layout/fragment_sample_list.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/script_file_list_directory.xml b/app/src/main/res/layout/script_file_list_directory.xml index 7af345a7..f5cae7fd 100644 --- a/app/src/main/res/layout/script_file_list_directory.xml +++ b/app/src/main/res/layout/script_file_list_directory.xml @@ -5,12 +5,12 @@ android:id="@+id/item" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="2dp" - android:layout_marginRight="2dp" + android:layout_marginLeft="3dp" + android:layout_marginRight="3dp" android:clickable="true" android:foreground="?selectableItemBackground" app:cardBackgroundColor="#ffffff" - app:cardElevation="1dp" + app:cardElevation="0.5dp" app:cardUseCompatPadding="true"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b109daba..92af4fef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -275,6 +275,11 @@ 注册中 注册失败 注册成功 + 示例 + 导入到我的脚本 + 重置为初始内容 + 重置失败 + 重置成功