This commit is contained in:
Akash Yadav
2021-11-01 15:03:52 +05:30
parent b4768b8dc9
commit 9df38ac9c4
20 changed files with 154 additions and 226 deletions
@@ -1154,7 +1154,11 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
getBuildService().setListener(null);
getBuildService().exit();
}
// Make sure we close files
// This fill further make sure that file contents are not erased.
closeAll();
getApp().getPrefManager().setOpenedProject(PreferenceManager.NO_OPENED_PROJECT);
LSP.shutdownAll();
@@ -8,12 +8,16 @@ import com.itsaky.androidide.models.project.IDEModule;
import com.itsaky.androidide.models.project.IDEProject;
import com.itsaky.androidide.services.IDEService;
import com.itsaky.androidide.tasks.GradleTask;
import com.itsaky.androidide.tasks.gradle.build.ApkGeneratingTask;
import com.itsaky.androidide.utils.Environment;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Collection;
public class BuildServiceHandler extends IDEHandler implements IDEService.BuildListener {
@@ -92,14 +96,19 @@ public class BuildServiceHandler extends IDEHandler implements IDEService.BuildL
@Override
public void onBuildSuccessful(GradleTask task, String msg) {
if(task == null) return;
if(task == null || activity() == null) return;
if(task.canOutput())
activity().setStatus(msg);
if(task.getType() == GradleTask.Type.BUILD) {
if(task.getTaskID() == IDEService.TASK_ASSEMBLE_DEBUG) {
if(task.buildsApk()) {
activity().install(task.getApk(new File(provider.provideAndroidProject().getMainModulePath(), "build").getAbsolutePath(), provider.provideAndroidProject().getMainModule()));
// If this task generates APK, ask user if he/she wants to install them
if (task instanceof ApkGeneratingTask) {
final IDEProject project = activity().provideIDEProject();
final Optional<IDEModule> app = project.getModuleByPath(":app"); // TODO Handle multiple application modules
if(app.isPresent()) {
final String path = app.get().projectDir;
if(path != null) {
final File buildDir = new File (path, "build");
installApks (((ApkGeneratingTask) task).getApks(buildDir));
}
}
}
@@ -115,7 +124,7 @@ public class BuildServiceHandler extends IDEHandler implements IDEService.BuildL
if(task.canOutput()) {
activity().setStatus(msg);
}
activity().getApp().getPrefManager().putBoolean(PreferenceManager.KEY_IS_FIRST_PROJECT_BUILD, false);
activity().invalidateOptionsMenu();
activity().getBinding().buildProgressIndicator.setVisibility(View.GONE);
@@ -157,4 +166,35 @@ public class BuildServiceHandler extends IDEHandler implements IDEService.BuildL
*/
&& !file.getAbsolutePath().endsWith("/release/R.jar");
}
private void installApks (final Set<File> apks) {
if (activity () == null || apks == null || apks.isEmpty()) {
return;
}
if(apks.size() == 1) {
activity().install(apks.iterator().next());
} else {
final List<File> files = new ArrayList<File> (apks);
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
builder.setTitle(activity().getString(R.string.title_install_apks));
builder.setItems(getNames(files), (d, w) -> {
d.dismiss();
activity().install(files.get(w));
});
builder.show();
}
}
private CharSequence[] getNames (final Collection<File> apks) {
final String[] names = new String[apks.size()];
int i = 0;
for (File apk : apks) {
names[i] = apk.getName();
++i;
}
return names;
}
}
@@ -73,6 +73,8 @@ public class ApkMetadata {
public static class ArtifactType {
public static String TYPE_APK = "APK";
@SerializedName("type")
private String type;
@@ -12,8 +12,6 @@ public interface GradleTask {
public boolean affectsGeneratedSources();
public boolean shouldSaveFiles();
public boolean canOutput();
public boolean buildsApk();
public File getApk(String buildFolder, String moduleName);
public Type getType();
public static enum Type {
@@ -7,8 +7,11 @@ import com.itsaky.androidide.tasks.BaseGradleTask;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.Collections;
import java.util.HashSet;
public class AssembleDebug extends BaseGradleTask {
public class AssembleDebug extends ApkGeneratingTask {
private boolean installApk = true;
@@ -22,15 +25,12 @@ public class AssembleDebug extends BaseGradleTask {
return StudioApp.getInstance().getString(R.string.build_debug);
}
@Override
public boolean buildsApk() {
return installApk;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return new File(buildFolder, "outputs/apk/debug/" + moduleName + "-debug.apk");
}
@Override
protected Set<File> provideApkDirectories(File buildDir) {
final Set<File> dirs = new HashSet<>();
dirs.add(new File(buildDir, "outputs/apk/debug"));
return dirs;
}
@Override
public String getCommands() {
@@ -3,13 +3,14 @@ package com.itsaky.androidide.tasks.gradle.build;
import com.itsaky.androidide.R;
import com.itsaky.androidide.app.StudioApp;
import com.itsaky.androidide.services.IDEService;
import com.itsaky.androidide.tasks.BaseGradleTask;
import com.itsaky.androidide.tasks.GradleTask;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AssembleRelease extends BaseGradleTask {
public class AssembleRelease extends ApkGeneratingTask {
@Override
public String getName() {
@@ -17,14 +18,11 @@ public class AssembleRelease extends BaseGradleTask {
}
@Override
public boolean buildsApk() {
return true;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return new File(buildFolder, "outputs/apk/release/" + moduleName + "-release.apk");
}
protected Set<File> provideApkDirectories(File buildDir) {
final Set<File> dirs = new HashSet<>();
dirs.add(new File(buildDir, "outputs/apk/release"));
return dirs;
}
@Override
@@ -3,13 +3,14 @@ package com.itsaky.androidide.tasks.gradle.build;
import com.itsaky.androidide.R;
import com.itsaky.androidide.app.StudioApp;
import com.itsaky.androidide.services.IDEService;
import com.itsaky.androidide.tasks.BaseGradleTask;
import com.itsaky.androidide.tasks.GradleTask;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Build extends BaseGradleTask {
public class Build extends ApkGeneratingTask {
@Override
public String getName() {
@@ -17,16 +18,13 @@ public class Build extends BaseGradleTask {
}
@Override
public boolean buildsApk() {
return true;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return new File(buildFolder, "outputs/apk/debug/" + moduleName + "-debug.apk");
}
protected Set<File> provideApkDirectories(File buildDir) {
final Set<File> dirs = new HashSet<>();
dirs.add(new File(buildDir, "outputs/apk/debug"));
dirs.add(new File(buildDir, "outputs/apk/release"));
return dirs;
}
@Override
public String getCommands() {
return "build";
@@ -15,18 +15,7 @@ public class Bundle extends BaseGradleTask {
public String getName() {
return StudioApp.getInstance().getString(R.string.create_aab);
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public String getCommands() {
return "bundle";
@@ -15,17 +15,7 @@ public class Clean extends BaseGradleTask {
public String getName() {
return StudioApp.getInstance().getString(R.string.clean_project);
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public String getCommands() {
return "clean";
@@ -15,18 +15,7 @@ public class CleanBuild extends BaseGradleTask {
public String getName() {
return StudioApp.getInstance().getString(R.string.clean_amp_build);
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public String getCommands() {
return "clean build";
@@ -35,16 +35,6 @@ public class Lint extends BaseGradleTask {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public Type getType() {
return Type.LINT;
@@ -35,16 +35,6 @@ public class LintDebug extends BaseGradleTask {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public Type getType() {
return Type.LINT;
@@ -34,17 +34,7 @@ public class LintRelease extends BaseGradleTask {
public boolean canOutput() {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public Type getType() {
return Type.LINT;
@@ -33,16 +33,6 @@ public class InitializeIDEProject extends BaseGradleTask {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public GradleTask.Type getType() {
return Type.ANDROIDIDE_PLUGIN;
@@ -36,17 +36,7 @@ public class DatabindingGenBaseClassesDebug extends BaseGradleTask {
public boolean canOutput() {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public Type getType() {
return Type.BUILD;
@@ -37,17 +37,7 @@ public class ProcessDebugResources extends BaseGradleTask {
public boolean canOutput() {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public GradleTask.Type getType() {
return Type.BUILD;
@@ -54,17 +54,7 @@ public class UpdateResourceClassesTask extends BaseGradleTask {
public boolean canOutput() {
return true;
}
@Override
public boolean buildsApk() {
return false;
}
@Override
public File getApk(String buildFolder, String moduleName) {
return null;
}
@Override
public GradleTask.Type getType() {
return Type.BUILD;
@@ -15,169 +15,158 @@ import androidx.core.content.ContextCompat;
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
import com.itsaky.androidide.R;
import com.itsaky.androidide.databinding.LayoutToastBinding;
import android.os.Looper;
import com.blankj.utilcode.util.ThreadUtils;
public class Toaster
{
public class Toaster {
private LayoutToastBinding binding;
private Toast mToast;
private Context mContext;
private Gravity mGravity;
private Type mType;
private Drawable mDrawable;
private AnimatedVectorDrawableCompat mIcon;
private int mIconColor = Color.DKGRAY;
private int mDuration = 0;
public static final int COLOR_SUCCESS = Color.parseColor("#4CAF50");
public static final int COLOR_ERROR = Color.parseColor("#F44336");
public static final int REVEAL_ANIM_DURATION = 500;
public static final int SHORT = 2000;
public static final int LONG = 3500;
public Toaster(Context context)
{
public Toaster(Context context) {
this.mContext = context;
this.mType = Type.INFO;
this.mDrawable = createBackgroundDrawable();
createView();
}
protected View createView()
{
protected View createView() {
binding = LayoutToastBinding.inflate(LayoutInflater.from(mContext));
binding.toastToastWrapper.setToasterInstance(this);
return binding.getRoot();
}
protected Drawable createBackgroundDrawable()
{
protected Drawable createBackgroundDrawable() {
GradientDrawable drawable = new GradientDrawable();
drawable.setShape(GradientDrawable.RECTANGLE);
drawable.setColor(ContextCompat.getColor(mContext, R.color.color_toast_background));
drawable.setCornerRadius(25);
return drawable;
}
protected AnimatedVectorDrawableCompat createToastIconAnimation(int tintColor)
{
protected AnimatedVectorDrawableCompat createToastIconAnimation(int tintColor) {
AnimatedVectorDrawableCompat imageDrawable = AnimatedVectorDrawableCompat.create(mContext, mType == Type.SUCCESS ? R.drawable.ic_ok : R.drawable.ic_error);
imageDrawable.setTint(tintColor);
imageDrawable.setTintMode(PorterDuff.Mode.SRC_ATOP);
binding.toastImage.setImageDrawable(imageDrawable);
return imageDrawable;
}
public void show()
{
public void show() {
ThreadUtils.runOnUiThread(() -> {
showInternal();
});
}
protected void showInternal() {
int dp16 = toPx(16);
mIconColor = mType == Type.SUCCESS ? COLOR_SUCCESS :
mType == Type.ERROR ? COLOR_ERROR :
Color.DKGRAY;
int gravity = mGravity == Gravity.TOP_LEFT ? (android.view.Gravity.TOP|android.view.Gravity.START) :
mGravity == Gravity.TOP_RIGHT ? (android.view.Gravity.TOP|android.view.Gravity.END) :
mGravity == Gravity.BOTTOM_RIGHT ? (android.view.Gravity.BOTTOM|android.view.Gravity.END) :
mGravity == Gravity.BOTTOM_LEFT ? (android.view.Gravity.BOTTOM|android.view.Gravity.START) :
android.view.Gravity.TOP|android.view.Gravity.END;
mType == Type.ERROR ? COLOR_ERROR :
Color.DKGRAY;
int gravity = mGravity == Gravity.TOP_LEFT ? (android.view.Gravity.TOP | android.view.Gravity.START) :
mGravity == Gravity.TOP_RIGHT ? (android.view.Gravity.TOP | android.view.Gravity.END) :
mGravity == Gravity.BOTTOM_RIGHT ? (android.view.Gravity.BOTTOM | android.view.Gravity.END) :
mGravity == Gravity.BOTTOM_LEFT ? (android.view.Gravity.BOTTOM | android.view.Gravity.START) :
android.view.Gravity.TOP | android.view.Gravity.END;
mIcon = createToastIconAnimation(mIconColor);
mToast = Toast.makeText(mContext, binding.toastText.getText(), mDuration);
mToast.setGravity(gravity, dp16, dp16);
mToast.setDuration(mDuration);
mToast.setView(binding.getRoot());
mToast.show();
binding.toastImage.setImageDrawable(mIcon);
mIcon.start();
}
public Toaster setText(String text)
{
if(binding.toastText == null)
public Toaster setText(String text) {
if (binding.toastText == null)
createView();
binding.toastText.setText(text);
return this;
}
public Toaster setText(int textResId)
{
if(binding.toastText == null)
public Toaster setText(int textResId) {
if (binding.toastText == null)
createView();
binding.toastText.setText(textResId);
return this;
}
public Toaster setDuration(int mDuration)
{
public Toaster setDuration(int mDuration) {
this.mDuration = mDuration + REVEAL_ANIM_DURATION;
return this;
}
public int getDuration()
{
public int getDuration() {
return mDuration;
}
public Toaster setType(Type type)
{
public Toaster setType(Type type) {
this.mType = type;
return this;
}
public Type getType()
{
public Type getType() {
return mType;
}
public Toaster setGravity(Gravity mGravity)
{
public Toaster setGravity(Gravity mGravity) {
this.mGravity = mGravity;
return this;
}
private int toPx(int dp)
{
private int toPx(int dp) {
return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, mContext.getResources().getDisplayMetrics()));
}
public Gravity getGravity()
{
public Gravity getGravity() {
return mGravity;
}
public AnimatedVectorDrawableCompat getIcon()
{
public AnimatedVectorDrawableCompat getIcon() {
return mIcon;
}
public Drawable getBackroundDrawable()
{
public Drawable getBackroundDrawable() {
return mDrawable;
}
public int getIconColor()
{
public int getIconColor() {
return mIconColor;
}
public enum Type
{
public enum Type {
ERROR,
SUCCESS,
INFO
}
public enum Gravity
{
}
public enum Gravity {
TOP_LEFT,
TOP_RIGHT,
BOTTOM_LEFT,
BOTTOM_RIGHT
}
}
}
+1
View File
@@ -1,4 +1,5 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="title_install_apks">Install APK(s)</string>
<string name="title_clear_output">Clear output</string>
<string name="msg_gradlew_installation_failed">Failed to install Gradle Wrapper: %s</string>
<string name="msg_installing_gradlew">Gradle Wrapper is not available!\nInstalling default one. Gradle v7.1.1 will be downloaded if necessary.</string>
+1 -1
View File
@@ -11,7 +11,7 @@ buildscript {
javaSourceVersion = JavaVersion.VERSION_1_8
javaTargetVersion = JavaVersion.VERSION_1_8
stringfogEnabled = true
stringfogEnabled = false
}
repositories {