diff --git a/.idea/misc.xml b/.idea/misc.xml index fbf2e1c26..5f4648f3e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,3 +1,4 @@ + - + diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7f20d4147..3e4907728 100755 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -28,6 +28,8 @@ -keep class org.xml.** { *; } # Services +-keep @com.google.auto.service.AutoService class ** { +} -keepclassmembers class ** { @com.google.auto.service.AutoService ; } diff --git a/app/src/main/assets/data/common/tooling-api-all.jar b/app/src/main/assets/data/common/tooling-api-all.jar index bbb29e37c..6ba790cd7 100644 Binary files a/app/src/main/assets/data/common/tooling-api-all.jar and b/app/src/main/assets/data/common/tooling-api-all.jar differ diff --git a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt index ec326ca52..9eef4af8b 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt @@ -34,7 +34,7 @@ abstract class BaseBuildAction : EditorActivityAction() { protected val log: ILogger = ILogger.newInstance(javaClass.simpleName) protected val buildService: BuildService? - get() = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + get() = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) override fun prepare(data: ActionData) { val context = data.getActivity() diff --git a/app/src/main/java/com/itsaky/androidide/actions/build/CancelBuildAction.kt b/app/src/main/java/com/itsaky/androidide/actions/build/CancelBuildAction.kt index efc2a32fa..833703a5d 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/build/CancelBuildAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/build/CancelBuildAction.kt @@ -48,7 +48,7 @@ class CancelBuildAction(context: Context) : EditorActivityAction() { } val context = data.getActivity() - val buildService = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + val buildService = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) if (context == null || buildService == null) { markInvisible() return @@ -60,7 +60,7 @@ class CancelBuildAction(context: Context) : EditorActivityAction() { override fun execAction(data: ActionData): Boolean { log.info("Sending build cancellation request...") - val builder = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + val builder = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) if (builder?.isToolingServerStarted() != true) { flashError(com.itsaky.androidide.projects.R.string.msg_tooling_server_unavailable) return false diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt index aa6172a9c..62e028f5e 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt @@ -178,7 +178,7 @@ abstract class BaseEditorActivity : protected open fun postDestroy() { if (isDestroying) { - Lookup.DEFAULT.unregisterAll() + Lookup.getDefault().unregisterAll() ApiVersionsRegistry.getInstance().clear() ResourceTableRegistry.getInstance().clear() WidgetTableRegistry.getInstance().clear() @@ -392,7 +392,7 @@ abstract class BaseEditorActivity : } fun notifySyncNeeded(onConfirm: () -> Unit) { - val buildService = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + val buildService = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) if (buildService == null || buildService.isBuildInProgress) return flashbarBuilder( diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt index 0fa56a59b..2757308a3 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt @@ -162,9 +162,9 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { } catch (err: Throwable) { log.error("Unable to unbind service") } finally { - (Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?) + (Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?) ?.setEventListener(null) - Lookup.DEFAULT.unregister(BuildService.KEY_BUILD_SERVICE) + Lookup.getDefault().unregister(BuildService.KEY_BUILD_SERVICE) viewModel.isBoundToBuildSerice = false } } @@ -183,7 +183,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { } override fun startServices() { - val service = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as GradleBuildService? + val service = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as GradleBuildService? if (viewModel.isBoundToBuildSerice && service != null) { log.info("Reusing already started Gradle build service") onGradleBuildServiceConnected(service) @@ -228,7 +228,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { //noinspection ConstantConditions ThreadUtils.runOnUiThread { preProjectInit() } - val buildService = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + val buildService = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) if (buildService == null) { log.error("No build service found. Cannot initialize project.") return @@ -268,7 +268,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { private fun releaseServerListener() { // Release reference to server listener in order to prevent memory leak - (Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?) + (Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?) ?.setServerListener(null) } @@ -285,7 +285,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler { buildServiceConnection.onConnected = null viewModel.isBoundToBuildSerice = true - Lookup.DEFAULT.update(BuildService.KEY_BUILD_SERVICE, service) + Lookup.getDefault().update(BuildService.KEY_BUILD_SERVICE, service) service.setEventListener(mBuildEventListener) if (!service.isToolingServerStarted()) { diff --git a/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt index 082d83ac3..f76dc8c71 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt @@ -157,7 +157,7 @@ class RunTasksDialogFragment : BottomSheetDialogFragment() { if (viewModel.displayedChild == CHILD_CONFIRMATION) { val buildService = - Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) ?: run { log.error("Cannot find build service") return@setOnClickListener diff --git a/app/src/main/java/com/itsaky/androidide/lookup/DefaultLookup.java b/app/src/main/java/com/itsaky/androidide/lookup/DefaultLookup.java index 6c7f8aaa1..a25ddb545 100644 --- a/app/src/main/java/com/itsaky/androidide/lookup/DefaultLookup.java +++ b/app/src/main/java/com/itsaky/androidide/lookup/DefaultLookup.java @@ -15,11 +15,9 @@ * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.lookup.internal; - -import com.itsaky.androidide.lookup.Lookup; -import com.itsaky.androidide.lookup.ServiceRegisteredException; +package com.itsaky.androidide.lookup; +import com.google.auto.service.AutoService; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,15 +29,12 @@ import java.util.concurrent.ConcurrentHashMap; * * @author Akash Yadav */ +@AutoService(Lookup.class) public final class DefaultLookup implements Lookup { - public static final Lookup INSTANCE = new DefaultLookup(); - private final Map, Key> keyTable = new ConcurrentHashMap<>(); private final Map, Object> services = new ConcurrentHashMap<>(); - private DefaultLookup() {} - @Override public void register(final Class klass, final T instance) { final Key key = key(klass); diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java index 4e96a4a71..2758f0451 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.java @@ -112,7 +112,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); showNotification(getString(R.string.build_status_idle), false); - Lookup.DEFAULT.update(BuildService.KEY_BUILD_SERVICE, this); + Lookup.getDefault().update(BuildService.KEY_BUILD_SERVICE, this); } @Override @@ -215,7 +215,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin public void onListenerStarted(@NotNull final IToolingApiServer server, @NotNull IProject projectProxy, @NotNull final ProcessStreamsHolder streams) { startServerOutputReader(streams.err); this.server = server; - Lookup.DEFAULT.update(BuildService.KEY_PROJECT_PROXY, projectProxy); + Lookup.getDefault().update(BuildService.KEY_PROJECT_PROXY, projectProxy); this.isToolingServerStarted = true; ProjectManager.INSTANCE.setupProject(projectProxy); } diff --git a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt index 16d35e7fc..3293d8085 100644 --- a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt +++ b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt @@ -41,7 +41,7 @@ class LogReceiverService : Service() { override fun onCreate() { super.onCreate() - Lookup.DEFAULT.update(LOOKUP_KEY, this) + Lookup.getDefault().update(LOOKUP_KEY, this) } override fun onBind(intent: Intent?): IBinder? { @@ -59,7 +59,7 @@ class LogReceiverService : Service() { override fun onDestroy() { super.onDestroy() binder.close() - Lookup.DEFAULT.unregister(LOOKUP_KEY) + Lookup.getDefault().unregister(LOOKUP_KEY) } fun setConsumer(consumer: ((LogLine) -> Unit)?) { @@ -68,5 +68,5 @@ class LogReceiverService : Service() { } fun lookupLogService(): LogReceiverService? { - return Lookup.DEFAULT.lookup(LogReceiverService.LOOKUP_KEY) + return Lookup.getDefault().lookup(LogReceiverService.LOOKUP_KEY) } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/adapters/CompletionListAdapter.kt b/editor/src/main/java/com/itsaky/androidide/editor/adapters/CompletionListAdapter.kt index 497a426dc..676a490ec 100755 --- a/editor/src/main/java/com/itsaky/androidide/editor/adapters/CompletionListAdapter.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/adapters/CompletionListAdapter.kt @@ -149,7 +149,7 @@ class CompletionListAdapter : EditorCompletionAdapter() { val data = item.data val versions = - Lookup.DEFAULT.lookup(ApiVersions.COMPLETION_LOOKUP_KEY) ?: return@executeAsync null + Lookup.getDefault().lookup(ApiVersions.COMPLETION_LOOKUP_KEY) ?: return@executeAsync null val className = when (data) { is ClassCompletionData -> data.className diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.java b/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.java index 2350ad0f3..98c26f59a 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.java @@ -56,10 +56,10 @@ public abstract class IDELanguage implements Language { throws CompletionCancelledException { try { final var cancelChecker = new CompletionCancelChecker(publisher); - Lookup.DEFAULT.register(ICompletionCancelChecker.class, cancelChecker); + Lookup.getDefault().register(ICompletionCancelChecker.class, cancelChecker); doComplete(content, position, publisher, extraArguments); } finally { - Lookup.DEFAULT.unregister(ICompletionCancelChecker.class); + Lookup.getDefault().unregister(ICompletionCancelChecker.class); } } diff --git a/logsender/src/androidTest/java/com/itsaky/androidide/logsender/ExampleInstrumentedTest.kt b/logsender/src/androidTest/java/com/itsaky/androidide/logsender/ExampleInstrumentedTest.kt deleted file mode 100644 index c2cfb3b65..000000000 --- a/logsender/src/androidTest/java/com/itsaky/androidide/logsender/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,42 +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.logsender - -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.logsender.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/lookup/build.gradle.kts b/lookup/build.gradle.kts index a0510b944..2e1606128 100644 --- a/lookup/build.gradle.kts +++ b/lookup/build.gradle.kts @@ -19,14 +19,19 @@ plugins { id("java-library") id("org.jetbrains.kotlin.jvm") + id("kotlin-kapt") } dependencies { + kapt(libs.google.auto.service) + implementation(projects.logger) - + implementation(projects.shared) + implementation(libs.common.jkotlin) + implementation(libs.google.auto.service.annotations) implementation(libs.google.guava) - + testImplementation(libs.tests.junit) testImplementation(libs.tests.google.truth) } \ No newline at end of file diff --git a/lookup/src/main/java/com/itsaky/androidide/lookup/Lookup.java b/lookup/src/main/java/com/itsaky/androidide/lookup/Lookup.java index 89aa0a011..f62383f6e 100644 --- a/lookup/src/main/java/com/itsaky/androidide/lookup/Lookup.java +++ b/lookup/src/main/java/com/itsaky/androidide/lookup/Lookup.java @@ -17,8 +17,6 @@ package com.itsaky.androidide.lookup; -import com.itsaky.androidide.lookup.internal.DefaultLookup; - import org.jetbrains.annotations.Nullable; /** @@ -28,23 +26,30 @@ import org.jetbrains.annotations.Nullable; */ public interface Lookup { - Lookup DEFAULT = DefaultLookup.INSTANCE; + /** + * Get the default implementation of {@link Lookup} service. + * + * @return The default implementation. + */ + static Lookup getDefault() { + return LookupProvider.lookupService(); + } /** * Register the service for the given class. * - * @param klass The class to register the service for. + * @param klass The class to register the service for. * @param instance The implementation of the service. - * @param The type of service. + * @param The type of service. */ void register(Class klass, T instance); /** * Updates the service for the given class. Registers if not already registered. * - * @param klass The class to update the service for. + * @param klass The class to update the service for. * @param instance The instance of the service. - * @param The type of the service. + * @param The type of the service. */ void update(Class klass, T instance); @@ -52,7 +57,7 @@ public interface Lookup { * Unregister the service for given class. * * @param klass The class of service to unregister. - * @param The type of service. + * @param The type of service. */ void unregister(Class klass); @@ -60,7 +65,7 @@ public interface Lookup { * Lookup the service for the given class. * * @param klass The Class of the service to look for. - * @param The type of service. + * @param The type of service. * @return The instance of the registered service or null. */ @Nullable @@ -69,9 +74,9 @@ public interface Lookup { /** * Register the service for the given key. * - * @param key The class to register the service for. + * @param key The class to register the service for. * @param instance The implementation of the service. - * @param The type of service. + * @param The type of service. */ void register(Key key, T instance); @@ -96,13 +101,15 @@ public interface Lookup { /** * Updates the service for the given key. Registers if not already registered. * - * @param key The key to update the service for. + * @param key The key to update the service for. * @param instance The instance of the service. - * @param The type of the service. + * @param The type of the service. */ void update(Key key, T instance); - /** Unregister all registered services. */ + /** + * Unregister all registered services. + */ void unregisterAll(); /** diff --git a/logsender/src/test/java/com/itsaky/androidide/logsender/ExampleUnitTest.kt b/lookup/src/main/java/com/itsaky/androidide/lookup/LookupProvider.java similarity index 60% rename from logsender/src/test/java/com/itsaky/androidide/logsender/ExampleUnitTest.kt rename to lookup/src/main/java/com/itsaky/androidide/lookup/LookupProvider.java index f61a236d6..9596a87a0 100644 --- a/logsender/src/test/java/com/itsaky/androidide/logsender/ExampleUnitTest.kt +++ b/lookup/src/main/java/com/itsaky/androidide/lookup/LookupProvider.java @@ -15,21 +15,26 @@ * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.logsender +package com.itsaky.androidide.lookup; -import org.junit.Test - -import org.junit.Assert.* +import com.itsaky.androidide.utils.ServiceLoader; /** - * Example local unit test, which will execute on the development machine (host). + * Provides instance of {@link Lookup}. * - * See [testing documentation](http://d.android.com/tools/testing). + * @author Akash Yadav */ -class ExampleUnitTest { +class LookupProvider { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) + private static Lookup sLookup; + private static final Object lock = new Object(); + + static synchronized Lookup lookupService() { + synchronized (lock) { + if (sLookup != null) { + return sLookup; + } + return sLookup = ServiceLoader.load(Lookup.class).findFirstOrThrow(); + } } -} \ No newline at end of file +} diff --git a/lookup/src/test/java/com/itsaky/androidide/lookup/LookupTest.kt b/lookup/src/test/java/com/itsaky/androidide/lookup/LookupTest.kt index a92d70099..6bac7f231 100644 --- a/lookup/src/test/java/com/itsaky/androidide/lookup/LookupTest.kt +++ b/lookup/src/test/java/com/itsaky/androidide/lookup/LookupTest.kt @@ -28,7 +28,7 @@ class LookupTest { @Test fun `test with class`() { - val lookup = Lookup.DEFAULT + val lookup = Lookup.getDefault() // Test register var service = TestServiceImpl() @@ -53,7 +53,7 @@ class LookupTest { @Test fun `test with key`() { - val lookup = Lookup.DEFAULT + val lookup = Lookup.getDefault() val key = Key() // Test register diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java index 2aadc4a20..26c582573 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java @@ -59,7 +59,7 @@ public interface ICompletionProvider { /** Abort the completion process if cancelled. */ default void abortCompletionIfCancelled() { - final var checker = Lookup.DEFAULT.lookup(ICompletionCancelChecker.class); + final var checker = Lookup.getDefault().lookup(ICompletionCancelChecker.class); if (checker != null) { checker.abortIfCancelled(); } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/commonCompletionUtils.kt b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/commonCompletionUtils.kt index dfbbdace6..fc77ea847 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/commonCompletionUtils.kt +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/commonCompletionUtils.kt @@ -33,7 +33,7 @@ fun setupLookupForCompletion(file: File) { fun setupLookupForCompletion(file: Path) { val module = ProjectManager.findModuleForFile(file) ?: return - val lookup = Lookup.DEFAULT + val lookup = Lookup.getDefault() lookup.update(ModuleProject.COMPLETION_MODULE_KEY, module) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt index 01620538e..4899d8829 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt @@ -39,7 +39,7 @@ abstract class BaseJavaServiceProvider( /** Abort the completion if cancelled. */ fun abortCompletionIfCancelled() { - val checker = Lookup.DEFAULT.lookup(ICompletionCancelChecker::class.java) + val checker = Lookup.getDefault().lookup(ICompletionCancelChecker::class.java) checker?.abortIfCancelled() } } diff --git a/lsp/testing/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt b/lsp/testing/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt index 1906ee9aa..01319620a 100644 --- a/lsp/testing/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt +++ b/lsp/testing/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt @@ -91,7 +91,7 @@ abstract class LSPTest { this.toolingProject = project this.toolingServer = server - Lookup.DEFAULT.update(BuildService.KEY_PROJECT_PROXY, project) + Lookup.getDefault().update(BuildService.KEY_PROJECT_PROXY, project) server .initialize(InitializeProjectMessage(FileProvider.testProjectRoot().toFile().absolutePath)) diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt index ca2a1c528..de0a6ce47 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt @@ -174,7 +174,7 @@ open class AttrCompletionProvider(provider: ICompletionProvider) : protected open fun findNodeStyleables(node: DOMNode, styleables: ResourceGroup): Set { val nodeName = node.nodeName - val widgets = Lookup.DEFAULT.lookup(WidgetTable.COMPLETION_LOOKUP_KEY) ?: return emptySet() + val widgets = Lookup.getDefault().lookup(WidgetTable.COMPLETION_LOOKUP_KEY) ?: return emptySet() // Find the widget val widget = diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt index 8ab03bb3f..6822d56bc 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt @@ -263,7 +263,7 @@ abstract class IXmlCompletionProvider(private val provider: ICompletionProvider) if (pck == ResourceTableRegistry.PCK_ANDROID) { val platformResTable = - Lookup.DEFAULT.lookup(ResourceTableRegistry.COMPLETION_FRAMEWORK_RES) + Lookup.getDefault().lookup(ResourceTableRegistry.COMPLETION_FRAMEWORK_RES) ?: run { log.debug("No platform resource table is set") return emptySet() @@ -283,7 +283,7 @@ abstract class IXmlCompletionProvider(private val provider: ICompletionProvider) } protected open fun findAllModuleResourceTables(): Set { - val lookup = Lookup.DEFAULT + val lookup = Lookup.getDefault() val sourceResTables = lookup.lookup(ResourceTableRegistry.COMPLETION_MODULE_RES) ?: emptySet() val depResTables = lookup.lookup(ResourceTableRegistry.COMPLETION_DEP_RES) ?: emptySet() return mutableSetOf().also { diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt index 7f283c257..837b875d7 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt @@ -84,10 +84,10 @@ class QualifiedTagCompleter(provider: ICompletionProvider) : LayoutTagCompletion private fun doLookup(): Pair { val widgets = - Lookup.DEFAULT.lookup(WidgetTable.COMPLETION_LOOKUP_KEY) + Lookup.getDefault().lookup(WidgetTable.COMPLETION_LOOKUP_KEY) ?: throw IllegalStateException("No widget table provided") val module = - Lookup.DEFAULT.lookup(ModuleProject.COMPLETION_MODULE_KEY) + Lookup.getDefault().lookup(ModuleProject.COMPLETION_MODULE_KEY) ?: throw IllegalStateException("No module project provided") return widgets as DefaultWidgetTable to module } diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/SimpleTagCompleter.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/SimpleTagCompleter.kt index d06c8d9c5..8b03d222a 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/SimpleTagCompleter.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/SimpleTagCompleter.kt @@ -44,7 +44,7 @@ class SimpleTagCompleter(provider: ICompletionProvider) : LayoutTagCompletionPro prefix: String ): CompletionResult { val widgets = - Lookup.DEFAULT.lookup(WidgetTable.COMPLETION_LOOKUP_KEY)?.getAllWidgets() + Lookup.getDefault().lookup(WidgetTable.COMPLETION_LOOKUP_KEY)?.getAllWidgets() ?: return CompletionResult.EMPTY val result = mutableListOf() @@ -56,7 +56,7 @@ class SimpleTagCompleter(provider: ICompletionProvider) : LayoutTagCompletionPro // Complete the root package names if possible val module = - Lookup.DEFAULT.lookup(ModuleProject.COMPLETION_MODULE_KEY) ?: return CompletionResult(result) + Lookup.getDefault().lookup(ModuleProject.COMPLETION_MODULE_KEY) ?: return CompletionResult(result) // Add root packages from the compile classpath and source paths addFromTrie(module.compileClasspathClasses, prefix, result) diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestAttrValueCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestAttrValueCompletionProvider.kt index e84c95eb6..971b26915 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestAttrValueCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestAttrValueCompletionProvider.kt @@ -186,7 +186,7 @@ class ManifestAttrValueCompletionProvider(provider: ICompletionProvider) : } private fun getModule(): ModuleProject { - return Lookup.DEFAULT.lookup(ModuleProject.COMPLETION_MODULE_KEY) + return Lookup.getDefault().lookup(ModuleProject.COMPLETION_MODULE_KEY) ?: throw IllegalStateException("No module project provided") } diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestTagCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestTagCompletionProvider.kt index 66fd7d296..ae3e05482 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestTagCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifest/ManifestTagCompletionProvider.kt @@ -65,7 +65,7 @@ class ManifestTagCompletionProvider(provider: ICompletionProvider) : } val styleables = - Lookup.DEFAULT.lookup(ResourceTableRegistry.COMPLETION_MANIFEST_ATTR_RES) + Lookup.getDefault().lookup(ResourceTableRegistry.COMPLETION_MANIFEST_ATTR_RES) ?.findPackage(ResourceTableRegistry.PCK_ANDROID) ?.findGroup(STYLEABLE) ?: run { diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifestFileCompletions.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifestFileCompletions.kt index 2ca1eb594..d6569eb5d 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifestFileCompletions.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/manifestFileCompletions.kt @@ -36,6 +36,6 @@ fun canCompleteManifest(pathData: ResourcePathData, type: NodeType): Boolean { fun manifestResourceTable(): Set { return setOf( - Lookup.DEFAULT.lookup(ResourceTableRegistry.COMPLETION_MANIFEST_ATTR_RES) ?: return emptySet() + Lookup.getDefault().lookup(ResourceTableRegistry.COMPLETION_MANIFEST_ATTR_RES) ?: return emptySet() ) } \ No newline at end of file diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt index fac64d5fa..29af13141 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt @@ -37,7 +37,7 @@ fun match(simpleName: String, qualifiedName: String, prefix: String): MatchLevel } fun platformResourceTable(): ResourceTable? { - return Lookup.DEFAULT.lookup(ResourceTableRegistry.COMPLETION_FRAMEWORK_RES) + return Lookup.getDefault().lookup(ResourceTableRegistry.COMPLETION_FRAMEWORK_RES) } fun findAllNamespaces(node: DOMNode): MutableSet> { diff --git a/lsp/xml/src/test/java/com/itsaky/androidide/lsp/xml/XMLLSPTest.kt b/lsp/xml/src/test/java/com/itsaky/androidide/lsp/xml/XMLLSPTest.kt index 2679f24e7..79d7e8d2b 100644 --- a/lsp/xml/src/test/java/com/itsaky/androidide/lsp/xml/XMLLSPTest.kt +++ b/lsp/xml/src/test/java/com/itsaky/androidide/lsp/xml/XMLLSPTest.kt @@ -39,7 +39,7 @@ object XMLLSPTest : LSPTest() { super.initProjectIfNeeded() try { val module = ProjectManager.app!! - val lookup = Lookup.DEFAULT + val lookup = Lookup.getDefault() lookup.update(ModuleProject.COMPLETION_MODULE_KEY, module) diff --git a/settings.gradle.kts b/settings.gradle.kts index 19cc8cdf5..012a553ed 100755 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -62,6 +62,7 @@ include( ":preferences", ":resources", ":shared", + ":templates-api", ":treeview", ":uidesigner", ":xml-inflater", diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt index 973098fc9..3f53e7139 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManager.kt @@ -62,7 +62,7 @@ object ProjectManager : EventReceiver { var cachedInitResult: InitializeResult? = null @JvmOverloads - fun setupProject(project: IProject = Lookup.DEFAULT.lookup(BuildService.KEY_PROJECT_PROXY)!!) { + fun setupProject(project: IProject = Lookup.getDefault().lookup(BuildService.KEY_PROJECT_PROXY)!!) { val caching = CachingProject(project) this.rootProject = ProjectTransformer().transform(caching) if (this.rootProject != null) { @@ -94,7 +94,7 @@ object ProjectManager : EventReceiver { @JvmOverloads fun generateSources( - builder: BuildService? = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) + builder: BuildService? = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) ) { if (builder == null) { log.warn("Cannot generate sources. BuildService is null.") @@ -301,7 +301,7 @@ object ProjectManager : EventReceiver { } private fun generateSourcesIfNecessary(event: FileEvent) { - val builder = Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) ?: return + val builder = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) ?: return val file = event.file if (!isResource(file)) { return diff --git a/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt b/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt index b439b9cf6..74c79daf0 100644 --- a/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt +++ b/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt @@ -47,7 +47,7 @@ class ModuleProjectTest { val (server, project) = ToolingApiTestLauncher().launchServer() server.initialize(InitializeProjectMessage(FileProvider.testProjectRoot().pathString)).get() - Lookup.DEFAULT.register(BuildService.KEY_PROJECT_PROXY, project) + Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project) verifyProjectManagerAPIs() diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt index 588119dba..6b350338d 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/UiLayoutInflater.kt @@ -30,6 +30,6 @@ class UiLayoutInflater : LayoutInflaterImpl() { init { this.componentFactory = UiInflaterComponentFactory() - Lookup.DEFAULT.update(com.itsaky.androidide.inflater.ILayoutInflater.LOOKUP_KEY, this) + Lookup.getDefault().update(com.itsaky.androidide.inflater.ILayoutInflater.LOOKUP_KEY, this) } } diff --git a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt index 23d071ec6..d1bef91ea 100644 --- a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt +++ b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt @@ -37,7 +37,7 @@ private val activity by lazy { Robolectric.buildActivity(AppCompatActivity::clas fun requiresActivity(initComponentFactory: Boolean = true, block: AppCompatActivity.() -> Unit) { if (initComponentFactory) { - Lookup.DEFAULT.apply { + Lookup.getDefault().apply { lookup(LAYOUT_INFLATER_COMPONENT_FACTORY_KEY) ?: register(LAYOUT_INFLATER_COMPONENT_FACTORY_KEY, UiInflaterComponentFactory()) } diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt index af86d0830..5fc6ee35e 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/LayoutInflaterImpl.kt @@ -71,7 +71,7 @@ open class LayoutInflaterImpl : ILayoutInflater { override var componentFactory: IComponentFactory = DefaultComponentFactory() set(value) { field = value - Lookup.DEFAULT.update(LAYOUT_INFLATER_COMPONENT_FACTORY_KEY, value) + Lookup.getDefault().update(LAYOUT_INFLATER_COMPONENT_FACTORY_KEY, value) } protected val primaryInflatingFile: File diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt index e01aa3603..1336b5b63 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/utils/inflaterUtils.kt @@ -40,12 +40,12 @@ import java.io.File /** Get the [ILayoutInflater] registered with [Lookup]. */ fun lookupLayoutInflater(): ILayoutInflater? { - return Lookup.DEFAULT.lookup(Companion.LOOKUP_KEY) + return Lookup.getDefault().lookup(Companion.LOOKUP_KEY) } /** Get the [IComponentFactory] registered with [Lookup]. */ fun lookupComponentFactory(): IComponentFactory? { - return Lookup.DEFAULT.lookup(IComponentFactory.LAYOUT_INFLATER_COMPONENT_FACTORY_KEY) + return Lookup.getDefault().lookup(IComponentFactory.LAYOUT_INFLATER_COMPONENT_FACTORY_KEY) } @JvmOverloads diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt index ebeb1c1ad..c24e95762 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/XmlInflaterTest.kt @@ -47,7 +47,7 @@ object XmlInflaterTest { ToolingApiTestLauncher().launchServer() server.initialize(InitializeProjectMessage(FileProvider.testProjectRoot().pathString)).get() - Lookup.DEFAULT.register(BuildService.KEY_PROJECT_PROXY, project) + Lookup.getDefault().register(BuildService.KEY_PROJECT_PROXY, project) ProjectManager.setupProject() init = true }