diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index db0c40bc..db349d8c 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8d953578..ef88f4bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,7 +35,7 @@ tools:replace="android:label, android:icon, android:allowBackup"> @@ -96,7 +96,8 @@ android:name=".ui.user.RegisterActivity_" android:windowSoftInputMode="adjustResize"/> - + + diff --git a/app/src/main/java/org/autojs/autojs/build/ApkBuilderPluginHelper.java b/app/src/main/java/org/autojs/autojs/build/ApkBuilderPluginHelper.java index f7e81676..ea11a20b 100644 --- a/app/src/main/java/org/autojs/autojs/build/ApkBuilderPluginHelper.java +++ b/app/src/main/java/org/autojs/autojs/build/ApkBuilderPluginHelper.java @@ -3,11 +3,10 @@ package org.autojs.autojs.build; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.os.Build; import com.stardust.pio.UncheckedIOException; import org.autojs.autojs.BuildConfig; -import org.autojs.autojs.ui.build.BuildActivity; + import com.stardust.util.DeveloperUtils; import java.io.IOException; diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/Explorer.java b/app/src/main/java/org/autojs/autojs/model/explorer/Explorer.java index 4b19386c..0e922610 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/Explorer.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/Explorer.java @@ -84,7 +84,7 @@ public class Explorer { public Single fetchChildren(ExplorerPage page) { - ExplorerPage cachedGroup = mExplorerPageLruCache.get(page.getPath()); + ExplorerPage cachedGroup = mExplorerPageLruCache == null ? null : mExplorerPageLruCache.get(page.getPath()); if (cachedGroup != null) { page.copyChildren(cachedGroup); return Single.just(page); @@ -92,7 +92,8 @@ public class Explorer { return mExplorerProvider.getExplorerPage(page) .observeOn(AndroidSchedulers.mainThread()) .map(g -> { - mExplorerPageLruCache.put(g.getPath(), g); + if (mExplorerPageLruCache != null) + mExplorerPageLruCache.put(g.getPath(), g); page.copyChildren(g); return page; }); diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerChangeEvent.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerChangeEvent.java index cb0ca72c..f2a20b36 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerChangeEvent.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerChangeEvent.java @@ -10,15 +10,15 @@ public class ExplorerChangeEvent { private final int mAction; private final ExplorerItem mItem; private final ExplorerItem mNewItem; - private final ExplorerPage mItemGroup; + private final ExplorerPage mPage; - public ExplorerChangeEvent(ExplorerPage itemGroup) { - this(itemGroup, CHANGE, null, null); + public ExplorerChangeEvent(ExplorerPage page) { + this(page, CHANGE, null, null); } public ExplorerChangeEvent(ExplorerPage parent, int action, ExplorerItem oldItem, ExplorerItem newItem) { mAction = action; - mItemGroup = parent; + mPage = parent; mNewItem = newItem; mItem = oldItem; } @@ -43,7 +43,7 @@ public class ExplorerChangeEvent { return mNewItem; } - public ExplorerPage getItemGroup() { - return mItemGroup; + public ExplorerPage getPage() { + return mPage; } } 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 7348c169..0c2d78af 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,8 +42,19 @@ public class ExplorerDirPage extends ExplorerFileItem implements ExplorerPage { } } + protected int indexOf(ExplorerItem child){ + int i = 0; + for(ExplorerItem item : mChildren){ + if(item.getPath().equals(child.getPath())){ + return i; + } + i++; + } + return -1; + } + public boolean updateChild(ExplorerItem oldItem, ExplorerItem newItem) { - int i = mChildren.indexOf(oldItem); + int i = indexOf(oldItem); if (i < 0) { return false; } @@ -52,7 +63,12 @@ public class ExplorerDirPage extends ExplorerFileItem implements ExplorerPage { } public boolean removeChild(ExplorerItem item) { - return mChildren.remove(item); + int i = indexOf(item); + if(i < 0){ + return false; + } + mChildren.remove(i); + return true; } public void addChild(ExplorerItem item) { 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 f47b03af..9ad49533 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 @@ -1,7 +1,5 @@ package org.autojs.autojs.model.explorer; -import android.graphics.Color; - import com.stardust.pio.PFile; import org.autojs.autojs.model.script.ScriptFile; @@ -52,6 +50,16 @@ public class ExplorerFileItem implements ExplorerItem { return mFile.lastModified(); } + @Override + public boolean canDelete() { + return mFile.canWrite(); + } + + @Override + public boolean canRename() { + return mFile.canWrite(); + } + @Override public String getType() { if(mFile.isDirectory()){ @@ -73,7 +81,7 @@ public class ExplorerFileItem implements ExplorerItem { @Override public boolean isEditable() { String type = getType(); - return type.equals("js") || type.equals("json") || type.equals("xml"); + return !type.equals(TYPE_AUTO_FILE) && !type.equals(TYPE_APK); } @Override diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java index 60507f0f..0f8c6b3e 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java @@ -10,6 +10,7 @@ public interface ExplorerItem { String TYPE_JSON = "json"; String TYPE_XML = "xml"; String TYPE_UNKNOWN = "?"; + String TYPE_APK = "apk"; String getName(); @@ -19,6 +20,10 @@ public interface ExplorerItem { long lastModified(); + boolean canDelete(); + + boolean canRename(); + String getType(); long getSize(); 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 new file mode 100644 index 00000000..7c52992b --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerProjectPage.java @@ -0,0 +1,29 @@ +package org.autojs.autojs.model.explorer; + +import com.stardust.autojs.project.ProjectConfig; +import com.stardust.pio.PFile; + +import java.io.File; + +public class ExplorerProjectPage extends ExplorerDirPage { + + private ProjectConfig mProjectConfig; + + public ExplorerProjectPage(PFile file, ExplorerPage parent, ProjectConfig projectConfig) { + super(file, parent); + mProjectConfig = projectConfig; + } + + public ExplorerProjectPage(String path, ExplorerPage parent, ProjectConfig projectConfig) { + super(path, parent); + mProjectConfig = projectConfig; + } + + public ExplorerProjectPage(File file, ExplorerPage parent, ProjectConfig projectConfig) { + super(file, parent); + mProjectConfig = projectConfig; + } + + + +} diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerSamleItem.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerSamleItem.java new file mode 100644 index 00000000..f469acd9 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerSamleItem.java @@ -0,0 +1,29 @@ +package org.autojs.autojs.model.explorer; + +import com.stardust.pio.PFile; + +import java.io.File; + +public class ExplorerSamleItem extends ExplorerFileItem { + public ExplorerSamleItem(PFile file, ExplorerPage parent) { + super(file, parent); + } + + public ExplorerSamleItem(String path, ExplorerPage parent) { + super(path, parent); + } + + public ExplorerSamleItem(File file, ExplorerPage parent) { + super(file, parent); + } + + @Override + public boolean canDelete() { + return false; + } + + @Override + public boolean canRename() { + return false; + } +} diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/IExplorerPage.java b/app/src/main/java/org/autojs/autojs/model/explorer/IExplorerPage.java deleted file mode 100644 index 116d6cbf..00000000 --- a/app/src/main/java/org/autojs/autojs/model/explorer/IExplorerPage.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.autojs.autojs.model.explorer; - -public interface IExplorerPage { -} diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/WorkspaceFileProvider.java b/app/src/main/java/org/autojs/autojs/model/explorer/WorkspaceFileProvider.java index e5da7ab3..403cad93 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/WorkspaceFileProvider.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/WorkspaceFileProvider.java @@ -3,6 +3,7 @@ package org.autojs.autojs.model.explorer; import android.content.Context; import android.content.res.AssetManager; +import com.stardust.autojs.project.ProjectConfig; import com.stardust.pio.PFile; import com.stardust.pio.PFiles; @@ -38,22 +39,35 @@ public class WorkspaceFileProvider extends ExplorerFileProvider { String path = page.getPath(); return listFiles(new PFile(path)) .collectInto(createExplorerPage(path, parent), (p, file) -> { - if(file.isDirectory()){ - if(file.getPath().startsWith(mSampleDir.getPath())){ + if (file.isDirectory()) { + ProjectConfig projectConfig = ProjectConfig.fromProjectDir(file.getPath()); + if (projectConfig != null) { + p.addChild(new ExplorerProjectPage(file, parent, projectConfig)); + return; + } + if (inSampleDir(file)) { p.addChild(new ExplorerSamplePage(file, p)); - }else { + } else { p.addChild(new ExplorerDirPage(file, p)); } - }else { - p.addChild(new ExplorerFileItem(file, p)); + } else { + if (file.getPath().startsWith(mSampleDir.getPath())) { + p.addChild(new ExplorerSamleItem(file, p)); + } else { + p.addChild(new ExplorerFileItem(file, p)); + } } }) .subscribeOn(Schedulers.io()); } + private boolean inSampleDir(PFile file) { + return file.getPath().startsWith(mSampleDir.getPath()); + } + @Override protected Observable listFiles(PFile directory) { - if (directory.getPath().startsWith(mSampleDir.getPath())) { + if (inSampleDir(directory)) { return listSamples(directory); } return super.listFiles(directory); @@ -61,9 +75,9 @@ public class WorkspaceFileProvider extends ExplorerFileProvider { private Observable listSamples(PFile directory) { String pathOfSample; - if(directory.getPath().length() <= mSampleDir.getPath().length() + 1){ + if (directory.getPath().length() <= mSampleDir.getPath().length() + 1) { pathOfSample = ""; - }else { + } else { pathOfSample = directory.getPath().substring(mSampleDir.getPath().length()); } String pathOfAsset = SAMPLE_PATH + pathOfSample; @@ -71,13 +85,13 @@ public class WorkspaceFileProvider extends ExplorerFileProvider { .flatMap(path -> Observable.fromArray(mAssetManager.list(path))) .map(child -> { PFile file = new PFile(new File(directory, child).getPath()); - if(file.exists()){ - return file; + if (file.exists()) { + return file; } try { InputStream stream = mAssetManager.open(pathOfAsset + "/" + child); PFiles.copyStream(stream, file.getPath()); - }catch (FileNotFoundException e){ + } catch (FileNotFoundException e) { file.mkdirs(); } return file; @@ -88,7 +102,7 @@ public class WorkspaceFileProvider extends ExplorerFileProvider { protected ExplorerDirPage createExplorerPage(String path, ExplorerPage parent) { ExplorerDirPage page = super.createExplorerPage(path, parent); if (new File(path).equals(new File(Pref.getScriptDirPath()))) { - page.addChild( ExplorerSamplePage.createRoot(mSampleDir)); + page.addChild(ExplorerSamplePage.createRoot(mSampleDir)); } return page; } diff --git a/app/src/main/java/org/autojs/autojs/model/project/ProjectTemplate.java b/app/src/main/java/org/autojs/autojs/model/project/ProjectTemplate.java new file mode 100644 index 00000000..ebae7f36 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/model/project/ProjectTemplate.java @@ -0,0 +1,37 @@ +package org.autojs.autojs.model.project; + +import android.annotation.SuppressLint; + +import com.stardust.autojs.project.ProjectConfig; +import com.stardust.pio.PFiles; + +import java.io.File; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class ProjectTemplate { + + + private final ProjectConfig mProjectConfig; + private final File mProjectDir; + + public ProjectTemplate(ProjectConfig projectConfig, File projectDir) { + mProjectConfig = projectConfig; + mProjectDir = projectDir; + } + + @SuppressLint("CheckResult") + public Observable newProject() { + return Observable.fromCallable(() -> { + mProjectDir.mkdirs(); + PFiles.write(ProjectConfig.configFileOfDir(mProjectDir.getPath()), mProjectConfig.toJson()); + new File(mProjectDir, mProjectConfig.getMainScriptFile()).createNewFile(); + return mProjectDir; + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + +} diff --git a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.java b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.java index ec76a8dc..bbc4f9be 100644 --- a/app/src/main/java/org/autojs/autojs/ui/BaseActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/BaseActivity.java @@ -13,6 +13,7 @@ import android.widget.SeekBar; import org.autojs.autojs.R; import org.autojs.autojs.network.VersionService; + import com.stardust.theme.ThemeColorManager; import com.stardust.util.BackPressedHandler; @@ -51,16 +52,19 @@ public abstract class BaseActivity extends AppCompatActivity { return (T) findViewById(resId); } - protected void checkPermission(String... permissions) { + protected boolean checkPermission(String... permissions) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] requestPermissions = getRequestPermissions(permissions); if (requestPermissions.length > 0) { requestPermissions(requestPermissions, PERMISSION_REQUEST_CODE); + return false; } + return true; } else { int[] grantResults = new int[permissions.length]; Arrays.fill(grantResults, PERMISSION_GRANTED); onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults); + return false; } } 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 793dc738..44427e1d 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 @@ -25,8 +25,10 @@ import org.autojs.autojs.Pref; import org.autojs.autojs.R; import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.model.explorer.Explorer; +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.ExplorerPage; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.storage.file.TmpScriptFiles; import org.autojs.autojs.model.sample.SampleFile; @@ -58,7 +60,7 @@ import io.reactivex.subjects.PublishSubject; public class ScriptOperations { private static final String LOG_TAG = "ScriptOperations"; - private final ExplorerItem mExplorerItem; + private final ExplorerPage mExplorerPage; private Context mContext; private View mView; private ScriptFile mCurrentDirectory; @@ -69,15 +71,15 @@ public class ScriptOperations { mView = view; mCurrentDirectory = currentDirectory; mExplorer = Explorers.workspace(); - mExplorerItem = new ExplorerFileItem(currentDirectory, null); + mExplorerPage = new ExplorerDirPage(currentDirectory, null); } - public ScriptOperations(Context context, View view, ExplorerItem item) { + public ScriptOperations(Context context, View view, ExplorerPage page) { mContext = context; mView = view; - mCurrentDirectory = item.toScriptFile(); + mCurrentDirectory = page.toScriptFile(); mExplorer = Explorers.workspace(); - mExplorerItem = item; + mExplorerPage = page; } public ScriptOperations(Context context, View view) { @@ -118,7 +120,7 @@ public class ScriptOperations { } private void notifyFileCreated(ScriptFile directory, ScriptFile scriptFile) { - mExplorer.notifyItemCreated(new ExplorerFileItem(scriptFile, mExplorerItem.getParent())); + mExplorer.notifyItemCreated(new ExplorerFileItem(scriptFile, mExplorerPage)); } public void newScriptFile() { @@ -236,8 +238,8 @@ public class ScriptOperations { } private void notifyFileChanged(ScriptFile directory, ScriptFile oldFile, PFile newFile) { - mExplorer.notifyItemChanged(new ExplorerFileItem(oldFile, mExplorerItem.getParent()), - new ExplorerFileItem(newFile, mExplorerItem.getParent())); + mExplorer.notifyItemChanged(new ExplorerFileItem(oldFile, mExplorerPage), + new ExplorerFileItem(newFile, mExplorerPage)); } public void createShortcut(ScriptFile file) { @@ -270,7 +272,7 @@ public class ScriptOperations { } private void notifyFileRemoved(ScriptFile directory, ScriptFile scriptFile) { - mExplorer.notifyItemRemoved(new ExplorerFileItem(scriptFile, mExplorerItem.getParent())); + mExplorer.notifyItemRemoved(new ExplorerFileItem(scriptFile, mExplorerPage)); } 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 e3390c6a..15fededd 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 @@ -10,14 +10,13 @@ import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.autojs.script.JavaScriptSource; -import com.stardust.autojs.script.ScriptSource; import com.stardust.pio.PFiles; import org.autojs.autojs.R; import org.autojs.autojs.model.indices.AndroidClass; import org.autojs.autojs.model.indices.ClassSearchingItem; -import org.autojs.autojs.ui.build.BuildActivity; -import org.autojs.autojs.ui.build.BuildActivity_; +import org.autojs.autojs.ui.project.BuildActivity; +import org.autojs.autojs.ui.project.BuildActivity_; import org.autojs.autojs.ui.common.NotAskAgainDialog; import org.autojs.autojs.ui.edit.editor.CodeEditor; import org.autojs.autojs.ui.log.LogActivity_; diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerViewHelper.java b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerViewHelper.java index 1b1f11cc..c1719b0b 100644 --- a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerViewHelper.java +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerViewHelper.java @@ -9,6 +9,7 @@ import org.autojs.autojs.R; 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 static android.support.v4.content.ContextCompat.getColor; @@ -62,6 +63,9 @@ public class ExplorerViewHelper { if (page instanceof ExplorerSamplePage) { return R.drawable.ic_sample_dir; } + if(page instanceof ExplorerProjectPage){ + return R.drawable.ic_project; + } return R.drawable.ic_folder_yellow_100px; } } 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 8afb1fd5..8ca094e8 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 @@ -152,7 +152,7 @@ public class FileChooseListView extends ExplorerView { CheckBoxCompat mCheckBox; @BindView(R.id.icon) - ImageView mIcon; + ImageView mIcon; private ExplorerPage mExplorerPage; diff --git a/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java b/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java index 0644083e..e4c746fe 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/FloatingActionMenu.java @@ -34,8 +34,9 @@ public class FloatingActionMenu extends FrameLayout implements View.OnClickListe private static final int[] ICONS = { R.drawable.ic_floating_action_menu_dir, R.drawable.ic_floating_action_menu_file, - R.drawable.ic_floating_action_menu_open}; - private static final int[] LABELS = {R.string.text_directory, R.string.text_file, R.string.text_import}; + R.drawable.ic_floating_action_menu_open, + R.drawable.ic_project}; + private static final int[] LABELS = {R.string.text_directory, R.string.text_file, R.string.text_import, R.string.text_project}; private TextView[] mLabels; private FloatingActionButton[] mFabs; private View[] mFabContainers; diff --git a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java index 3d05c99b..026b77d2 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java @@ -166,7 +166,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega .add(new MyScriptListFragment_(), R.string.text_file) .add(new DocsFragment_(), R.string.text_tutorial) .add(new CommunityFragment_(), R.string.text_community) - .add(new MarketFragment_(), R.string.text_sample) + .add(new MarketFragment_(), R.string.text_market) .add(new TaskManagerFragment_(), R.string.text_manage) .build(); mViewPager.setAdapter(mPagerAdapter); diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java index d79fb1de..86d17104 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerView.java @@ -9,6 +9,7 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; +import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -23,10 +24,11 @@ import org.autojs.autojs.model.explorer.Explorer; import org.autojs.autojs.model.explorer.ExplorerChangeEvent; import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.model.explorer.ExplorerPage; +import org.autojs.autojs.model.explorer.ExplorerSamplePage; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.model.script.Scripts; -import org.autojs.autojs.ui.build.BuildActivity; -import org.autojs.autojs.ui.build.BuildActivity_; +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; @@ -219,7 +221,9 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR @Subscribe public void onExplorerChange(ExplorerChangeEvent event) { if (event.getAction() == ExplorerChangeEvent.ALL - || mCurrentPageState.page.equals(event.getItemGroup())) { + || (event.getAction() == ExplorerChangeEvent.CHANGE && + mCurrentPageState.page.getPath().equals(event.getPage().getPath())) + || (event.getAction() == Explorer)) { loadItemList(); } } @@ -457,6 +461,17 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR mSelectedItem = mExplorerItem; PopupMenu popupMenu = new PopupMenu(getContext(), mOptions); popupMenu.inflate(R.menu.menu_script_options); + Menu menu = popupMenu.getMenu(); + if(!mExplorerItem.isExecutable()){ + menu.removeItem(R.id.run_repeatedly); + menu.removeItem(R.id.more); + } + if(!mExplorerItem.canDelete()){ + menu.removeItem(R.id.delete); + } + if(!mExplorerItem.canRename()){ + menu.removeItem(R.id.rename); + } popupMenu.setOnMenuItemClickListener(ExplorerView.this); popupMenu.show(); } @@ -484,7 +499,9 @@ public class ExplorerView extends ThemeColorSwipeRefreshLayout implements SwipeR public void bind(ExplorerPage data, int position) { mName.setText(ExplorerViewHelper.getDisplayName(data)); mIcon.setImageResource(ExplorerViewHelper.getIcon(data)); + mOptions.setVisibility(data instanceof ExplorerSamplePage ? GONE : VISIBLE); mExplorerPage = data; + } @OnClick(R.id.item) 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 1151fc59..813a3431 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 @@ -21,6 +21,8 @@ import org.autojs.autojs.ui.common.ScriptOperations; import org.autojs.autojs.ui.main.FloatingActionMenu; import org.autojs.autojs.ui.main.QueryEvent; import org.autojs.autojs.ui.main.ViewPagerFragment; +import org.autojs.autojs.ui.project.ProjectConfigActivity; +import org.autojs.autojs.ui.project.ProjectConfigActivity_; import org.autojs.autojs.ui.viewmodel.ExplorerItemList; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -177,6 +179,11 @@ public class MyScriptListFragment extends ViewPagerFragment implements BackPress case 2: new ScriptOperations(getContext(), mExplorerView, mExplorerView.getCurrentPage()) .importFile(); + case 3: + ProjectConfigActivity_.intent(getContext()) + .extra(ProjectConfigActivity.EXTRA_PARENT_DIRECTORY, mExplorerView.getCurrentPage().getPath()) + .extra(ProjectConfigActivity.EXTRA_NEW_PROJECT, true) + .start(); break; } diff --git a/app/src/main/java/org/autojs/autojs/ui/build/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java similarity index 99% rename from app/src/main/java/org/autojs/autojs/ui/build/BuildActivity.java rename to app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index b7039d94..6378bfc3 100644 --- a/app/src/main/java/org/autojs/autojs/ui/build/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -1,4 +1,4 @@ -package org.autojs.autojs.ui.build; +package org.autojs.autojs.ui.project; import android.annotation.SuppressLint; import android.content.Intent; 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 new file mode 100644 index 00000000..a8aea754 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java @@ -0,0 +1,125 @@ +package org.autojs.autojs.ui.project; + +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.widget.EditText; +import android.widget.ImageView; + +import com.stardust.autojs.project.LaunchConfig; +import com.stardust.autojs.project.ProjectConfig; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.Click; +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.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; + +@EActivity(R.layout.activity_project_config) +public class ProjectConfigActivity extends BaseActivity { + + public static final String EXTRA_PARENT_DIRECTORY = "parent_directory"; + + public static final String EXTRA_NEW_PROJECT = "new_project"; + + public static final String EXTRA_DIRECTORY = "directory"; + + + @ViewById(R.id.project_location) + EditText mProjectLocation; + + @ViewById(R.id.app_name) + TextInputEditText mAppName; + + @ViewById(R.id.package_name) + TextInputEditText mPackageName; + + @ViewById(R.id.version_name) + TextInputEditText mVersionName; + + @ViewById(R.id.version_code) + TextInputEditText mVersionCode; + + @ViewById(R.id.main_file_name) + EditText mMainFileName; + + @ViewById(R.id.icon) + ImageView mIcon; + + private File mDirectory; + private File mParentDirectory; + private ProjectConfig mProjectConfig; + private boolean mNewProject; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mNewProject = getIntent().getBooleanExtra(EXTRA_NEW_PROJECT, false); + String parentDirectory = getIntent().getStringExtra(EXTRA_PARENT_DIRECTORY); + if (mNewProject) { + if (parentDirectory == null) { + finish(); + return; + } + mParentDirectory = new File(parentDirectory); + mProjectConfig = new ProjectConfig(); + } else { + String dir = getIntent().getStringExtra(EXTRA_DIRECTORY); + if(dir == null){ + finish(); + return; + } + mDirectory = new File(dir); + mProjectConfig = ProjectConfig.fromProjectDir(dir); + } + } + + @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())) + ); + + } + + @SuppressLint("CheckResult") + @Click(R.id.fab) + void commit() { + syncProjectConfig(); + if (!checkInputs()) { + return; + } + if(mNewProject){ + String location = mProjectLocation.getText().toString(); + new ProjectTemplate(mProjectConfig, new File(location)) + .newProject() + .subscribe(ignored -> { + Explorers.workspace().notifyItemCreated(new ExplorerDirPage(location, null)); + finish(); + }); + } + } + + 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.getLaunchConfig().setHideLogs(true); + } + + private boolean checkInputs() { + return true; + } +} diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java b/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java index 0d1b15b2..bcf4ccbc 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java @@ -8,23 +8,18 @@ import android.preference.PreferenceScreen; import android.support.v4.util.Pair; import android.support.v7.widget.Toolbar; import android.view.View; -import android.widget.Toast; -import org.autojs.autojs.network.VersionService; -import org.autojs.autojs.ui.BaseActivity; -import org.autojs.autojs.ui.error.IssueReporterActivity; -import org.autojs.autojs.ui.splash.SplashActivity; -import org.autojs.autojs.ui.splash.SplashActivity_; -import org.autojs.autojs.ui.update.UpdateCheckDialog; -import com.stardust.theme.preference.ThemeColorPreferenceFragment; -import com.stardust.util.IntentUtil; -import com.stardust.util.MapEntries; -import org.autojs.autojs.R; import com.stardust.theme.app.ColorSelectActivity; +import com.stardust.theme.preference.ThemeColorPreferenceFragment; import com.stardust.theme.util.ListBuilder; +import com.stardust.util.MapEntries; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; +import org.autojs.autojs.R; +import org.autojs.autojs.ui.BaseActivity; +import org.autojs.autojs.ui.error.IssueReporterActivity; +import org.autojs.autojs.ui.update.UpdateCheckDialog; import java.util.ArrayList; import java.util.List; @@ -107,12 +102,6 @@ public class SettingsActivity extends BaseActivity { super.onStart(); ACTION_MAP = new MapEntries() .entry(getString(R.string.text_theme_color), () -> selectThemeColor(getActivity())) - .entry(getString(R.string.show_ad), () -> { - SplashActivity_.intent(getActivity()) - .extra(SplashActivity.NOT_START_MAIN_ACTIVITY, true) - .extra(SplashActivity.FORCE_SHOW_AD, true) - .start(); - }) .entry(getString(R.string.text_check_for_updates), () -> new UpdateCheckDialog(getActivity()) .show()) .entry(getString(R.string.text_issue_report), () -> startActivity(new Intent(getActivity(), IssueReporterActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) diff --git a/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java b/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java index 0b97900d..fc73ba14 100644 --- a/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/splash/SplashActivity.java @@ -1,9 +1,12 @@ package org.autojs.autojs.ui.splash; +import android.Manifest; import android.os.Bundle; import android.os.Handler; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; +import android.view.View; import android.widget.ImageView; import com.xcy8.ads.listener.LoadAdListener; @@ -24,7 +27,6 @@ import java.util.Random; /** * Created by Stardust on 2017/7/7. */ -@EActivity(R.layout.activity_splash) public class SplashActivity extends BaseActivity { public static final String NOT_START_MAIN_ACTIVITY = "notStartMainActivity"; @@ -32,8 +34,6 @@ public class SplashActivity extends BaseActivity { private static final String LOG_TAG = SplashActivity.class.getSimpleName(); - @ViewById(R.id.logo) - ImageView mLogo; private boolean mCanEnterNextActivity = false; private boolean mNotStartMainActivity; @@ -42,7 +42,6 @@ public class SplashActivity extends BaseActivity { private Handler mHandler; - @ViewById(R.id.full_screen_view) FullScreenAdView mFullScreenAdView; @Override @@ -51,17 +50,18 @@ public class SplashActivity extends BaseActivity { mHandler = new Handler(); mNotStartMainActivity = getIntent().getBooleanExtra(NOT_START_MAIN_ACTIVITY, false); boolean forceShowAd = getIntent().getBooleanExtra(FORCE_SHOW_AD, false); + setContentView(R.layout.activity_splash); + mFullScreenAdView = (FullScreenAdView) findViewById(R.id.full_screen_view); if (!forceShowAd && !Pref.shouldShowAd()) { - enterNextActivity(); - return; + mFullScreenAdView.setVisibility(View.INVISIBLE); + mHandler.postDelayed(this::enterNextActivity, 1500); + } else { + if(checkPermission(Manifest.permission.READ_PHONE_STATE)){ + fetchSplashAD(); + } } } - @AfterViews - void afterViews(){ - fetchSplashAD(); - } - void enterNextActivity() { if (mAlreadyEnterNextActivity) return; @@ -91,6 +91,12 @@ public class SplashActivity extends BaseActivity { mCanEnterNextActivity = true; } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + fetchSplashAD(); + } + private void fetchSplashAD() { mAdLoading = true; mFullScreenAdView.setFullScreenListener(this::enterNextActivity); diff --git a/app/src/main/res/drawable/ic_project.png b/app/src/main/res/drawable/ic_project.png new file mode 100644 index 00000000..5f71d5ae Binary files /dev/null and b/app/src/main/res/drawable/ic_project.png differ diff --git a/app/src/main/res/layout/activity_project_config.xml b/app/src/main/res/layout/activity_project_config.xml new file mode 100644 index 00000000..80f0990e --- /dev/null +++ b/app/src/main/res/layout/activity_project_config.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/file_choose_list_directory.xml b/app/src/main/res/layout/file_choose_list_directory.xml index 935b7220..0d3a9855 100644 --- a/app/src/main/res/layout/file_choose_list_directory.xml +++ b/app/src/main/res/layout/file_choose_list_directory.xml @@ -29,6 +29,7 @@ android:gravity="center"/> - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 591fcd0f..2b4e5e8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -389,4 +389,11 @@ import key_ad_type 广告类型设置 + 市场 + 运行配置 + 主脚本名称 + main.js + 项目 + 项目位置 + 新建项目 diff --git a/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java b/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java index c5731e30..fd13ce93 100644 --- a/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java +++ b/autojs/src/main/java/com/stardust/autojs/project/ProjectConfig.java @@ -4,6 +4,7 @@ import android.content.Context; import android.support.annotation.NonNull; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; import com.stardust.pio.PFiles; import com.stardust.pio.UncheckedIOException; @@ -22,7 +23,7 @@ public class ProjectConfig { public static final String CONFIG_FILE_NAME = "project.json"; - private static final Gson GSON = new Gson(); + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @SerializedName("name") private String mName;