diff --git a/actions/src/main/java/com/itsaky/androidide/actions/ActionsRegistry.kt b/actions/src/main/java/com/itsaky/androidide/actions/ActionsRegistry.kt index 7f020ef8d..9da996d2e 100644 --- a/actions/src/main/java/com/itsaky/androidide/actions/ActionsRegistry.kt +++ b/actions/src/main/java/com/itsaky/androidide/actions/ActionsRegistry.kt @@ -17,7 +17,7 @@ package com.itsaky.androidide.actions import android.view.Menu -import com.itsaky.androidide.actions.internal.DefaultActionsRegistry +import com.itsaky.androidide.utils.ServiceLoader /** @author Akash Yadav */ abstract class ActionsRegistry { @@ -29,7 +29,7 @@ abstract class ActionsRegistry { @JvmStatic fun getInstance(): ActionsRegistry { if (instance == null) { - instance = DefaultActionsRegistry() + instance = ServiceLoader.load(ActionsRegistry::class.java).findFirstOrThrow() } return instance as ActionsRegistry @@ -77,6 +77,7 @@ abstract class ActionsRegistry { /** Get all the registered actions at the given location. */ abstract fun getActions(location: ActionItem.Location): Map + /** Clear all the registered actions. */ abstract fun clearActions(location: ActionItem.Location) 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 6ba790cd7..f29e21a3b 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/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt b/app/src/main/java/com/itsaky/androidide/actions/DefaultActionsRegistry.kt similarity index 79% rename from actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt rename to app/src/main/java/com/itsaky/androidide/actions/DefaultActionsRegistry.kt index 617f2b2cd..1aa9403bf 100644 --- a/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/DefaultActionsRegistry.kt @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with AndroidIDE. If not, see . */ -package com.itsaky.androidide.actions.internal +package com.itsaky.androidide.actions import android.content.Context import android.graphics.PorterDuff.Mode.SRC_ATOP @@ -22,11 +22,7 @@ import android.graphics.PorterDuffColorFilter import android.view.Menu import android.view.MenuItem import com.blankj.utilcode.util.ThreadUtils -import com.itsaky.androidide.actions.ActionData -import com.itsaky.androidide.actions.ActionItem -import com.itsaky.androidide.actions.ActionMenu -import com.itsaky.androidide.actions.ActionsRegistry -import com.itsaky.androidide.actions.R +import com.google.auto.service.AutoService import com.itsaky.androidide.actions.locations.CodeActionsMenu import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.resolveAttr @@ -38,6 +34,7 @@ import java.util.concurrent.ConcurrentHashMap * * @author Akash Yadav */ +@AutoService(ActionsRegistry::class) class DefaultActionsRegistry : ActionsRegistry() { private val log = ILogger.newInstance("DefaultActionsRegistry") @@ -117,33 +114,31 @@ class DefaultActionsRegistry : ActionsRegistry() { private fun addActionToMenu(menu: Menu, action: ActionItem, data: ActionData) { val context = data[Context::class.java] - val item: MenuItem = - if (action is ActionMenu) { - val sub = menu.addSubMenu(action.label) + val item: MenuItem = if (action is ActionMenu) { + val sub = menu.addSubMenu(action.label) - var shouldBeEnabled = false - for (subItem in action.children) { - subItem.prepare(data) - if (subItem.visible) { - addActionToMenu(sub, subItem, data) - } - - if (action.enabled && subItem.enabled && !shouldBeEnabled) { - shouldBeEnabled = true - } + var shouldBeEnabled = false + for (subItem in action.children) { + subItem.prepare(data) + if (subItem.visible) { + addActionToMenu(sub, subItem, data) } - action.enabled = shouldBeEnabled - sub.item - } else { - menu.add(action.label) + if (action.enabled && subItem.enabled && !shouldBeEnabled) { + shouldBeEnabled = true + } } + action.enabled = shouldBeEnabled + sub.item + } else { + menu.add(action.label) + } + item.isEnabled = action.enabled - item.icon = - action.icon?.apply { - colorFilter = PorterDuffColorFilter(context!!.resolveAttr(R.attr.colorOnSurface), SRC_ATOP) - } + item.icon = action.icon?.apply { + colorFilter = PorterDuffColorFilter(context!!.resolveAttr(R.attr.colorOnSurface), SRC_ATOP) + } if (item.icon != null) { item.icon!!.alpha = if (action.enabled) 255 else 76 @@ -182,13 +177,11 @@ class DefaultActionsRegistry : ActionsRegistry() { private fun execInBackground(action: ActionItem, data: ActionData) { val start = System.currentTimeMillis() - CompletableFuture.supplyAsync { action.execAction(data) } - .whenComplete { result, error -> + CompletableFuture.supplyAsync { action.execAction(data) }.whenComplete { result, error -> if (result == null || (result is Boolean && !result) || error != null) { log.error( "An error occurred when performing action '${action.id}'. Action failed in ${System.currentTimeMillis() - start}ms", - error - ) + error) } else { log.info("Action '${action.id}' completed in ${System.currentTimeMillis() - start}ms") } diff --git a/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt b/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt index e6697686b..7dd75d3ae 100644 --- a/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt @@ -23,7 +23,7 @@ import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.ActionItem.Location.EDITOR_FILE_TREE import com.itsaky.androidide.actions.ActionMenu import com.itsaky.androidide.actions.ActionsRegistry -import com.itsaky.androidide.actions.internal.DefaultActionsRegistry +import com.itsaky.androidide.actions.DefaultActionsRegistry import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.eventbus.events.filetree.FileClickEvent import com.itsaky.androidide.eventbus.events.filetree.FileLongClickEvent diff --git a/lookup/src/main/java/com/itsaky/androidide/lookup/ForwardingLookup.kt b/lookup/src/main/java/com/itsaky/androidide/lookup/ForwardingLookup.kt index d95d69cc5..bafbd26ef 100644 --- a/lookup/src/main/java/com/itsaky/androidide/lookup/ForwardingLookup.kt +++ b/lookup/src/main/java/com/itsaky/androidide/lookup/ForwardingLookup.kt @@ -17,27 +17,9 @@ package com.itsaky.androidide.lookup -import com.itsaky.androidide.lookup.Lookup.Key - /** - * For all calls to the provided lookup instance. + * Forwards all calls to the provided lookup instance. * * @author Akash Yadav */ -abstract class ForwardingLookup(protected val lookup: Lookup) : Lookup { - override fun register(klass: Class?, instance: T) = lookup.register(klass, instance) - - override fun update(klass: Class?, instance: T) = lookup.update(klass, instance) - - override fun unregister(klass: Class?) = lookup.unregister(klass) - - override fun lookup(klass: Class?): T? = lookup.lookup(klass) - - override fun register(key: Key?, instance: T) = lookup.register(key, instance) - - override fun unregister(key: Key?) = lookup.unregister(key) - - override fun lookup(key: Key?): T? = lookup.lookup(key) - - override fun update(key: Key?, instance: T) = lookup.update(key, instance) -} +open class ForwardingLookup(lookup: Lookup) : Lookup by lookup