mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-21 21:01:43 +08:00
add: tab "Samples"
This commit is contained in:
parent
3923daeaf8
commit
56c0ad3415
@ -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<PFile> 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<String, List<PFile>> 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<PFile> listFiles(PFile directory) {
|
||||
protected Observable<PFile> listFiles(PFile directory) {
|
||||
return Observable.just(directory)
|
||||
.flatMap(new Function<PFile, ObservableSource<PFile>>() {
|
||||
@Override
|
||||
public ObservableSource<PFile> 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);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
@ -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<SampleGroup> getSamplesFromAssets(AssetManager assets, String path) {
|
||||
List<SampleGroup> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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<Sample> sampleList;
|
||||
|
||||
public SampleGroup(String name) {
|
||||
this(name, new ArrayList<Sample>());
|
||||
}
|
||||
|
||||
public SampleGroup(String name, List<Sample> samples) {
|
||||
this.name = name;
|
||||
sampleList = samples;
|
||||
}
|
||||
|
||||
public void add(Sample sample){
|
||||
sampleList.add(sample);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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<String> importSample(Sample sample) {
|
||||
public Observable<String> 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);
|
||||
|
||||
@ -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<Void>() {
|
||||
@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<Void>() {
|
||||
@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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -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<ToolbarMenuItem> 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)
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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<ScriptFile> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<PFile, Boolean> 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<ScriptFile> {
|
||||
protected class ScriptFileViewHolder extends BindableViewHolder<ScriptFile> {
|
||||
|
||||
|
||||
@BindView(R.id.name)
|
||||
@ -413,12 +417,12 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
|
||||
}
|
||||
}
|
||||
|
||||
class DirectoryViewHolder extends BindableViewHolder<ScriptFile> {
|
||||
protected class DirectoryViewHolder extends BindableViewHolder<ScriptFile> {
|
||||
|
||||
@BindView(R.id.name)
|
||||
TextView mName;
|
||||
public TextView mName;
|
||||
@BindView(R.id.more)
|
||||
View mOptions;
|
||||
public View mOptions;
|
||||
|
||||
private ScriptFile mScriptFile;
|
||||
|
||||
|
||||
13
app/src/main/res/layout/fragment_sample_list.xml
Normal file
13
app/src/main/res/layout/fragment_sample_list.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.stardust.scriptdroid.ui.main.sample.SampleListView
|
||||
android:id="@+id/sample_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
|
||||
</FrameLayout>
|
||||
@ -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">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
23
app/src/main/res/menu/menu_sample_options.xml
Normal file
23
app/src/main/res/menu/menu_sample_options.xml
Normal file
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item
|
||||
android:id="@+id/run_repeatedly"
|
||||
android:title="@string/text_run_repeatedly"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/floating_edit"
|
||||
android:title="@string/text_floating_edit"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/create_shortcut"
|
||||
android:title="@string/text_send_shortcut"/>
|
||||
<item
|
||||
android:id="@+id/copy_to_my_script"
|
||||
android:title="@string/text_copy_to_my_script"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/reset"
|
||||
android:title="@string/text_reset_to_initial_content"/>
|
||||
|
||||
</menu>
|
||||
@ -275,6 +275,11 @@
|
||||
<string name="text_registering">注册中</string>
|
||||
<string name="text_register_fail">注册失败</string>
|
||||
<string name="text_register_succeed">注册成功</string>
|
||||
<string name="text_sample">示例</string>
|
||||
<string name="text_copy_to_my_script">导入到我的脚本</string>
|
||||
<string name="text_reset_to_initial_content">重置为初始内容</string>
|
||||
<string name="text_reset_fail">重置失败</string>
|
||||
<string name="text_reset_succeed">重置成功</string>
|
||||
|
||||
|
||||
<string-array name="ad_showing_mode_keys">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user