From b69fa9d40116d151b8fa68d834d14406f6427304 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Wed, 25 Aug 2021 21:07:19 +0530 Subject: [PATCH] Fixed some minor bugs - Backup before implementing terminal - Fixed shebang issue in Gradle executable - Clean all binary files in JDK (earlier it only cleaned binaries in bin directory) - If the CodeEditor is not editable, do not show cut and paste options in text action mode - Some more changes --- .../itsaky/androidide/DownloadActivity.java | 4 +- .../com/itsaky/androidide/MainActivity.java | 1 + .../com/itsaky/androidide/app/StudioApp.java | 8 ++- .../preferences/BuildPreferences.java | 17 +++--- .../fragments/sheets/TextSheetFragment.java | 2 +- .../androidide/managers/ToolsManager.java | 2 +- .../itsaky/androidide/shell/ShellServer.java | 27 +++++---- .../itsaky/androidide/utils/Environment.java | 4 +- .../com/itsaky/androidide/views/Editor.java | 6 +- .../rosemoe/editor/widget/CodeEditor.java | 2 +- .../widget/EditorTextActionModeStarter.java | 16 ++++-- .../jniLibs/arm64-v8a/libiiec-androidterm5.so | Bin 0 -> 9680 bytes .../jniLibs/arm64-v8a/libiiec-termexec2.so | Bin 0 -> 9608 bytes app/src/main/res/drawable/ic_terminal.xml | 11 ++++ app/src/main/res/drawable/ic_update.xml | 11 ++++ .../main/res/layout/layout_install_tools.xml | 53 ++++++++++++++++++ app/src/main/res/values/strings.xml | 12 +++- 17 files changed, 135 insertions(+), 41 deletions(-) create mode 100644 app/src/main/jniLibs/arm64-v8a/libiiec-androidterm5.so create mode 100644 app/src/main/jniLibs/arm64-v8a/libiiec-termexec2.so create mode 100644 app/src/main/res/drawable/ic_terminal.xml create mode 100644 app/src/main/res/drawable/ic_update.xml create mode 100644 app/src/main/res/layout/layout_install_tools.xml diff --git a/app/src/main/java/com/itsaky/androidide/DownloadActivity.java b/app/src/main/java/com/itsaky/androidide/DownloadActivity.java index 5bc505539..82828f9e2 100644 --- a/app/src/main/java/com/itsaky/androidide/DownloadActivity.java +++ b/app/src/main/java/com/itsaky/androidide/DownloadActivity.java @@ -102,7 +102,7 @@ public class DownloadActivity extends StudioActivity { } } sb.append("rm -rf '" + getApp().getToolsDownloadDirectory().getAbsolutePath() + "' && "); - sb.append("echo 'Cleaning unsupported flags in binaries...' && $BUSYBOX find $JAVA_HOME/bin -type f -exec androidide-cleaner {} \\; && "); + sb.append("echo 'Cleaning unsupported flags in binaries...' && $BUSYBOX find $JAVA_HOME -type f -exec androidide-cleaner {} \\; && "); sb.append("echo " + DONE); server.bgAppend(sb.toString()); } @@ -115,6 +115,8 @@ public class DownloadActivity extends StudioActivity { if(line.contains(DONE)) { getApp().getPrefManager().putBoolean(PreferenceManager.KEY_FRAMEWORK_INSTALLED, true); showRestartNeeded(); + if(getProgressSheet().isShowing()) + getProgressSheet().dismiss(); } }); } diff --git a/app/src/main/java/com/itsaky/androidide/MainActivity.java b/app/src/main/java/com/itsaky/androidide/MainActivity.java index f2ae98f3d..dd60d28e3 100644 --- a/app/src/main/java/com/itsaky/androidide/MainActivity.java +++ b/app/src/main/java/com/itsaky/androidide/MainActivity.java @@ -232,6 +232,7 @@ public class MainActivity extends StudioActivity implements View.OnClickListener private void createProgressSheet() { mProgressSheet = new ProgressSheet(); + mProgressSheet.setShowShadow(false); } private void setMessage(int msg) { diff --git a/app/src/main/java/com/itsaky/androidide/app/StudioApp.java b/app/src/main/java/com/itsaky/androidide/app/StudioApp.java index d665270a5..8a069cff3 100644 --- a/app/src/main/java/com/itsaky/androidide/app/StudioApp.java +++ b/app/src/main/java/com/itsaky/androidide/app/StudioApp.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import com.blankj.utilcode.util.FileUtils; public class StudioApp extends MultiDexApplication { @@ -364,8 +365,11 @@ public class StudioApp extends MultiDexApplication File gradle = new File(Environment.GRADLE_DIR, "bin/gradle"); if(gradle.exists()) { String[] txt = FileUtil.readFile(gradle.getAbsolutePath()).split("\n"); - if(txt != null && txt.length > 1 && txt[0].contains("#!/usr/bin/env sh")) { - txt[0] = ""; + if(txt != null && txt.length > 1) { + String line1 = txt[0]; + if(line1.startsWith("#!")) { + txt[0] = ""; + } FileUtil.writeFile(gradle.getAbsolutePath(), TextUtils.join("\n", txt)); if(!gradle.canExecute()) gradle.setExecutable(true); diff --git a/app/src/main/java/com/itsaky/androidide/fragments/preferences/BuildPreferences.java b/app/src/main/java/com/itsaky/androidide/fragments/preferences/BuildPreferences.java index eca3dcba5..17407a62e 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/preferences/BuildPreferences.java +++ b/app/src/main/java/com/itsaky/androidide/fragments/preferences/BuildPreferences.java @@ -1,26 +1,25 @@ package com.itsaky.androidide.fragments.preferences; -import android.content.DialogInterface; import android.os.Bundle; -import android.view.LayoutInflater; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.blankj.utilcode.util.FileUtils; -import com.blankj.utilcode.util.ZipUtils; +import com.blankj.utilcode.util.ThreadUtils; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.itsaky.androidide.R; import com.itsaky.androidide.app.StudioApp; -import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding; +import com.itsaky.androidide.databinding.LayoutInstallToolsBinding; import com.itsaky.androidide.fragments.sheets.ProgressSheet; +import com.itsaky.androidide.fragments.sheets.TextSheetFragment; +import com.itsaky.androidide.shell.ShellServer; import com.itsaky.androidide.tasks.TaskExecutor; import com.itsaky.androidide.utils.Environment; import com.itsaky.toaster.Toaster; import java.io.File; -import java.util.List; -import java.util.Set; import static com.itsaky.androidide.managers.PreferenceManager.*; +import com.itsaky.androidide.utils.Logger; public class BuildPreferences extends BasePreferenceFragment implements Preference.OnPreferenceClickListener { @@ -53,7 +52,7 @@ public class BuildPreferences extends BasePreferenceFragment implements Preferen categoryGradle.setTitle(R.string.gradle); categoryGradle.addPreference(customCommands); categoryGradle.addPreference(clearCache); - + setPreferenceScreen(screen); customCommands.setOnPreferenceClickListener(this); @@ -70,7 +69,7 @@ public class BuildPreferences extends BasePreferenceFragment implements Preferen } return true; } - + private void showGradleCommandsDialog() { final String[] labels = { "--stacktrace", @@ -125,7 +124,7 @@ public class BuildPreferences extends BasePreferenceFragment implements Preferen } private Object deleteCaches() { - File file = new File(Environment.HOME, ".gradle/caches"); + File file = new File(Environment.GRADLE_USER_HOME, "caches"); if(file.exists()) { FileUtils.delete(file); } diff --git a/app/src/main/java/com/itsaky/androidide/fragments/sheets/TextSheetFragment.java b/app/src/main/java/com/itsaky/androidide/fragments/sheets/TextSheetFragment.java index 67694f66d..00fe79c09 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/sheets/TextSheetFragment.java +++ b/app/src/main/java/com/itsaky/androidide/fragments/sheets/TextSheetFragment.java @@ -45,7 +45,7 @@ public class TextSheetFragment extends BaseBottomSheetFragment { protected void onShow() { super.onShow(); editor.setText(getOutputBuilder()); - } + } private Void scrollToBottom() { if(getActivity() != null) diff --git a/app/src/main/java/com/itsaky/androidide/managers/ToolsManager.java b/app/src/main/java/com/itsaky/androidide/managers/ToolsManager.java index 392eb051a..3365083f0 100644 --- a/app/src/main/java/com/itsaky/androidide/managers/ToolsManager.java +++ b/app/src/main/java/com/itsaky/androidide/managers/ToolsManager.java @@ -39,7 +39,7 @@ public class ToolsManager { if(onFinish != null) onFinish.run(); } - + private static void writeInitScript(StudioApp app) { FileIOUtils.writeFileFromString(Environment.INIT_SCRIPT, INIT_SCRIPT); } diff --git a/app/src/main/java/com/itsaky/androidide/shell/ShellServer.java b/app/src/main/java/com/itsaky/androidide/shell/ShellServer.java index f5cb9e0a8..28ad94e06 100644 --- a/app/src/main/java/com/itsaky/androidide/shell/ShellServer.java +++ b/app/src/main/java/com/itsaky/androidide/shell/ShellServer.java @@ -38,34 +38,33 @@ public class ShellServer extends Thread { stringBuilder.append("\nexport ANDROID_HOME=" + Environment.path(Environment.ANDROID_HOME)); stringBuilder.append("\nexport GRADLE_INSTALLATION_DIR=" + Environment.path(Environment.GRADLE_DIR)); stringBuilder.append("\nexport GRADLE_USER_HOME=" + Environment.path(Environment.GRADLE_USER_HOME)); + stringBuilder.append("\nexport JLS_HOME=" + Environment.path(Environment.JLS_HOME)); stringBuilder.append("\nexport PATH=$PATH:$HOME/bin"); stringBuilder.append("\nexport PATH=$PATH:" + Environment.path(Environment.JAVA_HOME) + "/bin"); stringBuilder.append("\nexport PATH=$PATH:" + Environment.path(Environment.GRADLE_DIR) + "/bin"); stringBuilder.append("\nexport PATH=$PATH:" + Environment.path(Environment.ANDROID_HOME) + "/cmdline-tools/latest/bin"); stringBuilder.append("\nexport PATH=$PATH:" + Environment.path(Environment.ANDROID_HOME) + "/cmake/bin"); stringBuilder.append("\nexport PATH=$PATH:" + Environment.path(Environment.BINDIR)); - stringBuilder.append("\nexport JLS_HOME=" + Environment.path(Environment.JLS_HOME)); - // Provide paths to .so files needed to execute JDK - final String lib = Environment.LIBDIR.getAbsolutePath(); - stringBuilder.append("\nexport LD_LIBRARY_PATH=" + lib); - stringBuilder.append(System.getenv().containsKey("LD_LIBRARY_PATH") ? ":" + System.getenv().get("LD_LIBRARY_PATH") : ""); - - if(android.os.Build.VERSION.SDK_INT >= 30) { - // Hook calls to malloc() in native binaries - // Required only in Android 11 and up - stringBuilder.append("\nexport LD_PRELOAD=" + Environment.LIBHOOKSO.getAbsolutePath()); - } +//// Provide paths to .so files needed to execute JDK +// final String lib = Environment.LIBDIR.getAbsolutePath(); +// stringBuilder.append("\nexport LD_LIBRARY_PATH=" + lib); +// stringBuilder.append(System.getenv().containsKey("LD_LIBRARY_PATH") ? ":" + System.getenv().get("LD_LIBRARY_PATH") : ""); +// +// if(android.os.Build.VERSION.SDK_INT >= 30) { +// // Hook calls to malloc() in native binaries +// // Required only in Android 11 and up +// stringBuilder.append("\nexport LD_PRELOAD=" + Environment.LIBHOOKSO.getAbsolutePath()); +// } // Monotonic clock fix, needed for JDK - stringBuilder.append("\nln -sf /apex/com.android.runtime/lib64/bionic/libc.so " + lib + "/librt.so && " + - "ln -sf /apex/com.android.runtime/lib64/bionic/libc.so " + lib + "/libpthread.so"); + stringBuilder.append("\nln -sf /apex/com.android.runtime/lib64/bionic/libc.so $JAVA_HOME/lib/librt.so && ln -sf /apex/com.android.runtime/lib64/bionic/libc.so $JAVA_HOME/lib/libpthread.so"); // Execute all commands... append(stringBuilder.toString(), false); // Make sure there are proper permissions set to the $HOME directory - append("chmod -R 777 $HOME", false); + append("chmod -R 777 $HOME > /dev/null 2>&1", false); } catch (Throwable th) { if (callback != null) { String out = ThrowableUtils.getFullStackTrace(th).concat("\n"); diff --git a/app/src/main/java/com/itsaky/androidide/utils/Environment.java b/app/src/main/java/com/itsaky/androidide/utils/Environment.java index 7b8d5aa48..150ebfb5f 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/Environment.java +++ b/app/src/main/java/com/itsaky/androidide/utils/Environment.java @@ -27,7 +27,7 @@ public final class Environment { public static File GRADLE_PLUGIN; public static File BOOTCLASSPATH; public static File CACHES_DIR; - public static File AAPT2; + public static File AAPT2_DIR; public static File INIT_SCRIPT; public static File LIBHOOKSO; @@ -79,7 +79,7 @@ public final class Environment { LIBHOOKSO = new File(LIBDIR, "libhook.so"); CACHES_DIR = new File(HOME, "ide-caches"); BOOTCLASSPATH = new File(""); - AAPT2 = new File(files21, "com.android.tools.build/aapt2/4.0.1-6197926"); + AAPT2_DIR = new File(files21, "com.android.tools.build/aapt2"); GRADLE_PLUGIN = new File(files21, "com.itsaky.androidide/gradle"); GRADLE_USER_HOME = new File(HOME, ".gradle"); GRADLE_PROPS = new File(GRADLE_USER_HOME, "gradle.properties"); diff --git a/app/src/main/java/com/itsaky/androidide/views/Editor.java b/app/src/main/java/com/itsaky/androidide/views/Editor.java index 062843ad2..4ed9bdef3 100644 --- a/app/src/main/java/com/itsaky/androidide/views/Editor.java +++ b/app/src/main/java/com/itsaky/androidide/views/Editor.java @@ -7,15 +7,15 @@ import io.github.rosemoe.editor.widget.CodeEditor; public class Editor extends CodeEditor { public Editor(Context context) { - super(context, null); + this(context, null); } public Editor(Context context, AttributeSet attrs) { - super(context, attrs, 0); + this(context, attrs, 0); } public Editor(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr, 0); + this(context, attrs, defStyleAttr, 0); } public Editor(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { diff --git a/app/src/main/java/io/github/rosemoe/editor/widget/CodeEditor.java b/app/src/main/java/io/github/rosemoe/editor/widget/CodeEditor.java index d34eafe79..32a01341d 100644 --- a/app/src/main/java/io/github/rosemoe/editor/widget/CodeEditor.java +++ b/app/src/main/java/io/github/rosemoe/editor/widget/CodeEditor.java @@ -63,10 +63,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.itsaky.androidide.R; import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding; import com.itsaky.androidide.interfaces.JLSRequestor; +import com.itsaky.androidide.managers.VersionedFileManager; import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE; import com.itsaky.androidide.utils.Logger; import com.itsaky.androidide.utils.TypefaceUtils; -import com.itsaky.androidide.utils.VersionedFileManager; import com.itsaky.lsp.Diagnostic; import com.itsaky.lsp.DiagnosticSeverity; import com.itsaky.lsp.DidChangeTextDocumentParams; diff --git a/app/src/main/java/io/github/rosemoe/editor/widget/EditorTextActionModeStarter.java b/app/src/main/java/io/github/rosemoe/editor/widget/EditorTextActionModeStarter.java index ad2937d49..a515b8835 100644 --- a/app/src/main/java/io/github/rosemoe/editor/widget/EditorTextActionModeStarter.java +++ b/app/src/main/java/io/github/rosemoe/editor/widget/EditorTextActionModeStarter.java @@ -65,17 +65,21 @@ class EditorTextActionModeStarter implements CodeEditor.EditorTextActionPresente .setShowAsActionFlags(2) .setIcon(array.getDrawable(0)); - menu.add(0, 1, 0, mEditor.getContext().getString(android.R.string.cut)) - .setShowAsActionFlags(2) - .setIcon(array.getDrawable(1)); + if(mEditor.isEditable()) { + menu.add(0, 1, 0, mEditor.getContext().getString(android.R.string.cut)) + .setShowAsActionFlags(2) + .setIcon(array.getDrawable(1)); + } menu.add(0, 2, 0, mEditor.getContext().getString(android.R.string.copy)) .setShowAsActionFlags(2) .setIcon(array.getDrawable(2)); - menu.add(0, 3, 0, mEditor.getContext().getString(android.R.string.paste)) - .setShowAsActionFlags(2) - .setIcon(array.getDrawable(3)); + if(mEditor.isEditable()) { + menu.add(0, 3, 0, mEditor.getContext().getString(android.R.string.paste)) + .setShowAsActionFlags(2) + .setIcon(array.getDrawable(3)); + } menu.add(0, 4, 0, mEditor.getContext().getString(com.itsaky.androidide.R.string.menu_navigate_definition)) .setIcon(com.itsaky.androidide.R.drawable.ic_goto_definition); diff --git a/app/src/main/jniLibs/arm64-v8a/libiiec-androidterm5.so b/app/src/main/jniLibs/arm64-v8a/libiiec-androidterm5.so new file mode 100644 index 0000000000000000000000000000000000000000..f5f1b3c4b19aa93fcc3414be5a77e8cfba2640f1 GIT binary patch literal 9680 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 H)D!qGuT`6Z literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_terminal.xml b/app/src/main/res/drawable/ic_terminal.xml new file mode 100644 index 000000000..21e97a288 --- /dev/null +++ b/app/src/main/res/drawable/ic_terminal.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 000000000..c76fb1c58 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/layout/layout_install_tools.xml b/app/src/main/res/layout/layout_install_tools.xml new file mode 100644 index 000000000..9e4c8e745 --- /dev/null +++ b/app/src/main/res/layout/layout_install_tools.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a74024df..afaab63f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,12 @@ + Verbose output is enabled! + Shell output + Invalid path! + Path to .tar.xz or .zip + Build Tools + Delete AAPT2 + Delete JDK + Delete Gradle Project Close this project Last opened project doesn\'t exist! @@ -97,10 +105,12 @@ Please type/paste the path of .zip file which contains Gradle executables. Gradle Installed successfully! Please choose default font size of editor : - This will delete caches directory created by Gradle. If you delete it, the next build may take a bit longer than normal as Gradle will download required files again.\n\nAre you sure you want to delete caches? + This will delete caches directory created by Gradle. If you delete it, the next build may take a bit longer than normal as Gradle will download required files again.\nIMPORTANT: This will also delete AAPT2. You will need to reinstall it otherwise you\'ll end up with a build failure.\n\nAre you sure you want to delete caches? Currently installed gradle version will be DELETE PEEMANENTLY!\n\nPlease enter full path of the zip file which contains Gradle distribution. Reset Editor font size + Update/Install build tools + Use this if you want to install or update build tools. About AndroidIDE Clear Gradle caches Clear Gradle caches directory. This will delete all dependencies downloaded by Gradle. Required files will be downloaded again in next build.