diff --git a/app/src/main/java/com/itsaky/androidide/EditorActivity.java b/app/src/main/java/com/itsaky/androidide/EditorActivity.java
index 103aef579..7b12fdbdb 100755
--- a/app/src/main/java/com/itsaky/androidide/EditorActivity.java
+++ b/app/src/main/java/com/itsaky/androidide/EditorActivity.java
@@ -1050,8 +1050,6 @@ public class EditorActivity extends StudioActivity
@Override
protected void onPause() {
super.onPause();
- dispatchOnPauseToEditors();
- EditorActivityActions.clear();
if (mFileTreeFragment != null) {
mFileTreeFragment.saveTreeState();
@@ -1089,18 +1087,6 @@ public class EditorActivity extends StudioActivity
});
}
- private void dispatchOnPauseToEditors() {
- CompletableFuture.runAsync(
- () -> {
- for (int i = 0; i < mViewModel.getOpenedFileCount(); i++) {
- final var editor = getEditorAtIndex(i);
- if (editor != null) {
- editor.onPause();
- }
- }
- });
- }
-
@Override
protected void onSaveInstanceState(@NonNull final Bundle outState) {
outState.putString(KEY_PROJECT_PATH, ProjectManager.INSTANCE.getProjectDirPath());
diff --git a/app/src/main/java/com/itsaky/androidide/handlers/EditorActivityLifecyclerObserver.kt b/app/src/main/java/com/itsaky/androidide/handlers/EditorActivityLifecyclerObserver.kt
index 87035f88b..933f98955 100644
--- a/app/src/main/java/com/itsaky/androidide/handlers/EditorActivityLifecyclerObserver.kt
+++ b/app/src/main/java/com/itsaky/androidide/handlers/EditorActivityLifecyclerObserver.kt
@@ -19,7 +19,6 @@ package com.itsaky.androidide.handlers
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
-import com.itsaky.androidide.EditorActivity
import com.itsaky.androidide.eventbus.events.Event
import com.itsaky.androidide.eventbus.events.EventReceiver
import com.itsaky.androidide.eventbus.events.editor.OnCreateEvent
@@ -31,7 +30,10 @@ import com.itsaky.androidide.eventbus.events.editor.OnStopEvent
import com.itsaky.androidide.projects.FileManager
import com.itsaky.androidide.projects.ProjectManager
import com.itsaky.androidide.utils.BootClasspathProvider
+import com.itsaky.androidide.utils.EditorActivityActions
+import com.itsaky.androidide.utils.Environment
import java.util.concurrent.*
+import org.greenrobot.eventbus.EventBus
/**
* Observes lifecycle events if [com.itsaky.androidide.EditorActivity].
@@ -41,32 +43,33 @@ import java.util.concurrent.*
class EditorActivityLifecyclerObserver : DefaultLifecycleObserver {
private val fileActionsHandler = FileTreeActionHandler()
-
+
override fun onCreate(owner: LifecycleOwner) {
dispatchEvent(OnCreateEvent())
}
-
+
override fun onStart(owner: LifecycleOwner) {
- CompletableFuture.runAsync(BootClasspathProvider::init)
+ CompletableFuture.runAsync(this::initBootclasspathProvider)
register(fileActionsHandler, FileManager, ProjectManager)
-
+
dispatchEvent(OnStartEvent())
}
-
+
override fun onResume(owner: LifecycleOwner) {
dispatchEvent(OnResumeEvent())
}
-
+
override fun onPause(owner: LifecycleOwner) {
+ EditorActivityActions.clear()
dispatchEvent(OnPauseEvent())
}
override fun onStop(owner: LifecycleOwner) {
unregister(fileActionsHandler, FileManager, ProjectManager)
-
+
dispatchEvent(OnStopEvent())
}
-
+
override fun onDestroy(owner: LifecycleOwner) {
dispatchEvent(OnDestroyEvent())
}
@@ -79,5 +82,11 @@ class EditorActivityLifecyclerObserver : DefaultLifecycleObserver {
receivers.forEach { it.unregister() }
}
- private fun dispatchEvent(event: Event) {}
+ private fun dispatchEvent(event: Event) {
+ EventBus.getDefault().post(event)
+ }
+
+ private fun initBootclasspathProvider() {
+ BootClasspathProvider.update(listOf(Environment.ANDROID_JAR.absolutePath))
+ }
}
diff --git a/app/src/main/java/com/itsaky/androidide/views/editor/CodeEditorView.java b/app/src/main/java/com/itsaky/androidide/views/editor/CodeEditorView.java
index a77b3f2f2..901ea0fe4 100644
--- a/app/src/main/java/com/itsaky/androidide/views/editor/CodeEditorView.java
+++ b/app/src/main/java/com/itsaky/androidide/views/editor/CodeEditorView.java
@@ -388,10 +388,6 @@ public class CodeEditorView extends FrameLayout {
return binding.editor.getText().toString();
}
- public void onPause() {
- // unimplemented
- }
-
public void onResume() {
configureEditorIfNeeded();
}
diff --git a/build-tools/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/preferences/PreferenceEvents.kt b/build-tools/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/preferences/PreferenceEvents.kt
new file mode 100644
index 000000000..e9ef5aa1b
--- /dev/null
+++ b/build-tools/eventbus-events/src/main/java/com/itsaky/androidide/eventbus/events/preferences/PreferenceEvents.kt
@@ -0,0 +1,36 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.eventbus.events.preferences
+
+import com.itsaky.androidide.eventbus.events.Event
+
+/**
+ * Dispatched when a preference's is value changed in IDE preferences.
+ *
+ * @param key The key of the preference that was changed.
+ * @param value The new value of the preference.
+ * @author Akash Yadav
+ */
+data class PreferenceChangeEvent(val key: String, val value: Any) : Event()
+
+/**
+ * Dispatched when a preference is removed from shared preferences.
+ *
+ * @param key The key of the preference that was removed.
+ */
+data class PreferenceRemoveEvent(val key: String) : Event()
diff --git a/build-tools/projects/build.gradle b/build-tools/projects/build.gradle
index c7254c9f3..9f1e24be5 100644
--- a/build-tools/projects/build.gradle
+++ b/build-tools/projects/build.gradle
@@ -48,7 +48,7 @@ dependencies {
api project (path: ':build-tools:eventbus-events')
api project (path: ':build-tools:tooling-api')
- implementation project (path: ':common')
+ implementation project (path: ':shared')
implementation common.io
implementation google.guava
diff --git a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt
index 34d616b13..25d2f714c 100644
--- a/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt
+++ b/build-tools/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt
@@ -53,8 +53,8 @@ abstract class ModuleProject(
const val USAGE_RUNTIME = "java-runtime"
}
- @JvmField val compileJavaSourceClasses = SourceClassTrie()
- @JvmField val compileClasspathClasses = ClassTrie()
+ @JvmField val compileJavaSourceClasses = com.itsaky.androidide.utils.SourceClassTrie()
+ @JvmField val compileClasspathClasses = com.itsaky.androidide.utils.ClassTrie()
/**
* Get the source directories of this module (non-transitive i.e for this module only).
@@ -113,7 +113,7 @@ abstract class ModuleProject(
log.debug("Sources indexed for project: '$path'. Found $count source files.")
val paths = getCompileClasspaths().filter { it.exists() }
- val topLevelClasses = ClasspathReader.listClasses(paths).filter { it.isTopLevel }
+ val topLevelClasses = com.itsaky.androidide.utils.ClasspathReader.listClasses(paths).filter { it.isTopLevel }
topLevelClasses.forEach { this.compileClasspathClasses.append(it.name) }
log.debug("Classpaths indexed for project: '$path'. Found ${topLevelClasses.size} classpaths.")
}
diff --git a/build-tools/projects/src/test/java/com/itsaky/androidide/projects/util/ClassTrieTest.kt b/build-tools/projects/src/test/java/com/itsaky/androidide/projects/util/ClassTrieTest.kt
index 9700789df..41a8c3c86 100644
--- a/build-tools/projects/src/test/java/com/itsaky/androidide/projects/util/ClassTrieTest.kt
+++ b/build-tools/projects/src/test/java/com/itsaky/androidide/projects/util/ClassTrieTest.kt
@@ -31,7 +31,7 @@ class ClassTrieTest {
@Test
fun testAppend() {
- val trie = ClassTrie()
+ val trie = com.itsaky.androidide.utils.ClassTrie()
trie.append("java.lang.String")
trie.append("java.lang.String.Inner")
trie.append("java.lang.Object")
@@ -48,7 +48,7 @@ class ClassTrieTest {
@Test
fun testRemoval() {
- val trie = ClassTrie()
+ val trie = com.itsaky.androidide.utils.ClassTrie()
trie.append("java.lang.String")
trie.append("java.lang.Object")
trie.append("java.util.List")
diff --git a/common/build.gradle b/common/build.gradle
index 21801f06c..e2735feee 100755
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -49,8 +49,11 @@ dependencies {
implementation androidx.ktx
implementation common.kotlin
+ implementation project (path: ':build-tools:eventbus-events')
+
api androidx.multidex
+ api project (path: ':shared')
api project (path: ':build-tools:logger')
testImplementation tests.junit
diff --git a/common/src/main/java/com/itsaky/androidide/managers/PreferenceManager.java b/common/src/main/java/com/itsaky/androidide/managers/PreferenceManager.java
index d05a38068..fa5c0d243 100755
--- a/common/src/main/java/com/itsaky/androidide/managers/PreferenceManager.java
+++ b/common/src/main/java/com/itsaky/androidide/managers/PreferenceManager.java
@@ -1,26 +1,30 @@
-/************************************************************************************
- * This file is part of AndroidIDE.
+/*
+ * This file is part of AndroidIDE.
*
- * AndroidIDE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * AndroidIDE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with AndroidIDE. If not, see .
- *
- **************************************************************************************/
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
package com.itsaky.androidide.managers;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
+import com.itsaky.androidide.eventbus.events.preferences.PreferenceChangeEvent;
+import com.itsaky.androidide.eventbus.events.preferences.PreferenceRemoveEvent;
+
+import org.greenrobot.eventbus.EventBus;
+
public class PreferenceManager {
public static final String KEY_IS_FIRST_PROJECT_BUILD = "project_isFirstBuild";
@@ -60,20 +64,35 @@ public class PreferenceManager {
public PreferenceManager remove(String key) {
prefs.edit().remove(key).apply();
+ dispatchRemoveEvent(key);
return this;
}
+ protected void dispatchRemoveEvent(final String key) {
+ EventBus.getDefault().post(new PreferenceRemoveEvent(key));
+ }
+
public PreferenceManager putInt(String key, int val) {
prefs.edit().putInt(key, val).apply();
+ dispatchChangeEvent(key, val);
return this;
}
+ protected void dispatchChangeEvent(final String key, final Object value) {
+ dispatchChangeEvent(new PreferenceChangeEvent(key, value));
+ }
+
+ protected void dispatchChangeEvent(final PreferenceChangeEvent event) {
+ EventBus.getDefault().post(event);
+ }
+
public int getInt(String key) {
return prefs.getInt(key, 0);
}
public PreferenceManager putFloat(String key, float val) {
prefs.edit().putFloat(key, val).apply();
+ dispatchChangeEvent(key, val);
return this;
}
@@ -107,6 +126,7 @@ public class PreferenceManager {
public PreferenceManager putString(String key, String value) {
prefs.edit().putString(key, value).apply();
+ dispatchChangeEvent(key, value);
return this;
}
@@ -132,6 +152,7 @@ public class PreferenceManager {
public PreferenceManager putBoolean(String key, boolean value) {
prefs.edit().putBoolean(key, value).apply();
+ dispatchChangeEvent(key, value);
return this;
}
diff --git a/common/src/main/java/com/itsaky/androidide/managers/VersionedFileManager.java b/common/src/main/java/com/itsaky/androidide/managers/VersionedFileManager.java
deleted file mode 100755
index e65993ff8..000000000
--- a/common/src/main/java/com/itsaky/androidide/managers/VersionedFileManager.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/************************************************************************************
- * This file is part of AndroidIDE.
- *
- * AndroidIDE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AndroidIDE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with AndroidIDE. If not, see .
- *
- **************************************************************************************/
-package com.itsaky.androidide.managers;
-
-import java.io.File;
-import java.util.HashMap;
-
-public class VersionedFileManager {
-
- private static final HashMap map = new HashMap<>();
-
- public static int fileOpened(File file) {
- // Initial version of file should always be 1
- map.put(file, 1);
- return 1;
- }
-
- public static int incrementVersion(File file) {
- if (!map.containsKey(file)) {
- map.put(file, 1);
- }
-
- int version = map.get(file);
- version++;
- map.put(file, version);
- return version;
- }
-}
diff --git a/common/src/main/java/com/itsaky/androidide/models/DexPair.java b/common/src/main/java/com/itsaky/androidide/models/DexPair.java
deleted file mode 100755
index 5eb1b00f8..000000000
--- a/common/src/main/java/com/itsaky/androidide/models/DexPair.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/************************************************************************************
- * This file is part of AndroidIDE.
- *
- * AndroidIDE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AndroidIDE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with AndroidIDE. If not, see .
- *
- **************************************************************************************/
-package com.itsaky.androidide.models;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class DexPair implements Parcelable {
-
- public static final Creator CREATOR =
- new Creator() {
-
- @Override
- public DexPair createFromParcel(Parcel p1) {
- return new DexPair(p1);
- }
-
- @Override
- public DexPair[] newArray(int p1) {
- return new DexPair[p1];
- }
- };
- public String first;
- public String second;
- private DexPair(Parcel in) {
- first = in.readString();
- second = in.readString();
- }
-
- public DexPair(String first, String second) {
- this.first = first;
- this.second = second;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel p1, int p2) {
- p1.writeString(first);
- p1.writeString(second);
- }
-}
diff --git a/common/src/main/java/com/itsaky/androidide/utils/InputStreamWriter.java b/common/src/main/java/com/itsaky/androidide/utils/InputStreamWriter.java
deleted file mode 100755
index 3ed59eed0..000000000
--- a/common/src/main/java/com/itsaky/androidide/utils/InputStreamWriter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/************************************************************************************
- * This file is part of AndroidIDE.
- *
- *
- *
- * AndroidIDE is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AndroidIDE is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with AndroidIDE. If not, see .
- *
- **************************************************************************************/
-
-package com.itsaky.androidide.utils;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-/** Writes an InputStream to a file */
-public class InputStreamWriter implements Runnable {
-
- private final InputStream in;
- private final File out;
-
- private final BufferedOutputStream os;
-
- public InputStreamWriter(InputStream in, File out) throws FileNotFoundException {
- this.in = in;
- this.out = out;
-
- this.os = new BufferedOutputStream(new FileOutputStream(out, true));
- }
-
- @Override
- public void run() {
- try {
- final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- while (true) {
- final String data = reader.readLine();
- if (data == null) {
- break;
- }
-
- os.write(data.concat("\n").getBytes());
- os.flush();
- }
- } catch (Throwable th) {
- // ignored
- }
- }
-}
diff --git a/common/src/test/java/com/itsaky/androidide/utils/ClasspathReaderTest.kt b/common/src/test/java/com/itsaky/androidide/utils/ClasspathReaderTest.kt
index ecda4b2f1..af0577781 100644
--- a/common/src/test/java/com/itsaky/androidide/utils/ClasspathReaderTest.kt
+++ b/common/src/test/java/com/itsaky/androidide/utils/ClasspathReaderTest.kt
@@ -32,7 +32,7 @@ class ClasspathReaderTest {
@Test
fun testListClasses() {
val classes =
- ClasspathReader.listClasses(
+ com.itsaky.androidide.utils.ClasspathReader.listClasses(
listOf(File("../tests/test-project/app/src/main/resources/android.jar"))
)
diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt
index 18e963276..23ca96dc8 100644
--- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt
+++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt
@@ -33,7 +33,7 @@ class OrganizeImportsAction : BaseCodeAction() {
}
override fun execAction(data: ActionData): Any {
- val watch = StopWatch("Organize imports")
+ val watch = com.itsaky.androidide.utils.StopWatch("Organize imports")
return try {
val editor = requireEditor(data)
val content = editor.text
diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt
index 15803d61e..f6a25d68f 100644
--- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt
+++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt
@@ -32,7 +32,7 @@ class RemoveUnusedImportsAction : BaseCodeAction() {
}
override fun execAction(data: ActionData): Any {
- val watch = StopWatch("Remove unused imports")
+ val watch = com.itsaky.androidide.utils.StopWatch("Remove unused imports")
return try {
val editor = requireEditor(data)
val content = editor.text
diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt
index 5e09a662f..1a7f30d96 100644
--- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt
+++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt
@@ -110,7 +110,7 @@ class GenerateConstructorAction : FieldBasedAction() {
return
}
- val stopWatch = StopWatch("generateConstructorForFields()")
+ val stopWatch = com.itsaky.androidide.utils.StopWatch("generateConstructorForFields()")
val constructor =
newConstructor(type.simpleName.toString(), varTypes.toTypedArray(), varNames.toTypedArray())
val body = constructor.createBody()
diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt
index e6623051f..b8298f585 100644
--- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt
+++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt
@@ -209,7 +209,7 @@ class ImportCompletionProvider(
result.add(fromClasspath)
}
- BootClasspathProvider.getAllEntries().forEach {
+ com.itsaky.androidide.utils.BootClasspathProvider.getAllEntries().forEach {
abortIfCancelled()
val fromBootclasspath = collectPackageNode(it, pkgName)
if (fromBootclasspath != null) {
@@ -228,7 +228,7 @@ class ImportCompletionProvider(
* @param pkgName The package name of the package to find node for.
* @return The found package name. Or `null` if no package can be found.
*/
- private fun collectPackageNode(trie: ClassTrie, pkgName: String): Node? {
+ private fun collectPackageNode(trie: com.itsaky.androidide.utils.ClassTrie, pkgName: String): Node? {
val segments = trie.segments(pkgName)
var node: Node? = trie.root
for (segment in segments) {
@@ -347,7 +347,7 @@ class ImportCompletionProvider(
addDirectChildNodes(classpathNode, incomplete, list, names, packageOnly)
}
- BootClasspathProvider.getAllEntries().forEach {
+ com.itsaky.androidide.utils.BootClasspathProvider.getAllEntries().forEach {
abortIfCancelled()
val node =
if (pkgName.isEmpty()) {
diff --git a/settings.gradle b/settings.gradle
index f3df00b31..acea9b09a 100755
--- a/settings.gradle
+++ b/settings.gradle
@@ -35,3 +35,4 @@ include ':build-tools:eventbus-events'
include ':build-tools:tooling-api-testing'
include ':build-tools:javac-services'
include ':lsp:models'
+include ':shared'
diff --git a/shared/.gitignore b/shared/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/shared/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/shared/build.gradle b/shared/build.gradle
new file mode 100644
index 000000000..6d90f0abe
--- /dev/null
+++ b/shared/build.gradle
@@ -0,0 +1,41 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion rootProject.ext.compileSdk
+ buildToolsVersion rootProject.ext.buildTools
+
+ defaultConfig {
+ minSdkVersion rootProject.ext.minSdk
+ targetSdkVersion rootProject.ext.targetSdk
+ }
+
+ buildFeatures.viewBinding true
+
+ compileOptions {
+ sourceCompatibility rootProject.ext.javaSourceVersion
+ targetCompatibility rootProject.ext.javaTargetVersion
+ }
+
+ kotlinOptions {
+ jvmTarget = "11"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled true
+ }
+ }
+
+ testOptions {
+ unitTests {
+ includeAndroidResources = true
+ }
+ }
+}
+
+dependencies {
+ implementation google.guava
+
+ implementation project(path: ':build-tools:logger')
+}
\ No newline at end of file
diff --git a/shared/consumer-rules.pro b/shared/consumer-rules.pro
new file mode 100644
index 000000000..e69de29bb
diff --git a/shared/proguard-rules.pro b/shared/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/shared/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/shared/src/androidTest/java/com/itsaky/androidide/shared/ExampleInstrumentedTest.kt b/shared/src/androidTest/java/com/itsaky/androidide/shared/ExampleInstrumentedTest.kt
new file mode 100644
index 000000000..6551a9150
--- /dev/null
+++ b/shared/src/androidTest/java/com/itsaky/androidide/shared/ExampleInstrumentedTest.kt
@@ -0,0 +1,41 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.shared
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.itsaky.androidide.shared.test", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/shared/src/main/AndroidManifest.xml b/shared/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..0207a4222
--- /dev/null
+++ b/shared/src/main/AndroidManifest.xml
@@ -0,0 +1,19 @@
+
+
+
+
\ No newline at end of file
diff --git a/common/src/main/java/com/itsaky/androidide/models/Locations.kt b/shared/src/main/java/com/itsaky/androidide/models/Locations.kt
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/models/Locations.kt
rename to shared/src/main/java/com/itsaky/androidide/models/Locations.kt
diff --git a/common/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java b/shared/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java
similarity index 95%
rename from common/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java
rename to shared/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java
index 9e0c57bd3..76a5b5487 100644
--- a/common/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java
+++ b/shared/src/main/java/com/itsaky/androidide/utils/BootClasspathProvider.java
@@ -35,11 +35,6 @@ public class BootClasspathProvider {
private static final Map bootClasspathClasses = new ConcurrentHashMap<>();
private static final ILogger LOG = ILogger.newInstance("BootClassProvider");
- /** Initializes the classpath provider with the default boot classpath. */
- public static synchronized void init() {
- update(Collections.singleton(Environment.ANDROID_JAR.getAbsolutePath()));
- }
-
/**
* Updates the boot classpath cache. If a classpath is already indexed, it is skipped.
*
diff --git a/common/src/main/java/com/itsaky/androidide/utils/Cache.java b/shared/src/main/java/com/itsaky/androidide/utils/Cache.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/Cache.java
rename to shared/src/main/java/com/itsaky/androidide/utils/Cache.java
diff --git a/common/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt b/shared/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt
similarity index 91%
rename from common/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt
rename to shared/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt
index 51230dd2d..c90ffc019 100644
--- a/common/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt
+++ b/shared/src/main/java/com/itsaky/androidide/utils/ClassInfo.kt
@@ -17,8 +17,6 @@
package com.itsaky.androidide.utils
-import androidx.core.text.isDigitsOnly
-
/**
* Information about a class in a JAR file.
*
@@ -68,5 +66,15 @@ private constructor(
return ClassInfo(name, simpleName, packageName, isTopLevel, isAnonymous, isLocal, isInner)
}
+
+ private fun CharSequence.isDigitsOnly(): Boolean {
+ for (char in this) {
+ if (!char.isDigit()) {
+ return false
+ }
+ }
+
+ return true
+ }
}
}
diff --git a/common/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt b/shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt
rename to shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt
diff --git a/common/src/main/java/com/itsaky/androidide/utils/ClasspathReader.kt b/shared/src/main/java/com/itsaky/androidide/utils/ClasspathReader.kt
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/ClasspathReader.kt
rename to shared/src/main/java/com/itsaky/androidide/utils/ClasspathReader.kt
diff --git a/common/src/main/java/com/itsaky/androidide/utils/DocumentUtils.java b/shared/src/main/java/com/itsaky/androidide/utils/DocumentUtils.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/DocumentUtils.java
rename to shared/src/main/java/com/itsaky/androidide/utils/DocumentUtils.java
diff --git a/common/src/main/java/com/itsaky/androidide/utils/InputStreamLineReader.java b/shared/src/main/java/com/itsaky/androidide/utils/InputStreamLineReader.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/InputStreamLineReader.java
rename to shared/src/main/java/com/itsaky/androidide/utils/InputStreamLineReader.java
diff --git a/common/src/main/java/com/itsaky/androidide/utils/ReaderInputStream.java b/shared/src/main/java/com/itsaky/androidide/utils/ReaderInputStream.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/ReaderInputStream.java
rename to shared/src/main/java/com/itsaky/androidide/utils/ReaderInputStream.java
diff --git a/common/src/main/java/com/itsaky/androidide/utils/SourceClassTrie.kt b/shared/src/main/java/com/itsaky/androidide/utils/SourceClassTrie.kt
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/SourceClassTrie.kt
rename to shared/src/main/java/com/itsaky/androidide/utils/SourceClassTrie.kt
diff --git a/common/src/main/java/com/itsaky/androidide/utils/StopWatch.kt b/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt
similarity index 94%
rename from common/src/main/java/com/itsaky/androidide/utils/StopWatch.kt
rename to shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt
index 5542c9042..30ab03bd2 100644
--- a/common/src/main/java/com/itsaky/androidide/utils/StopWatch.kt
+++ b/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt
@@ -17,8 +17,6 @@
package com.itsaky.androidide.utils
-import com.itsaky.androidide.utils.ILogger
-
/**
* A stop watch helps to log duration between the time when the instance of the stopwatch instance
* was created and the time when [StopWatch.log] or [StopWatch.lap] method is called.
@@ -48,4 +46,4 @@ class StopWatch(
log.debug("$message in ${System.currentTimeMillis() - lastLap}ms")
lastLap = System.currentTimeMillis()
}
-}
\ No newline at end of file
+}
diff --git a/common/src/main/java/com/itsaky/androidide/utils/StringUtil.java b/shared/src/main/java/com/itsaky/androidide/utils/StringUtil.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/StringUtil.java
rename to shared/src/main/java/com/itsaky/androidide/utils/StringUtil.java
diff --git a/common/src/main/java/com/itsaky/androidide/utils/VMUtils.java b/shared/src/main/java/com/itsaky/androidide/utils/VMUtils.java
similarity index 100%
rename from common/src/main/java/com/itsaky/androidide/utils/VMUtils.java
rename to shared/src/main/java/com/itsaky/androidide/utils/VMUtils.java
diff --git a/shared/src/test/java/com/itsaky/androidide/shared/ExampleUnitTest.kt b/shared/src/test/java/com/itsaky/androidide/shared/ExampleUnitTest.kt
new file mode 100644
index 000000000..8667d1554
--- /dev/null
+++ b/shared/src/test/java/com/itsaky/androidide/shared/ExampleUnitTest.kt
@@ -0,0 +1,34 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.shared
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar
index 5d9ed80a8..a3cc6501b 100644
Binary files a/tests/test-home/.androidide/init/model.jar and b/tests/test-home/.androidide/init/model.jar differ