diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index db349d8c..259a89dc 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index 0d7b5a16..41d8fa47 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.autojs.autojs" minSdkVersion 17 targetSdkVersion 23 - versionCode 416 - versionName "4.0.2 Alpha11" + versionCode 420 + versionName "4.0.3 Alpha" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/src/main/java/org/autojs/autojs/autojs/build/AutoJsApkBuilder.java b/app/src/main/java/org/autojs/autojs/autojs/build/AutoJsApkBuilder.java index d541f1f5..7c0b8dd3 100644 --- a/app/src/main/java/org/autojs/autojs/autojs/build/AutoJsApkBuilder.java +++ b/app/src/main/java/org/autojs/autojs/autojs/build/AutoJsApkBuilder.java @@ -1,23 +1,23 @@ package org.autojs.autojs.autojs.build; import android.graphics.Bitmap; -import android.text.TextUtils; +import android.graphics.BitmapFactory; import com.stardust.app.GlobalAppContext; import com.stardust.autojs.apkbuilder.ApkBuilder; import com.stardust.autojs.apkbuilder.ManifestEditor; import com.stardust.autojs.apkbuilder.util.StreamUtils; +import com.stardust.autojs.project.BuildInfo; import com.stardust.autojs.project.ProjectConfig; import com.stardust.pio.PFiles; -import org.autojs.autojs.App; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.concurrent.Callable; /** @@ -42,10 +42,27 @@ public class AutoJsApkBuilder extends ApkBuilder { String appName; String versionName; int versionCode; - String jsPath; + String sourcePath; String packageName; + ArrayList ignoredDirs = new ArrayList<>(); Callable icon; + public static AppConfig fromProjectConfig(String projectDir, ProjectConfig projectConfig) { + return new AppConfig() + .setAppName(projectConfig.getName()) + .ignoreDir(new File(projectDir, projectConfig.getBuildDir())) + .setVersionCode(projectConfig.getVersionCode()) + .setVersionName(projectConfig.getVersionName()) + .setIcon(projectConfig.getIcon()) + .setSourcePath(projectDir); + } + + + public AppConfig ignoreDir(File dir) { + ignoredDirs.add(dir); + return this; + } + public AppConfig setAppName(String appName) { this.appName = appName; return this; @@ -61,8 +78,8 @@ public class AutoJsApkBuilder extends ApkBuilder { return this; } - public AppConfig setJsPath(String jsPath) { - this.jsPath = jsPath; + public AppConfig setSourcePath(String sourcePath) { + this.sourcePath = sourcePath; return this; } @@ -76,6 +93,31 @@ public class AutoJsApkBuilder extends ApkBuilder { this.icon = icon; return this; } + + public AppConfig setIcon(String iconPath) { + this.icon = () -> BitmapFactory.decodeFile(iconPath); + return this; + } + + public String getAppName() { + return appName; + } + + public String getVersionName() { + return versionName; + } + + public int getVersionCode() { + return versionCode; + } + + public String getSourcePath() { + return sourcePath; + } + + public String getPackageName() { + return packageName; + } } private ProgressCallback mProgressCallback; @@ -86,6 +128,7 @@ public class AutoJsApkBuilder extends ApkBuilder { public AutoJsApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) { super(apkInputStream, outApkFile, workspacePath); mWorkspacePath = workspacePath; + PFiles.ensureDir(outApkFile.getPath()); } public AutoJsApkBuilder(File inFile, File outFile, String workspacePath) throws FileNotFoundException { @@ -124,7 +167,9 @@ public class AutoJsApkBuilder extends ApkBuilder { StreamUtils.write(new FileInputStream(child), new FileOutputStream(new File(toDir, child.getName()))); } else { - copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath()); + if (!mAppConfig.ignoredDirs.contains(child)) { + copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath()); + } } } } @@ -144,26 +189,19 @@ public class AutoJsApkBuilder extends ApkBuilder { .setPackageName(config.packageName); setArscPackageName(config.packageName); updateProjectConfig(config); - setScriptFile(config.jsPath); + setScriptFile(config.sourcePath); return this; } private void updateProjectConfig(AppConfig config) { - if (!PFiles.isDir(config.jsPath)) { + if (!PFiles.isDir(config.sourcePath)) { 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); - if (TextUtils.isEmpty(projectConfig.getMainScriptFile())) { - projectConfig.setMainScriptFile("main.js"); - } - updateProjectConfigAssets(projectConfig, config.jsPath, config.jsPath); - PFiles.write(ProjectConfig.configFileOfDir(config.jsPath), projectConfig.toJson()); + ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.sourcePath); + long buildNumber = projectConfig.getBuildInfo().getBuildNumber(); + projectConfig.setBuildInfo(BuildInfo.generate(buildNumber + 1)); + //updateProjectConfigAssets(projectConfig, config.sourcePath, config.sourcePath); + PFiles.write(ProjectConfig.configFileOfDir(config.sourcePath), projectConfig.toJson()); } private void updateProjectConfigAssets(ProjectConfig config, String projectDir, String dir) { @@ -189,8 +227,11 @@ public class AutoJsApkBuilder extends ApkBuilder { mManifestEditor.commit(); if (mAppConfig.icon != null) { try { - mAppConfig.icon.call().compress(Bitmap.CompressFormat.PNG, 100, - new FileOutputStream(new File(mWorkspacePath, "res/mipmap/ic_launcher.png"))); + Bitmap bitmap = mAppConfig.icon.call(); + if (bitmap != null) { + bitmap.compress(Bitmap.CompressFormat.PNG, 100, + new FileOutputStream(new File(mWorkspacePath, "res/mipmap/ic_launcher.png"))); + } } catch (Exception e) { throw new RuntimeException(e); } @@ -203,6 +244,7 @@ public class AutoJsApkBuilder extends ApkBuilder { if (mProgressCallback != null) { GlobalAppContext.post(() -> mProgressCallback.onSign(AutoJsApkBuilder.this)); } + return (AutoJsApkBuilder) super.sign(); } diff --git a/app/src/main/java/org/autojs/autojs/external/ScriptExecutionIntentService.java b/app/src/main/java/org/autojs/autojs/external/ScriptExecutionIntentService.java index a8050ce0..db4fcef5 100644 --- a/app/src/main/java/org/autojs/autojs/external/ScriptExecutionIntentService.java +++ b/app/src/main/java/org/autojs/autojs/external/ScriptExecutionIntentService.java @@ -18,6 +18,10 @@ public class ScriptExecutionIntentService extends IntentService { protected void onHandleIntent(@Nullable Intent intent) { if (intent == null) return; - ScriptIntents.handleIntent(this, intent); + try { + ScriptIntents.handleIntent(this, intent); + }catch (Exception e){ + e.printStackTrace(); + } } } diff --git a/app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java b/app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java index 9ccf6a44..4e6be901 100644 --- a/app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java +++ b/app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; +import android.widget.Toast; import com.stardust.autojs.execution.ExecutionConfig; @@ -37,6 +38,11 @@ public class BootCompleteReceiver extends BroadcastReceiver { ExecutionConfig config = new ExecutionConfig(); config.setArgument("intent", intent.clone()); config.executePath(file.getParent()); - AutoJs.getInstance().getScriptEngineService().execute(file.toSource(), config); + try { + AutoJs.getInstance().getScriptEngineService().execute(file.toSource(), config); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show(); + } } } diff --git a/app/src/main/java/org/autojs/autojs/external/tasker/TaskPrefEditActivity.java b/app/src/main/java/org/autojs/autojs/external/tasker/TaskPrefEditActivity.java index d8d93948..80426dc6 100644 --- a/app/src/main/java/org/autojs/autojs/external/tasker/TaskPrefEditActivity.java +++ b/app/src/main/java/org/autojs/autojs/external/tasker/TaskPrefEditActivity.java @@ -19,7 +19,7 @@ import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.model.explorer.ExplorerDirPage; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.ui.BaseActivity; -import org.autojs.autojs.ui.main.scripts.ExplorerView; +import org.autojs.autojs.ui.explorer.ExplorerView; import static org.autojs.autojs.ui.edit.EditorView.EXTRA_CONTENT; diff --git a/app/src/main/java/org/autojs/autojs/external/widget/ScriptWidgetSettingsActivity.java b/app/src/main/java/org/autojs/autojs/external/widget/ScriptWidgetSettingsActivity.java index 40c05ac2..bd6276cb 100644 --- a/app/src/main/java/org/autojs/autojs/external/widget/ScriptWidgetSettingsActivity.java +++ b/app/src/main/java/org/autojs/autojs/external/widget/ScriptWidgetSettingsActivity.java @@ -16,7 +16,7 @@ import org.autojs.autojs.model.explorer.ExplorerDirPage; import org.autojs.autojs.model.explorer.ExplorerFileProvider; import org.autojs.autojs.model.script.Scripts; import org.autojs.autojs.ui.BaseActivity; -import org.autojs.autojs.ui.main.scripts.ExplorerView; +import org.autojs.autojs.ui.explorer.ExplorerView; /** * Created by Stardust on 2017/7/11. diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerDirPage.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerDirPage.java index 0c2d78af..55c0e552 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerDirPage.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerDirPage.java @@ -42,6 +42,11 @@ public class ExplorerDirPage extends ExplorerFileItem implements ExplorerPage { } } + @Override + public ExplorerFileItem rename(String newName) { + return new ExplorerDirPage(getFile().renameAndReturnNewFile(newName), getParent()); + } + protected int indexOf(ExplorerItem child){ int i = 0; for(ExplorerItem item : mChildren){ diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerFileItem.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerFileItem.java index 9ad49533..443fc7a7 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerFileItem.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerFileItem.java @@ -5,10 +5,17 @@ import com.stardust.pio.PFile; import org.autojs.autojs.model.script.ScriptFile; import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; public class ExplorerFileItem implements ExplorerItem { - private final PFile mFile; + private static final Set sEditableFileExts = new HashSet<>(Arrays.asList( + "js", "java", "xml", "json", "txt", "log", "ts" + )); + + private PFile mFile; private final ExplorerPage mParent; public ExplorerFileItem(PFile file, ExplorerPage parent) { @@ -60,9 +67,13 @@ public class ExplorerFileItem implements ExplorerItem { return mFile.canWrite(); } + public ExplorerFileItem rename(String newName) { + return new ExplorerFileItem(mFile.renameAndReturnNewFile(newName), getParent()); + } + @Override public String getType() { - if(mFile.isDirectory()){ + if (mFile.isDirectory()) { return "/"; } return mFile.getExtension(); @@ -80,8 +91,7 @@ public class ExplorerFileItem implements ExplorerItem { @Override public boolean isEditable() { - String type = getType(); - return !type.equals(TYPE_AUTO_FILE) && !type.equals(TYPE_APK); + return sEditableFileExts.contains(getType()); } @Override diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerProjectPage.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerProjectPage.java index 7c52992b..0a56322e 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerProjectPage.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerProjectPage.java @@ -24,6 +24,12 @@ public class ExplorerProjectPage extends ExplorerDirPage { mProjectConfig = projectConfig; } + public ProjectConfig getProjectConfig() { + return mProjectConfig; + } - + @Override + public ExplorerFileItem rename(String newName) { + return new ExplorerProjectPage(getFile().renameAndReturnNewFile(newName), getParent(), mProjectConfig); + } } 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 af63d857..9a73962e 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 @@ -3,6 +3,7 @@ package org.autojs.autojs.model.script; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; +import android.widget.Toast; import com.stardust.app.GlobalAppContext; import com.stardust.autojs.execution.ExecutionConfig; @@ -96,15 +97,27 @@ public class Scripts { } public static ScriptExecution run(ScriptFile file) { - return AutoJs.getInstance().getScriptEngineService().execute(file.toSource(), new ExecutionConfig() - .executePath(file.getParent())); + try { + return AutoJs.getInstance().getScriptEngineService().execute(file.toSource(), new ExecutionConfig() + .executePath(file.getParent())); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(GlobalAppContext.get(), e.getMessage(), Toast.LENGTH_LONG).show(); + return null; + } } public static ScriptExecution run(ScriptSource source) { - return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() + try { + return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() .executePath(Pref.getScriptDirPath()) .requirePath(Pref.getScriptDirPath())); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(GlobalAppContext.get(), e.getMessage(), Toast.LENGTH_LONG).show(); + return null; + } } public static ScriptExecution runWithBroadcastSender(File file) { diff --git a/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java b/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java index 44427e1d..535d4bbb 100644 --- a/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java +++ b/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java @@ -8,8 +8,10 @@ import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; +import android.text.Editable; import android.text.InputType; import android.view.View; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.Toast; @@ -123,9 +125,46 @@ public class ScriptOperations { mExplorer.notifyItemCreated(new ExplorerFileItem(scriptFile, mExplorerPage)); } - public void newScriptFile() { - showFileNameInputDialog("", "js") - .subscribe(input -> createScriptFile(getCurrentDirectoryPath() + input + ".js", null, true)); + public void newFile() { + DialogUtils.showDialog(new ThemeColorMaterialDialogBuilder(mContext).title(R.string.text_name) + .inputType(InputType.TYPE_CLASS_TEXT) + .alwaysCallInputCallback() + .input(getString(R.string.text_please_input_name), "", false, (dialog, input) -> + validateInput(dialog, dialog.isPromptCheckBoxChecked() ? ".js" : null)) + .checkBoxPromptRes(R.string.text_js_file, true, (buttonView, isChecked) -> { + }) + .onPositive((dialog, which) -> { + boolean createJs = dialog.isPromptCheckBoxChecked(); + assert dialog.getInputEditText() != null; + if (createJs) { + createScriptFile(getCurrentDirectoryPath() + dialog.getInputEditText().getText() + ".js", null, true); + } else { + createScriptFile(getCurrentDirectoryPath() + dialog.getInputEditText().getText(), null, false); + } + }) + .build()); + } + + private void validateInput(MaterialDialog dialog, String extension) { + EditText editText = dialog.getInputEditText(); + if (editText == null) + return; + Editable input = editText.getText(); + int errorResId = 0; + if (input == null || input.length() == 0) { + dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false); + return; + } + if (new File(getCurrentDirectory(), extension == null ? input.toString() : input.toString() + extension).exists()) { + errorResId = R.string.text_file_exists; + } + if (errorResId == 0) { + editText.setError(null); + dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true); + } else { + editText.setError(getString(errorResId)); + dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false); + } } public Observable importFile(final String pathFrom) { @@ -223,23 +262,22 @@ public class ScriptOperations { } } - public Observable rename(final ScriptFile file) { - final ScriptFile oldFile = new ScriptFile(file.getPath()); - String originalName = file.getSimplifiedName(); - return showNameInputDialog(originalName, new InputCallback(file.isDirectory() ? null : PFiles.getExtension(file.getName()), + public Observable rename(final ExplorerFileItem item) { + final ScriptFile oldFile = new ScriptFile(item.getPath()); + String originalName = item.getName(); + return showNameInputDialog(originalName, new InputCallback(oldFile.isDirectory() ? null : PFiles.getExtension(item.getName()), originalName)) .map(newName -> { - PFile newFile = file.renameAndReturnNewFile(newName); - if (newFile != null) { - notifyFileChanged(mCurrentDirectory, oldFile, newFile); + ExplorerFileItem newItem = item.rename(newName); + if (newItem != null) { + notifyFileChanged(mCurrentDirectory, item, newItem); } - return newFile != null; + return newItem != null; }); } - private void notifyFileChanged(ScriptFile directory, ScriptFile oldFile, PFile newFile) { - mExplorer.notifyItemChanged(new ExplorerFileItem(oldFile, mExplorerPage), - new ExplorerFileItem(newFile, mExplorerPage)); + private void notifyFileChanged(ScriptFile directory, ExplorerFileItem oldItem, ExplorerFileItem newItem) { + mExplorer.notifyItemChanged(oldItem, newItem); } public void createShortcut(ScriptFile file) { @@ -353,22 +391,12 @@ public class ScriptOperations { EditText editText = dialog.getInputEditText(); if (editText == null) return; - int errorResId = 0; - if (input == null || input.length() == 0) { - errorResId = R.string.text_name_should_not_be_empty; - } else if (!input.equals(mExcluded)) { - if (new File(getCurrentDirectory(), mExtension == null ? input.toString() : input.toString() + mExtension).exists()) { - errorResId = R.string.text_file_exists; - } - } - if (errorResId == 0) { + if (mExcluded != null && input.equals(mExcluded)) { editText.setError(null); dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true); - } else { - editText.setError(getString(errorResId)); - dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false); + return; } - + validateInput(dialog, mExtension); } } 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 15fededd..2c4eda6b 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_FILE, mEditorView.getFile().getPath()) + .extra(BuildActivity.EXTRA_SOURCE, mEditorView.getFile().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 289a6dde..3ba09bdb 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 @@ -392,6 +392,9 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC Snackbar.make(this, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); } ScriptExecution execution = Scripts.runWithBroadcastSender(mFile); + if(execution == null){ + return null; + } mScriptExecutionId = execution.getId(); setMenuItemStatus(R.id.run, false); return execution; 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 4aadd6e0..a88ebc25 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 @@ -9,6 +9,7 @@ import android.util.Log; import android.view.View; import android.widget.Toast; +import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.rhino.debug.DebugCallback; import com.stardust.autojs.rhino.debug.Debugger; import com.stardust.autojs.rhino.debug.Dim; @@ -77,7 +78,12 @@ public class DebugToolbarFragment extends ToolbarFragment implements DebugCallba mCurrentEditorSourceUrl = mInitialEditorSourceUrl = mEditorView.getFile().toString(); mInitialEditorSource = mEditorView.getEditor().getText(); setupEditor(); - mDebugger.attach(mEditorView.run(false)); + ScriptExecution execution = mEditorView.run(false); + if (execution != null) { + mDebugger.attach(execution); + } else { + mEditorView.exitDebugging(); + } Log.d(LOG_TAG, "onViewCreated"); } diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java new file mode 100644 index 00000000..1a1650e0 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java @@ -0,0 +1,127 @@ +package org.autojs.autojs.ui.explorer; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.support.v7.widget.CardView; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.stardust.autojs.project.ProjectConfig; +import com.stardust.autojs.project.ProjectLauncher; +import com.stardust.pio.PFile; + +import org.androidannotations.annotations.Click; +import org.autojs.autojs.R; +import org.autojs.autojs.autojs.AutoJs; +import org.autojs.autojs.model.explorer.ExplorerChangeEvent; +import org.autojs.autojs.model.explorer.ExplorerItem; +import org.autojs.autojs.model.explorer.Explorers; +import org.autojs.autojs.ui.project.BuildActivity; +import org.autojs.autojs.ui.project.BuildActivity_; +import org.autojs.autojs.ui.project.ProjectConfigActivity; +import org.autojs.autojs.ui.project.ProjectConfigActivity_; +import org.greenrobot.eventbus.Subscribe; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class ExplorerProjectToolbar extends CardView { + + private ProjectConfig mProjectConfig; + private PFile mDirectory; + + @BindView(R.id.project_name) + TextView mProjectName; + + public ExplorerProjectToolbar(Context context) { + super(context); + init(); + } + + public ExplorerProjectToolbar(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + public ExplorerProjectToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + inflate(getContext(), R.layout.explorer_project_toolbar, this); + ButterKnife.bind(this); + setOnClickListener(view -> edit()); + } + + public void setProject(PFile dir, ProjectConfig config) { + mDirectory = dir; + mProjectConfig = config; + mProjectName.setText(config.getName()); + } + + public void refresh() { + if (mDirectory != null) { + setProject(mDirectory, ProjectConfig.fromProjectDir(mDirectory.getPath())); + } + } + + @OnClick(R.id.run) + void run() { + try { + new ProjectLauncher(mDirectory.getPath()) + .launch(AutoJs.getInstance().getScriptEngineService()); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + + @OnClick(R.id.build) + void build() { + BuildActivity_.intent(getContext()) + .extra(BuildActivity.EXTRA_SOURCE, mDirectory.getPath()) + .start(); + } + + @OnClick(R.id.sync) + void sync() { + + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + Explorers.workspace().registerChangeListener(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + Explorers.workspace().unregisterChangeListener(this); + } + + @Subscribe + public void onExplorerChange(ExplorerChangeEvent event) { + if (mDirectory == null) { + return; + } + ExplorerItem item = event.getItem(); + if ((event.getAction() == ExplorerChangeEvent.ALL) + || (item != null && mDirectory.getPath().equals(item.getPath()))) { + refresh(); + } + } + + void edit() { + ProjectConfigActivity_.intent(getContext()) + .extra(ProjectConfigActivity.EXTRA_DIRECTORY, mDirectory.getPath()) + .start(); + } + +} diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.java similarity index 92% rename from app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java rename to app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.java index 88530d9a..f4956775 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.java @@ -1,4 +1,4 @@ -package org.autojs.autojs.ui.main.scripts; +package org.autojs.autojs.ui.explorer; import android.annotation.SuppressLint; import android.content.Context; @@ -6,6 +6,7 @@ import android.graphics.drawable.GradientDrawable; import android.support.annotation.Nullable; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -22,8 +23,10 @@ import com.stardust.pio.PFiles; import org.autojs.autojs.R; import org.autojs.autojs.model.explorer.Explorer; import org.autojs.autojs.model.explorer.ExplorerChangeEvent; +import org.autojs.autojs.model.explorer.ExplorerFileItem; import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.model.explorer.ExplorerPage; +import org.autojs.autojs.model.explorer.ExplorerProjectPage; import org.autojs.autojs.model.explorer.ExplorerSamplePage; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.model.script.Scripts; @@ -31,7 +34,6 @@ import org.autojs.autojs.ui.project.BuildActivity; import org.autojs.autojs.ui.project.BuildActivity_; import org.autojs.autojs.ui.common.ScriptLoopDialog; import org.autojs.autojs.ui.common.ScriptOperations; -import org.autojs.autojs.ui.explorer.ExplorerViewHelper; import org.autojs.autojs.ui.viewmodel.ExplorerItemList; import org.autojs.autojs.ui.widget.BindableViewHolder; import org.autojs.autojs.theme.widget.ThemeColorSwipeRefreshLayout; @@ -73,6 +75,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR private ExplorerItemList mExplorerItemList = new ExplorerItemList(); private RecyclerView mExplorerItemListView; + private ExplorerProjectToolbar mProjectToolbar; private ExplorerAdapter mExplorerAdapter = new ExplorerAdapter(); protected OnItemClickListener mOnItemClickListener; private Function mFilter; @@ -100,14 +103,24 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR public void setRootPage(ExplorerPage page) { mPageStateHistory.clear(); - mCurrentPageState = new ExplorerPageState(page); + setCurrentPageState(new ExplorerPageState(page)); loadItemList(); } + private void setCurrentPageState(ExplorerPageState currentPageState) { + mCurrentPageState = currentPageState; + if (mCurrentPageState.page instanceof ExplorerProjectPage) { + mProjectToolbar.setVisibility(VISIBLE); + mProjectToolbar.setProject(currentPageState.page.toScriptFile(), ((ExplorerProjectPage) currentPageState.page).getProjectConfig()); + } else { + mProjectToolbar.setVisibility(GONE); + } + } public void enterChildPage(ExplorerPage childItemGroup) { + mCurrentPageState.position = ((LinearLayoutManager) mExplorerItemListView.getLayoutManager()).findFirstVisibleItemPosition(); mPageStateHistory.push(mCurrentPageState); - mCurrentPageState = new ExplorerPageState(childItemGroup); + setCurrentPageState(new ExplorerPageState(childItemGroup)); loadItemList(); } @@ -136,7 +149,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR mExplorer.unregisterChangeListener(this); mExplorer = explorer; mPageStateHistory.clear(); - mCurrentPageState = new ExplorerPageState(rootPage); + setCurrentPageState(new ExplorerPageState(rootPage)); mExplorer.registerChangeListener(this); enterChildPage(currentPage); } @@ -150,7 +163,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR } public void goBack() { - mCurrentPageState = mPageStateHistory.pop(); + setCurrentPageState(mPageStateHistory.pop()); loadItemList(); } @@ -169,8 +182,9 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR private void init() { setOnRefreshListener(this); - mExplorerItemListView = new RecyclerView(getContext()); - addView(mExplorerItemListView); + inflate(getContext(), R.layout.explorer_view, this); + mExplorerItemListView = findViewById(R.id.explorer_item_list); + mProjectToolbar = findViewById(R.id.project_toolbar); initExplorerItemListView(); } @@ -215,6 +229,9 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR mExplorerItemList = list; mExplorerAdapter.notifyDataSetChanged(); setRefreshing(false); + post(() -> + mExplorerItemListView.scrollToPosition(mCurrentPageState.position) + ); }); } @@ -229,6 +246,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR @Override public void onRefresh() { mExplorer.notifyChildrenChanged(mCurrentPageState.page); + mProjectToolbar.refresh(); } @@ -241,7 +259,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR switch (item.getItemId()) { case R.id.rename: new ScriptOperations(getContext(), this, getCurrentPage()) - .rename(mSelectedItem.toScriptFile()) + .rename((ExplorerFileItem) mSelectedItem) .subscribe(); break; case R.id.delete: @@ -272,7 +290,7 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR break; case R.id.action_build_apk: BuildActivity_.intent(getContext()) - .extra(BuildActivity.EXTRA_SOURCE_FILE, mSelectedItem.getPath()) + .extra(BuildActivity.EXTRA_SOURCE, mSelectedItem.getPath()) .start(); notifyOperated(); break; @@ -612,6 +630,8 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR boolean filesCollapsed; + int position; + ExplorerPageState() { } diff --git a/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooseListView.java b/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooseListView.java index 8ca094e8..47f1d69d 100644 --- a/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooseListView.java +++ b/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooseListView.java @@ -19,7 +19,7 @@ import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.model.explorer.ExplorerPage; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.ui.explorer.ExplorerViewHelper; -import org.autojs.autojs.ui.main.scripts.ExplorerView; +import org.autojs.autojs.ui.explorer.ExplorerView; import org.autojs.autojs.ui.widget.BindableViewHolder; import org.autojs.autojs.ui.widget.CheckBoxCompat; diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java index 782b155d..aaa95359 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java @@ -30,7 +30,7 @@ import org.autojs.autojs.ui.common.NotAskAgainDialog; import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow; import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow; import org.autojs.autojs.ui.main.MainActivity_; -import org.autojs.autojs.ui.main.scripts.ExplorerView; +import org.autojs.autojs.ui.explorer.ExplorerView; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.util.ClipboardUtil; import com.stardust.util.Func1; diff --git a/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java b/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java index 833a8e10..ede9cc57 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/sample/MarketFragment.java @@ -8,12 +8,11 @@ import android.support.design.widget.FloatingActionButton; import org.autojs.autojs.R; import org.autojs.autojs.ui.main.QueryEvent; import org.autojs.autojs.ui.main.ViewPagerFragment; -import org.autojs.autojs.ui.main.scripts.ExplorerView; + 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; diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java index 8f4c8042..23e04bf4 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MyScriptListFragment.java @@ -7,6 +7,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import com.stardust.util.BackPressedHandler; +import com.stardust.util.IntentUtil; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EFragment; @@ -18,6 +19,7 @@ import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.Scripts; import org.autojs.autojs.tool.SimpleObserver; import org.autojs.autojs.ui.common.ScriptOperations; +import org.autojs.autojs.ui.explorer.ExplorerView; import org.autojs.autojs.ui.main.FloatingActionMenu; import org.autojs.autojs.ui.main.QueryEvent; import org.autojs.autojs.ui.main.ViewPagerFragment; @@ -60,6 +62,8 @@ public class MyScriptListFragment extends ViewPagerFragment implements BackPress mExplorerView.setOnItemClickListener((view, item) -> { if (item.isEditable()) { Scripts.edit(item.toScriptFile()); + } else { + IntentUtil.viewFile(getContext(), item.getPath()); } }); } @@ -174,7 +178,7 @@ public class MyScriptListFragment extends ViewPagerFragment implements BackPress break; case 1: new ScriptOperations(getContext(), mExplorerView, mExplorerView.getCurrentPage()) - .newScriptFile(); + .newFile(); break; case 2: new ScriptOperations(getContext(), mExplorerView, mExplorerView.getCurrentPage()) diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index 6378bfc3..e338bd49 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -10,8 +10,10 @@ import android.os.Environment; import android.support.annotation.Nullable; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; +import android.support.v7.widget.CardView; import android.text.TextUtils; import android.util.Log; +import android.view.View; import android.widget.ImageView; import android.widget.Toast; @@ -50,13 +52,16 @@ import io.reactivex.schedulers.Schedulers; @EActivity(R.layout.activity_build) public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.ProgressCallback { - public static final String EXTRA_SOURCE_FILE = BuildActivity.class.getName() + ".extra_source_file"; + public static final String EXTRA_SOURCE = BuildActivity.class.getName() + ".extra_source_file"; private static final String LOG_TAG = "BuildActivity"; @ViewById(R.id.source_path) TextInputEditText mSourcePath; + @ViewById(R.id.source_path_container) + View mSourcePathContainer; + @ViewById(R.id.output_path) TextInputEditText mOutputPath; @@ -75,7 +80,12 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog @ViewById(R.id.icon) ImageView mIcon; + @ViewById(R.id.app_config) + CardView mAppConfig; + + private ProjectConfig mProjectConfig; private MaterialDialog mProgressDialog; + private String mSource; private boolean mIsDefaultIcon = true; @Override @@ -86,19 +96,13 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog @AfterViews void setupViews() { setToolbarAsBack(getString(R.string.text_build_apk)); - String sourcePath = getIntent().getStringExtra(EXTRA_SOURCE_FILE); - if (sourcePath != null) { - setupWithSourceFile(new ScriptFile(sourcePath)); + mSource = getIntent().getStringExtra(EXTRA_SOURCE); + if (mSource != null) { + setupWithSourceFile(new ScriptFile(mSource)); } - - loadRewardedVideoAd(); checkApkBuilderPlugin(); } - private void loadRewardedVideoAd() { - - } - private void checkApkBuilderPlugin() { if (!ApkBuilderPluginHelper.isPluginAvailable(this)) { showPluginDownloadDialog(R.string.no_apk_builder_plugin, true); @@ -119,7 +123,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog new ThemeColorMaterialDialogBuilder(this) .content(msgRes) .positiveText(R.string.ok) - .negativeText(R.string.text_exit) + .negativeText(R.string.cancel) .onPositive((dialog, which) -> downloadPlugin()) .onNegative((dialog, which) -> { if (finishIfCanceled) finish(); @@ -162,19 +166,19 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog } private void setSource(File file) { - mSourcePath.setText(file.getPath()); - if (!file.isDirectory()) + if (!file.isDirectory()) { + mSourcePath.setText(file.getPath()); return; - ProjectConfig config = ProjectConfig.fromProjectDir(file.getPath()); - if (config == null) + } + mProjectConfig = ProjectConfig.fromProjectDir(file.getPath()); + if (mProjectConfig == null) { return; - mAppName.setText(config.getName()); - mPackageName.setText(config.getPackageName()); - mVersionCode.setText(String.valueOf(config.getVersionCode())); - mVersionName.setText(config.getVersionName()); + } + mOutputPath.setText(new File(mSource, mProjectConfig.getBuildDir()).getPath()); + mAppConfig.setVisibility(View.GONE); + mSourcePathContainer.setVisibility(View.GONE); } - @Click(R.id.select_output) void selectOutputDirPath() { String initialDir = new File(mOutputPath.getText().toString()).exists() ? @@ -218,7 +222,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog } private boolean checkNotEmpty(TextInputEditText editText) { - if (!TextUtils.isEmpty(editText.getText())) + if (!TextUtils.isEmpty(editText.getText()) || !editText.isShown()) return true; // TODO: 2017/12/8 more beautiful ways? String hint = ((TextInputLayout) editText.getParent().getParent()).getHint().toString(); @@ -228,39 +232,47 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog @SuppressLint("CheckResult") private void doBuildingApk() { + AutoJsApkBuilder.AppConfig appConfig = createAppConfig(); + File tmpDir = new File(getCacheDir(), "build/"); + File outApk = new File(mOutputPath.getText().toString(), + String.format("%s_v%s.apk", appConfig.getAppName(), appConfig.getVersionName())); + showProgressDialog(); + Observable.fromCallable(() -> callApkBuilder(tmpDir, outApk, appConfig)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(apkBuilder -> onBuildSuccessful(outApk), + this::onBuildFailed); + } + + private AutoJsApkBuilder.AppConfig createAppConfig() { + if (mProjectConfig != null) { + return AutoJsApkBuilder.AppConfig.fromProjectConfig(mSource, mProjectConfig); + } String jsPath = mSourcePath.getText().toString(); String versionName = mVersionName.getText().toString(); int versionCode = Integer.parseInt(mVersionCode.getText().toString()); String appName = mAppName.getText().toString(); String packageName = mPackageName.getText().toString(); - File tmpDir = new File(getCacheDir(), "build/"); - File outApk = new File(mOutputPath.getText().toString(), - String.format("%s_v%s.apk", appName, versionName)); - showProgressDialog(); - Observable.fromCallable(() -> { - InputStream templateApk = ApkBuilderPluginHelper.openTemplateApk(BuildActivity.this); - return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath()) - .setProgressCallback(BuildActivity.this) - .prepare() - .withConfig(new AutoJsApkBuilder.AppConfig() - .setAppName(appName) - .setJsPath(jsPath) - .setPackageName(packageName) - .setVersionCode(versionCode) - .setVersionName(versionName) - .setIcon(mIsDefaultIcon ? null : (Callable) () -> - BitmapTool.drawableToBitmap(mIcon.getDrawable()) - ) - ) - .build() - .sign() - .cleanWorkspace(); - } - ) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(apkBuilder -> onBuildSuccessful(outApk), - this::onBuildFailed); + return new AutoJsApkBuilder.AppConfig() + .setAppName(appName) + .setSourcePath(jsPath) + .setPackageName(packageName) + .setVersionCode(versionCode) + .setVersionName(versionName) + .setIcon(mIsDefaultIcon ? null : (Callable) () -> + BitmapTool.drawableToBitmap(mIcon.getDrawable()) + ); + } + + private AutoJsApkBuilder callApkBuilder(File tmpDir, File outApk, AutoJsApkBuilder.AppConfig appConfig) throws Exception { + InputStream templateApk = ApkBuilderPluginHelper.openTemplateApk(BuildActivity.this); + return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath()) + .setProgressCallback(BuildActivity.this) + .prepare() + .withConfig(appConfig) + .build() + .sign() + .cleanWorkspace(); } private void showProgressDialog() { diff --git a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java index a8aea754..6351663b 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java @@ -4,12 +4,15 @@ import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TextInputEditText; -import android.text.Editable; +import android.support.design.widget.TextInputLayout; +import android.text.TextUtils; +import android.view.View; import android.widget.EditText; import android.widget.ImageView; +import android.widget.Toast; -import com.stardust.autojs.project.LaunchConfig; import com.stardust.autojs.project.ProjectConfig; +import com.stardust.pio.PFiles; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; @@ -17,13 +20,18 @@ import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; import org.autojs.autojs.R; import org.autojs.autojs.model.explorer.ExplorerDirPage; +import org.autojs.autojs.model.explorer.ExplorerFileItem; +import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.project.ProjectTemplate; import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.widget.SimpleTextWatcher; import java.io.File; -import java.util.concurrent.Executors; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; @EActivity(R.layout.activity_project_config) public class ProjectConfigActivity extends BaseActivity { @@ -75,7 +83,7 @@ public class ProjectConfigActivity extends BaseActivity { mProjectConfig = new ProjectConfig(); } else { String dir = getIntent().getStringExtra(EXTRA_DIRECTORY); - if(dir == null){ + if (dir == null) { finish(); return; } @@ -87,10 +95,18 @@ public class ProjectConfigActivity extends BaseActivity { @AfterViews void setupViews() { setToolbarAsBack(mNewProject ? getString(R.string.text_new_project) : mProjectConfig.getName()); - mAppName.addTextChangedListener(new SimpleTextWatcher(s -> - mProjectLocation.setText(new File(mParentDirectory, s.toString()).getPath())) - ); - + if (mNewProject) { + mAppName.addTextChangedListener(new SimpleTextWatcher(s -> + mProjectLocation.setText(new File(mParentDirectory, s.toString()).getPath())) + ); + } else { + mAppName.setText(mProjectConfig.getName()); + mVersionCode.setText(String.valueOf(mProjectConfig.getVersionCode())); + mPackageName.setText(mProjectConfig.getPackageName()); + mVersionName.setText(mProjectConfig.getVersionName()); + mMainFileName.setText(mProjectConfig.getMainScriptFile()); + mProjectLocation.setVisibility(View.GONE); + } } @SuppressLint("CheckResult") @@ -100,26 +116,60 @@ public class ProjectConfigActivity extends BaseActivity { if (!checkInputs()) { return; } - if(mNewProject){ + if (mNewProject) { String location = mProjectLocation.getText().toString(); new ProjectTemplate(mProjectConfig, new File(location)) .newProject() .subscribe(ignored -> { - Explorers.workspace().notifyItemCreated(new ExplorerDirPage(location, null)); + Explorers.workspace().notifyChildrenChanged(new ExplorerDirPage(mParentDirectory, null)); finish(); + }, e -> { + e.printStackTrace(); + Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } else { + Observable.fromCallable(() -> { + PFiles.write(ProjectConfig.configFileOfDir(mDirectory.getPath()), + mProjectConfig.toJson()); + return Void.TYPE; + }) + .observeOn(Schedulers.io()) + .subscribeOn(AndroidSchedulers.mainThread()) + .subscribe(ignored -> { + ExplorerFileItem item = new ExplorerFileItem(mDirectory, null); + Explorers.workspace().notifyItemChanged(item, item); + finish(); + }, e -> { + e.printStackTrace(); + Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); }); } } - private void syncProjectConfig(){ + private void syncProjectConfig() { mProjectConfig.setName(mAppName.getText().toString()); mProjectConfig.setVersionCode(Integer.parseInt(mVersionCode.getText().toString())); mProjectConfig.setVersionName(mVersionName.getText().toString()); mProjectConfig.setMainScriptFile(mMainFileName.getText().toString()); + mProjectConfig.setPackageName(mPackageName.getText().toString()); //mProjectConfig.getLaunchConfig().setHideLogs(true); } private boolean checkInputs() { - return true; + boolean inputValid = true; + inputValid &= checkNotEmpty(mAppName); + inputValid &= checkNotEmpty(mVersionCode); + inputValid &= checkNotEmpty(mVersionName); + inputValid &= checkNotEmpty(mPackageName); + return inputValid; + } + + private boolean checkNotEmpty(TextInputEditText editText) { + if (!TextUtils.isEmpty(editText.getText())) + return true; + // TODO: 2017/12/8 more beautiful ways? + String hint = ((TextInputLayout) editText.getParent().getParent()).getHint().toString(); + editText.setError(hint + getString(R.string.text_should_not_be_empty)); + return false; } } diff --git a/app/src/main/res/drawable-xhdpi/ic_sync.png b/app/src/main/res/drawable-xhdpi/ic_sync.png new file mode 100644 index 00000000..868aae11 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_sync.png differ diff --git a/app/src/main/res/layout/activity_build.xml b/app/src/main/res/layout/activity_build.xml index 512b25ae..a55797cb 100644 --- a/app/src/main/res/layout/activity_build.xml +++ b/app/src/main/res/layout/activity_build.xml @@ -57,6 +57,7 @@ android:textColor="?android:textColorSecondary"/> @@ -116,6 +117,7 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/layout/explorer_project_toolbar.xml b/app/src/main/res/layout/explorer_project_toolbar.xml new file mode 100644 index 00000000..d479e1af --- /dev/null +++ b/app/src/main/res/layout/explorer_project_toolbar.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/explorer_view.xml b/app/src/main/res/layout/explorer_view.xml new file mode 100644 index 00000000..d0164e3c --- /dev/null +++ b/app/src/main/res/layout/explorer_view.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_my_script_list.xml b/app/src/main/res/layout/fragment_my_script_list.xml index 8e7a418c..c965dadd 100644 --- a/app/src/main/res/layout/fragment_my_script_list.xml +++ b/app/src/main/res/layout/fragment_my_script_list.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/app/src/main/res/menu/menu_dir_options.xml b/app/src/main/res/menu/menu_dir_options.xml index 3b388a81..d54cfe05 100644 --- a/app/src/main/res/menu/menu_dir_options.xml +++ b/app/src/main/res/menu/menu_dir_options.xml @@ -8,8 +8,4 @@ android:id="@+id/delete" android:title="@string/text_delete"/> - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 360d82f4..78f27b1e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -11,4 +11,5 @@ #282C2F #f0f0f0 #ef5350 + #777777 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b4e5e8b..b06d2b6a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -396,4 +396,5 @@ 项目 项目位置 新建项目 + js文件 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f2094787..d20bc30d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -57,4 +57,5 @@