diff --git a/app/src/main/java/com/itsaky/androidide/TerminalActivity.java b/app/src/main/java/com/itsaky/androidide/TerminalActivity.java index 111495099..bb4f50a88 100755 --- a/app/src/main/java/com/itsaky/androidide/TerminalActivity.java +++ b/app/src/main/java/com/itsaky/androidide/TerminalActivity.java @@ -29,6 +29,7 @@ import android.widget.LinearLayout; import com.blankj.utilcode.util.ClipboardUtils; import com.blankj.utilcode.util.KeyboardUtils; +import com.blankj.utilcode.util.ResourceUtils; import com.blankj.utilcode.util.SizeUtils; import com.itsaky.androidide.app.StudioActivity; import com.itsaky.androidide.databinding.ActivityTerminalBinding; @@ -50,6 +51,7 @@ import com.itsaky.terminal.view.TerminalView; import com.itsaky.terminal.view.TerminalViewClient; import java.util.Map; +import java.util.concurrent.CompletableFuture; import org.json.JSONException; @@ -74,25 +76,33 @@ public class TerminalActivity extends StudioActivity { @Override protected View bindLayout () { binding = ActivityTerminalBinding.inflate (getLayoutInflater ()); + return binding.getRoot (); + } + + @Override + protected void onCreate (Bundle savedInstanceState) { + super.onCreate (savedInstanceState); + + final var future = CompletableFuture.runAsync (() -> { + final var in = ResourceUtils. + }); terminal = new TerminalView (this, null); terminal.setTerminalViewClient (client); terminal.attachSession (createSession (getWorkingDirectory ())); terminal.setKeepScreenOn (true); terminal.setTextSize (SizeUtils.dp2px (10)); terminal.setTypeface (TypefaceUtils.jetbrainsMono ()); - + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams (-1, 0); params.weight = 1f; - + binding.getRoot ().addView (terminal, 0, params); try { binding.virtualKeyTable.setVirtualKeysViewClient (getKeyListener ()); binding.virtualKeyTable.reload (new VirtualKeysInfo (ConstantsBridge.VIRTUAL_KEYS, "", VirtualKeysConstants.CONTROL_CHARS_ALIASES)); } catch (JSONException e) { - // Won't happen + LOG.error ("Unable to parse terminal virtual keys json data", e); } - - return binding.getRoot (); } @NonNull diff --git a/app/src/main/java/com/itsaky/androidide/fragments/preferences/EditorPreferences.java b/app/src/main/java/com/itsaky/androidide/fragments/preferences/EditorPreferences.java index 1dc09c115..1e49650e7 100755 --- a/app/src/main/java/com/itsaky/androidide/fragments/preferences/EditorPreferences.java +++ b/app/src/main/java/com/itsaky/androidide/fragments/preferences/EditorPreferences.java @@ -83,7 +83,7 @@ public class EditorPreferences extends BasePreferenceFragment implements Prefere if(p1.getKey().equals(KEY_EDITOR_DRAW_HEX)) { boolean drawHex = (Boolean) p2; getPrefManager().putBoolean(KEY_EDITOR_DRAW_HEX, drawHex); - ConstantsBridge.EDITORPREF_DRAW_HEX_CHANGED = true; + ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = true; } return true; } @@ -154,7 +154,7 @@ public class EditorPreferences extends BasePreferenceFragment implements Prefere private void changeTextSize(LayoutTextSizeSliderBinding binding, float size) { getPrefManager().putFloat(KEY_EDITOR_FONT_SIZE, size); binding.slider.setValue(size); - ConstantsBridge.EDITORPREF_SIZE_CHANGED = true; + ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = true; } private void showPrintableCharsDialog() { @@ -191,7 +191,7 @@ public class EditorPreferences extends BasePreferenceFragment implements Prefere getPrefManager().putBoolean(KEY_EDITORFLAG_LINE_BREAK, isChecked); } - ConstantsBridge.EDITORPREF_FLAGS_CHANGED = true; + ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = true; }); builder.setPositiveButton(android.R.string.ok, null); builder.setCancelable(false); diff --git a/app/src/main/java/com/itsaky/androidide/views/CodeEditorView.java b/app/src/main/java/com/itsaky/androidide/views/CodeEditorView.java index 6989df54e..a94747c01 100644 --- a/app/src/main/java/com/itsaky/androidide/views/CodeEditorView.java +++ b/app/src/main/java/com/itsaky/androidide/views/CodeEditorView.java @@ -19,7 +19,6 @@ package com.itsaky.androidide.views; import android.annotation.SuppressLint; import android.content.Context; -import android.util.Log; import android.view.LayoutInflater; import android.widget.FrameLayout; @@ -278,9 +277,9 @@ public class CodeEditorView extends FrameLayout { } private void configureEditorIfNeeded () { - boolean sizeChanged = isFirstCreate || ConstantsBridge.EDITORPREF_SIZE_CHANGED; - boolean flagsChanged = isFirstCreate || ConstantsBridge.EDITORPREF_FLAGS_CHANGED; - boolean drawHexChanged = isFirstCreate || ConstantsBridge.EDITORPREF_DRAW_HEX_CHANGED; + boolean sizeChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_SIZE_CHANGED; + boolean flagsChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED; + boolean drawHexChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED; final PreferenceManager prefs = StudioApp.getInstance ().getPrefManager (); if (sizeChanged) { @@ -290,7 +289,7 @@ public class CodeEditorView extends FrameLayout { } binding.editor.setTextSize (textSize); - ConstantsBridge.EDITORPREF_SIZE_CHANGED = false; + ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = false; } if (flagsChanged) { @@ -316,12 +315,12 @@ public class CodeEditorView extends FrameLayout { } binding.editor.setNonPrintablePaintingFlags (flags); - ConstantsBridge.EDITORPREF_FLAGS_CHANGED = false; + ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = false; } if (drawHexChanged) { binding.editor.setLineColorsEnabled (prefs.getBoolean (PreferenceManager.KEY_EDITOR_DRAW_HEX, true)); - ConstantsBridge.EDITORPREF_DRAW_HEX_CHANGED = false; + ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = false; } isFirstCreate = false; diff --git a/common/src/main/java/com/itsaky/androidide/app/BaseApplication.java b/common/src/main/java/com/itsaky/androidide/app/BaseApplication.java index 13f9010c6..3fdaf269c 100755 --- a/common/src/main/java/com/itsaky/androidide/app/BaseApplication.java +++ b/common/src/main/java/com/itsaky/androidide/app/BaseApplication.java @@ -28,9 +28,9 @@ import android.os.Build; import androidx.annotation.NonNull; import androidx.core.app.NotificationManagerCompat; import androidx.multidex.MultiDexApplication; -import com.blankj.utilcode.util.EncodeUtils; -import com.blankj.utilcode.util.ResourceUtils; + import com.blankj.utilcode.util.ThrowableUtils; +import com.itsaky.androidide.common.R; import com.itsaky.androidide.managers.PreferenceManager; import com.itsaky.androidide.managers.ToolsManager; import com.itsaky.androidide.shell.ShellServer; @@ -50,11 +50,7 @@ public abstract class BaseApplication extends MultiDexApplication { private static BaseApplication instance; private StudioUtils mUtils; private PreferenceManager mPrefsManager; - private NotificationManager mNotificationManager; - public static final long BUSYBOX_VERSION = 1; - public static final String TAG = "StudioApp"; - public static final String ASSETS_DATA_DIR = "data/"; public static final String NOTIFICATION_ID_UPDATE = "17571"; public static final String NOTIFICATION_ID_DEVS = "17572"; public static final String TELEGRAM_GROUP_URL = "https://t.me/androidide_discussions"; @@ -68,7 +64,6 @@ public abstract class BaseApplication extends MultiDexApplication { super.onCreate(); mPrefsManager = new PreferenceManager(this); - mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); JavaCharacter.initMap(); ToolsManager.init(this, null); @@ -94,7 +89,7 @@ public abstract class BaseApplication extends MultiDexApplication { NotificationManagerCompat.from(this).createNotificationChannel(devsChannels); } - public String getNotificationChannelNameForId(String id) { + public String getNotificationChannelNameForId(@NonNull String id) { if(id.equals(NOTIFICATION_ID_UPDATE)) return getUpdateNotificationChannelName(); else if(id.equals(NOTIFICATION_ID_DEVS)) @@ -103,11 +98,11 @@ public abstract class BaseApplication extends MultiDexApplication { } private String getUpdateNotificationChannelName() { - return getString(com.itsaky.androidide.common.R.string.cms_channel_id_update); + return getString(R.string.cms_channel_id_update); } private String getDevNotificationChannelName() { - return getString(com.itsaky.androidide.common.R.string.cms_channel_id_devs); + return getString(R.string.cms_channel_id_devs); } public static BaseApplication getBaseInstance () { @@ -131,30 +126,11 @@ public abstract class BaseApplication extends MultiDexApplication { public void writeException(Throwable th) { FileUtil.writeFile(new File(FileUtil.getExternalStorageDir(), "idelog.txt").getAbsolutePath(), ThrowableUtils.getFullStackTrace(th)); } - - public File getIndexedDir() { - return Environment.mkdirIfNotExits(new File(getRootDir(), "indexed")); - } - - public File getD8Jar() { - File f = new File(getRootDir(), "d8.jar"); - if(f.exists() && f.isFile()) - return f; - if(ResourceUtils.copyFileFromAssets(ToolsManager.getCommonAsset("d8.jar"), f.getAbsolutePath())) { - return f; - } - - return null; - } - + public File getRootDir() { return new File(getIDEDataDir(), "framework"); } - - public File getRootDirOld() { - return new File(getFilesDir(), "framework"); - } - + @SuppressLint("SdCardPath") public File getIDEDataDir() { return Environment.mkdirIfNotExits(new File("/data/data/com.itsaky.androidide/files")); @@ -165,31 +141,11 @@ public abstract class BaseApplication extends MultiDexApplication { public final File getLogSenderDir() { return new File(getRootDir(), "logsender"); } - - @NonNull - @Contract(" -> new") - public final File getToolsDownloadDirectory() { - return new File(getRootDir(), "downloads"); - } - + public final File getTempProjectDir() { return Environment.mkdirIfNotExits(new File(Environment.TMP_DIR, "tempProject")); } - - public final File getTempClassesDir() { - return Environment.mkdirIfNotExits(new File(FileUtil.getExternalStorageDir() /*getTempProjectDir() */, "classes")); - } - - @NonNull - @Contract(" -> new") - public final String getDownloadRequestUrl() { - return new String(EncodeUtils.base64Decode("aHR0cHM6Ly9hbmRyb2lkaWRlLmNvbS9idWlsZC90b29scy9kb3dubG9hZC8=")); - } - public boolean isFrameworkDownloaded() { - return getToolsDownloadDirectory().exists() && mPrefsManager.isFrameworkDownloaded(); - } - public boolean isFrameworkInstalled() { return getRootDir().exists() && mPrefsManager.isFrameworkInstalled(); } @@ -203,27 +159,19 @@ public abstract class BaseApplication extends MultiDexApplication { } public File[] listProjects() { - return getProjectsDir().listFiles(p1 -> p1.isDirectory()); + return getProjectsDir().listFiles(File::isDirectory); } - - public static boolean is64Bit() { - return isAarch64(); - } - - public static boolean is32Bit() { - return isArmv7a(); - } - + public static boolean isAbiSupported () { return isAarch64() || isArmv7a(); } public static boolean isAarch64 () { - return Arrays.stream(android.os.Build.SUPPORTED_ABIS).anyMatch("arm64-v8a"::equals); + return Arrays.asList (Build.SUPPORTED_ABIS).contains ("arm64-v8a"); } public static boolean isArmv7a () { - return Arrays.stream(android.os.Build.SUPPORTED_ABIS).anyMatch("armeabi-v7a"::equals); + return Arrays.asList (Build.SUPPORTED_ABIS).contains ("armeabi-v7a"); } @NonNull @@ -235,15 +183,7 @@ public abstract class BaseApplication extends MultiDexApplication { } throw new UnsupportedOperationException ("Device not supported"); } - - public String getAssetsDataFile() { - return ASSETS_DATA_DIR; - } - - public String getAssetsDataFile(String str) { - return new StringBuffer().append(getAssetsDataFile()).append(str).toString(); - } - + public StudioUtils getUtils() { return mUtils == null ? mUtils = new StudioUtils(this) : mUtils; } diff --git a/common/src/main/java/com/itsaky/androidide/models/ConstantsBridge.java b/common/src/main/java/com/itsaky/androidide/models/ConstantsBridge.java index bc7941fcc..3e1769770 100755 --- a/common/src/main/java/com/itsaky/androidide/models/ConstantsBridge.java +++ b/common/src/main/java/com/itsaky/androidide/models/ConstantsBridge.java @@ -21,9 +21,9 @@ import java.util.List; public class ConstantsBridge { - public static boolean EDITORPREF_SIZE_CHANGED = false; - public static boolean EDITORPREF_FLAGS_CHANGED = false; - public static boolean EDITORPREF_DRAW_HEX_CHANGED = false; + public static boolean EDITOR_PREF_SIZE_CHANGED = false; + public static boolean EDITOR_PREF_FLAGS_CHANGED = false; + public static boolean EDITOR_PREF_DRAW_HEX_CHANGED = false; public static boolean CLASS_LOAD_SUCCESS = true; public static boolean SPLASH_TO_MAIN = false; diff --git a/common/src/main/java/com/itsaky/androidide/utils/Environment.java b/common/src/main/java/com/itsaky/androidide/utils/Environment.java index f720272f9..f38f25606 100755 --- a/common/src/main/java/com/itsaky/androidide/utils/Environment.java +++ b/common/src/main/java/com/itsaky/androidide/utils/Environment.java @@ -106,21 +106,19 @@ public final class Environment { SHELL = new File(BIN_DIR, "sh.sh"); BUSYBOX_SH = new File (BIN_DIR, "sh"); - if(!JAVA.canExecute()) { - JAVA.setExecutable(true); - } - - if(!BUSYBOX.canExecute()) { - BUSYBOX.setExecutable(true); - } - - if(!SHELL.canExecute()) { - SHELL.setExecutable(true); - } + setExecutable (JAVA); + setExecutable (BUSYBOX); + setExecutable (SHELL); System.setProperty("user.home", HOME.getAbsolutePath()); System.setProperty("java.home", JAVA_HOME.getAbsolutePath()); } + + public static void setExecutable (@NonNull final File file) { + if (!file.setExecutable (true)) { + LOG.error ("Unable to set executable permissions to file", file); + } + } @NonNull private static Map readProperties() { @@ -129,11 +127,11 @@ public final class Environment { try { Properties p = new Properties(); p.load(new StringReader(FileIOUtils.readFile2String(IDE_PROPS_FILE))); - for(Map.Entry entry : p.entrySet()) { + for(@SuppressWarnings("rawtypes") Map.Entry entry : p.entrySet()) { props.put(entry.getKey() + "", entry.getValue() + ""); } } catch (Throwable th) { - // ignored + LOG.error ("Unable to read properties file", th); } return props; }