diff --git a/app/release/output.json b/app/release/output.json index b3b1532c..aaa06e73 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":240},"path":"release-3.0.0 Alpha40.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":34},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}] \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/build/AutoJsApkBuilder.java b/app/src/main/java/com/stardust/scriptdroid/autojs/build/AutoJsApkBuilder.java index 470bd398..37e82072 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/build/AutoJsApkBuilder.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/build/AutoJsApkBuilder.java @@ -1,15 +1,14 @@ package com.stardust.scriptdroid.autojs.build; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import com.stardust.autojs.apkbuilder.ApkBuilder; import com.stardust.autojs.apkbuilder.ManifestEditor; import com.stardust.autojs.apkbuilder.util.StreamUtils; +import com.stardust.autojs.project.ProjectConfig; +import com.stardust.pio.PFiles; import com.stardust.scriptdroid.App; -import org.androidannotations.annotations.Click; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -105,10 +104,28 @@ public class AutoJsApkBuilder extends ApkBuilder { } public AutoJsApkBuilder setScriptFile(String path) throws IOException { - replaceFile("assets/script.js", path); + if (PFiles.isDir(path)) { + copyDir("assets/project/", path); + } else { + replaceFile("assets/project/main.js", path); + } return this; } + public void copyDir(String relativePath, String path) throws IOException { + File fromDir = new File(path); + File toDir = new File(this.mWorkspacePath, relativePath); + toDir.mkdir(); + for (File child : fromDir.listFiles()) { + if (child.isFile()) { + StreamUtils.write(new FileInputStream(child), + new FileOutputStream(new File(toDir, child.getName()))); + } else { + copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath()); + } + } + } + @Override public ApkBuilder replaceFile(String relativePath, String newFilePath) throws IOException { StreamUtils.write(new FileInputStream(newFilePath), new FileOutputStream(new File(this.mWorkspacePath, relativePath))); @@ -123,10 +140,42 @@ public class AutoJsApkBuilder extends ApkBuilder { .setVersionCode(config.versionCode) .setPackageName(config.packageName); setArscPackageName(config.packageName); + updateProjectConfig(config); setScriptFile(config.jsPath); return this; } + private void updateProjectConfig(AppConfig config) { + if (!PFiles.isDir(config.jsPath)) { + return; + } + ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.jsPath); + if (projectConfig == null) + projectConfig = new ProjectConfig(); + projectConfig.setName(config.appName) + .setPackageName(config.packageName) + .setVersionCode(config.versionCode) + .setVersionName(config.versionName) + .setMainScriptFile("main.js"); + updateProjectConfigAssets(projectConfig, config.jsPath, config.jsPath); + PFiles.write(ProjectConfig.configFileOfDir(config.jsPath), projectConfig.toJson()); + } + + private void updateProjectConfigAssets(ProjectConfig config, String projectDir, String dir) { + File main = new File(projectDir, config.getMainScriptFile()); + for (File file : new File(dir).listFiles()) { + if (file.isDirectory()) { + updateProjectConfigAssets(config, projectDir, file.getPath()); + continue; + } + if (file.equals(main)) { + continue; + } + String relative = new File(projectDir).toURI().relativize(file.toURI()).getPath(); + config.getAssets().add(relative); + } + } + @Override public AutoJsApkBuilder build() throws IOException { if (mProgressCallback != null) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java index 486ef2ae..200d14d1 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.os.Environment; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.text.TextUtils; @@ -13,6 +14,7 @@ import android.widget.ImageView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.autojs.project.ProjectConfig; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.build.AutoJsApkBuilder; import com.stardust.scriptdroid.build.ApkBuilderPluginHelper; @@ -102,7 +104,6 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog } private void setupWithSourceFile(ScriptFile file) { - mSourcePath.setText(file.getPath()); String dir = file.getParent(); if (dir.startsWith(getFilesDir().getPath())) { dir = StorageFileProvider.DEFAULT_DIRECTORY_PATH; @@ -110,6 +111,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog mOutputPath.setText(dir); mAppName.setText(file.getSimplifiedName()); mPackageName.setText(getString(R.string.format_default_package_name, System.currentTimeMillis())); + setSource(file); } @Override @@ -123,12 +125,25 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog String initialDir = new File(mSourcePath.getText().toString()).getParent(); new FileChooserDialogBuilder(this) .title(R.string.text_source_file_path) - .dir(initialDir == null ? StorageFileProvider.DEFAULT_DIRECTORY_PATH : initialDir) - .justScriptFile() - .singleChoice(file -> mSourcePath.setText(file.getPath())) + .dir(Environment.getExternalStorageDirectory().getPath(), + initialDir == null ? StorageFileProvider.DEFAULT_DIRECTORY_PATH : initialDir) + .singleChoice(this::setSource) .show(); } + private void setSource(File file) { + mSourcePath.setText(file.getPath()); + if (!file.isDirectory()) + return; + ProjectConfig config = ProjectConfig.fromProjectDir(file.getPath()); + if (config == null) + return; + mAppName.setText(config.getName()); + mPackageName.setText(config.getPackageName()); + mVersionCode.setText(String.valueOf(config.getVersionCode())); + mVersionName.setText(config.getVersionName()); + } + @Click(R.id.select_output) void selectOutputDirPath() { @@ -221,6 +236,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog mProgressDialog = new MaterialDialog.Builder(this) .progress(true, 100) .content(R.string.text_on_progress) + .cancelable(false) .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 52f61ebb..e3504671 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 @@ -22,6 +22,8 @@ import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.model.script.Scripts; import com.stardust.scriptdroid.storage.file.StorageFileProvider; +import com.stardust.scriptdroid.ui.build.BuildActivity; +import com.stardust.scriptdroid.ui.build.BuildActivity_; import com.stardust.scriptdroid.ui.common.ScriptLoopDialog; import com.stardust.scriptdroid.ui.common.ScriptOperations; import com.stardust.scriptdroid.ui.viewmodel.ScriptList; @@ -246,6 +248,12 @@ public class ScriptListView extends ThemeColorSwipeRefreshLayout implements Swip .timedTask(mSelectedScriptFile); notifyOperated(); break; + case R.id.action_build_apk: + BuildActivity_.intent(getContext()) + .extra(BuildActivity.EXTRA_SOURCE_FILE, mSelectedScriptFile.getPath()) + .start(); + notifyOperated(); + break; case R.id.action_sort_by_date: sort(ScriptList.SORT_TYPE_DATE, mDirSortMenuShowing); break; diff --git a/app/src/main/res/menu/menu_dir_options.xml b/app/src/main/res/menu/menu_dir_options.xml index d54cfe05..3b388a81 100644 --- a/app/src/main/res/menu/menu_dir_options.xml +++ b/app/src/main/res/menu/menu_dir_options.xml @@ -8,4 +8,8 @@ android:id="@+id/delete" android:title="@string/text_delete"/> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_script_options.xml b/app/src/main/res/menu/menu_script_options.xml index 196c2ba0..ee89dace 100644 --- a/app/src/main/res/menu/menu_script_options.xml +++ b/app/src/main/res/menu/menu_script_options.xml @@ -33,6 +33,10 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5be762a4..41dabb41 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -252,7 +252,7 @@ 构建中 打包中 清理临时文件 - 脚本文件路径 + 脚本文件(夹)路径 搜索 选择图标 添加到安卓7.0 Shortcut diff --git a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java index 4245963a..94498fc8 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java @@ -65,6 +65,8 @@ public interface ScriptEngine { @Override public synchronized void setTag(String key, Object value) { + if(value == null) + return; mTags.put(key, value); } diff --git a/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java b/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java new file mode 100644 index 00000000..e7551ccf --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java @@ -0,0 +1,136 @@ +package com.stardust.autojs.project; + +import android.content.Context; +import android.support.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; +import com.stardust.pio.PFiles; +import com.stardust.pio.UncheckedIOException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by Stardust on 2018/1/24. + */ + +public class ProjectConfig { + + public static final String CONFIG_FILE_NAME = "project.json"; + + private static final Gson GSON = new Gson(); + + @SerializedName("name") + private String mName; + + @SerializedName("versionName") + private String mVersionName; + + @SerializedName("versionCode") + private int mVersionCode; + + @SerializedName("packageName") + private String mPackageName; + + @SerializedName("main") + private String mMainScriptFile; + + @SerializedName("assets") + private List mAssets = new ArrayList<>(); + + public static ProjectConfig fromJson(String json) { + if (json == null) { + return null; + } + return GSON.fromJson(json, ProjectConfig.class); + } + + + public static ProjectConfig fromAssets(Context context, String path) { + try { + return fromJson(PFiles.read(context.getAssets().open(path))); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static ProjectConfig fromFile(String path) { + try { + return fromJson(PFiles.read(path)); + } catch (UncheckedIOException e) { + e.printStackTrace(); + return null; + } + } + + public static ProjectConfig fromProjectDir(String path) { + return fromFile(configFileOfDir(path)); + } + + + public static String configFileOfDir(String projectDir) { + return PFiles.join(projectDir, CONFIG_FILE_NAME); + } + + public String getName() { + return mName; + } + + public ProjectConfig setName(String name) { + mName = name; + return this; + } + + public String getVersionName() { + return mVersionName; + } + + public ProjectConfig setVersionName(String versionName) { + mVersionName = versionName; + return this; + } + + public int getVersionCode() { + return mVersionCode; + } + + public ProjectConfig setVersionCode(int versionCode) { + mVersionCode = versionCode; + return this; + } + + public String getPackageName() { + return mPackageName; + } + + public ProjectConfig setPackageName(String packageName) { + mPackageName = packageName; + return this; + } + + public String getMainScriptFile() { + return mMainScriptFile; + } + + public ProjectConfig setMainScriptFile(String mainScriptFile) { + mMainScriptFile = mainScriptFile; + return this; + } + + public List getAssets() { + return mAssets; + } + + public void setAssets(List assets) { + mAssets = assets; + } + + public String toJson() { + return GSON.toJson(this); + } + +} diff --git a/common/src/main/java/com/stardust/pio/PFiles.java b/common/src/main/java/com/stardust/pio/PFiles.java index fb899ef9..c29c97a5 100644 --- a/common/src/main/java/com/stardust/pio/PFiles.java +++ b/common/src/main/java/com/stardust/pio/PFiles.java @@ -278,6 +278,34 @@ public class PFiles { } } + + public static boolean copyAssetDir(Context context, String assetsDir, String toDir) { + new File(toDir).mkdirs(); + AssetManager manager = context.getAssets(); + try { + String[] list = manager.list(assetsDir); + if (list == null) + return false; + for (String file : list) { + InputStream stream; + try { + stream = manager.open(join(assetsDir, file)); + } catch (IOException e) { + if (!copyAssetDir(context, join(assetsDir, file), join(toDir, file))) { + return false; + } + continue; + } + copyStream(stream, join(toDir, file)); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + + } + public static String renameWithoutExtensionAndReturnNewPath(String path, String newName) { File file = new File(path); File newFile = new File(file.getParent(), newName + "." + getExtension(file.getName())); @@ -431,4 +459,5 @@ public class PFiles { } return path; } + } diff --git a/inrt/src/main/AndroidManifest.xml b/inrt/src/main/AndroidManifest.xml index 4489258a..f5ef2179 100644 --- a/inrt/src/main/AndroidManifest.xml +++ b/inrt/src/main/AndroidManifest.xml @@ -28,7 +28,7 @@ diff --git a/inrt/src/main/assets/project/auto.js.png b/inrt/src/main/assets/project/auto.js.png new file mode 100644 index 00000000..4dcffcd7 Binary files /dev/null and b/inrt/src/main/assets/project/auto.js.png differ diff --git a/inrt/src/main/assets/project/main.js b/inrt/src/main/assets/project/main.js new file mode 100644 index 00000000..988f41e7 --- /dev/null +++ b/inrt/src/main/assets/project/main.js @@ -0,0 +1,32 @@ +"ui"; + +ui.layout( + + + + + + + + + + + + + + + + +