From ed8c18c25fa3124a29e06d4fdb085331dec3a466 Mon Sep 17 00:00:00 2001 From: Ishan Taldekar Date: Mon, 17 Feb 2025 14:17:57 -0500 Subject: [PATCH 1/4] Refactor actions and move to base view --- .../amazonq/views/AmazonQChatWebview.java | 2 + .../eclipse/amazonq/views/AmazonQView.java | 52 +---------- .../amazonq/views/AmazonQViewContainer.java | 13 +-- .../amazonq/views/BaseAmazonQView.java | 93 ++++++++++++++++++- .../amazonq/views/CallToActionView.java | 6 +- .../amazonq/views/ChatAssetMissingView.java | 13 +-- .../amazonq/views/DependencyMissingView.java | 1 - .../amazonq/views/LspStartUpFailedView.java | 6 +- .../amazonq/views/ToolkitLoginWebview.java | 2 + .../views/actions/AmazonQCommonActions.java | 38 +++++--- .../ToggleAutoTriggerContributionItem.java | 12 ++- .../amazonq/views/router/ViewRouter.java | 2 +- 12 files changed, 143 insertions(+), 97 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java index 1ad93a984..3faeefcaf 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java @@ -118,6 +118,8 @@ public void completed(final ProgressEvent event) { } browser.setText(content.get()); + setupAmazonQCommonActions(); + return parent; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java index 32a984028..1cd8f86fd 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQView.java @@ -9,28 +9,15 @@ import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IViewSite; -import io.reactivex.rxjava3.disposables.Disposable; -import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState; -import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.providers.browser.AmazonQBrowserProvider; import software.aws.toolkits.eclipse.amazonq.util.ThemeDetector; -import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQCommonActions; public abstract class AmazonQView extends BaseAmazonQView { private AmazonQBrowserProvider browserProvider; - private AmazonQCommonActions amazonQCommonActions; private static final ThemeDetector THEME_DETECTOR = new ThemeDetector(); - private Disposable signOutActionAuthStateSubscription; - private Disposable feedbackDialogAuthStateSubscription; - private Disposable customizationDialogAuthStateSubscription; - private Disposable toggleAutoTriggerAuthStateSubscription; - - private IViewSite viewSite; - protected AmazonQView() { this.browserProvider = new AmazonQBrowserProvider(); } @@ -39,10 +26,6 @@ public final Browser getBrowser() { return browserProvider.getBrowser(); } - public final AmazonQCommonActions getAmazonQCommonActions() { - return amazonQCommonActions; - } - protected final void setupParentBackground(final Composite parent) { Display display = Display.getCurrent(); Color bg = THEME_DETECTOR.isDarkTheme() ? display.getSystemColor(SWT.COLOR_BLACK) @@ -77,8 +60,6 @@ public Composite setupView(final Composite parent) { if (browser != null && !browser.isDisposed()) { setupBrowserBackground(parent); - setupActions(); - setupAuthStatusListeners(); disableBrowserContextMenu(); } @@ -94,25 +75,6 @@ private void setupBrowserBackground(final Composite parent) { getBrowser().setBackground(bgColor); } - private void setupActions() { - amazonQCommonActions = new AmazonQCommonActions(viewSite); - } - - private void setupAuthStatusListeners() { - signOutActionAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, - amazonQCommonActions.getSignoutAction()); - feedbackDialogAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, - amazonQCommonActions.getFeedbackDialogContributionAction()); - customizationDialogAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, - amazonQCommonActions.getCustomizationDialogContributionAction()); - toggleAutoTriggerAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, - amazonQCommonActions.getToggleAutoTriggerContributionAction()); - } - - public final void setViewSite(final IViewSite viewSite) { - this.viewSite = viewSite; - } - public final void addFocusListener(final Composite parent, final Browser browser) { parent.addFocusListener(new FocusListener() { @Override @@ -137,19 +99,7 @@ public void focusLost(final FocusEvent event) { */ @Override public void dispose() { - if (signOutActionAuthStateSubscription != null && !signOutActionAuthStateSubscription.isDisposed()) { - signOutActionAuthStateSubscription.dispose(); - } - if (feedbackDialogAuthStateSubscription != null && !feedbackDialogAuthStateSubscription.isDisposed()) { - feedbackDialogAuthStateSubscription.dispose(); - } - if (customizationDialogAuthStateSubscription != null - && !customizationDialogAuthStateSubscription.isDisposed()) { - customizationDialogAuthStateSubscription.dispose(); - } - if (toggleAutoTriggerAuthStateSubscription != null && !toggleAutoTriggerAuthStateSubscription.isDisposed()) { - toggleAutoTriggerAuthStateSubscription.dispose(); - } + super.dispose(); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQViewContainer.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQViewContainer.java index 190d7d89a..76dcb030a 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQViewContainer.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQViewContainer.java @@ -15,10 +15,8 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.ui.part.ViewPart; -import io.reactivex.rxjava3.disposables.Disposable; import software.aws.toolkits.eclipse.amazonq.broker.api.EventObserver; import software.aws.toolkits.eclipse.amazonq.plugin.Activator; -import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQStaticActions; import software.aws.toolkits.eclipse.amazonq.views.router.AmazonQViewType; @@ -30,7 +28,6 @@ public final class AmazonQViewContainer extends ViewPart implements EventObserve private Map views; private AmazonQViewType activeViewType; private BaseAmazonQView currentView; - private Disposable activeViewTypeSubscription; private final ReentrantLock containerLock; public AmazonQViewContainer() { @@ -61,14 +58,9 @@ public void createPartControl(final Composite parent) { parentComposite = parent; - setupStaticMenuActions(); updateChildView(); } - private void setupStaticMenuActions() { - new AmazonQStaticActions(getViewSite()); - } - private void updateChildView() { Display.getDefault().asyncExec(() -> { try { @@ -86,10 +78,7 @@ private void updateChildView() { currentView.dispose(); } - if (activeViewType == AmazonQViewType.CHAT_VIEW - || activeViewType == AmazonQViewType.TOOLKIT_LOGIN_VIEW) { - ((AmazonQView) newView).setViewSite(getViewSite()); - } + newView.setViewSite(getViewSite()); Composite newViewComposite = newView.setupView(parentComposite); GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, true, true); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java index 92d8238a2..af20dc1ed 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java @@ -11,13 +11,58 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IViewSite; +import io.reactivex.rxjava3.disposables.Disposable; +import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState; import software.aws.toolkits.eclipse.amazonq.plugin.Activator; import software.aws.toolkits.eclipse.amazonq.util.PluginUtils; +import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQCommonActions; +import software.aws.toolkits.eclipse.amazonq.views.actions.AmazonQStaticActions; public abstract class BaseAmazonQView { + + private IViewSite viewSite; + + private AmazonQCommonActions amazonQCommonActions; + private AmazonQStaticActions amazonQStaticActions; + + private Disposable signOutActionAuthStateSubscription; + private Disposable feedbackDialogAuthStateSubscription; + private Disposable customizationDialogAuthStateSubscription; + private Disposable toggleAutoTriggerAuthStateSubscription; + public abstract Composite setupView(Composite parentComposite); - public abstract void dispose(); + + public final void setViewSite(final IViewSite viewSite) { + this.viewSite = viewSite; + } + + protected final void setupAmazonQCommonActions() { + if (viewSite == null) { + Activator.getLogger().info("View Site is null for creating AmazonQCommonActions"); + return; + } + + amazonQCommonActions = new AmazonQCommonActions(viewSite); + setupCommonActionAuthListeners(); + viewSite.getActionBars().updateActionBars(); + } + + protected final void setupAmazonQStaticActions() { + if (viewSite == null) { + Activator.getLogger().info("View Site is null for creating AmazonQStaticActions"); + return; + } + + amazonQStaticActions = new AmazonQStaticActions(viewSite); + viewSite.getActionBars().updateActionBars(); + + } + + protected final AmazonQCommonActions getAmazonQCommonActions() { + return amazonQCommonActions; + } protected final Image loadImage(final String imagePath) { Image loadedImage = null; @@ -40,4 +85,50 @@ protected final Font magnifyFontSize(final Composite parentComposite, final Font Font magnifiedFont = new Font(parentComposite.getDisplay(), fontData); return magnifiedFont; } + + private void setupCommonActionAuthListeners() { + signOutActionAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, + amazonQCommonActions.getSignoutAction()); + feedbackDialogAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, + amazonQCommonActions.getFeedbackDialogContributionAction()); + customizationDialogAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, + amazonQCommonActions.getCustomizationDialogContributionAction()); + toggleAutoTriggerAuthStateSubscription = Activator.getEventBroker().subscribe(AuthState.class, + amazonQCommonActions.getToggleAutoTriggerContributionAction()); + } + + /** + * Disposes of resources and cleans up subscriptions when the view is closed. + * This method ensures proper cleanup of authentication state subscriptions to prevent memory leaks. + * + * The following subscriptions are disposed: + * - Sign out action authentication state + * - Feedback dialog authentication state + * - Customization dialog authentication state + * - Auto-trigger toggle authentication state + * + * Each subscription is checked for null and disposal state before being disposed + * to prevent potential null pointer exceptions. + */ + public void dispose() { + if (signOutActionAuthStateSubscription != null && !signOutActionAuthStateSubscription.isDisposed()) { + signOutActionAuthStateSubscription.dispose(); + } + if (feedbackDialogAuthStateSubscription != null && !feedbackDialogAuthStateSubscription.isDisposed()) { + feedbackDialogAuthStateSubscription.dispose(); + } + if (customizationDialogAuthStateSubscription != null + && !customizationDialogAuthStateSubscription.isDisposed()) { + customizationDialogAuthStateSubscription.dispose(); + } + if (toggleAutoTriggerAuthStateSubscription != null && !toggleAutoTriggerAuthStateSubscription.isDisposed()) { + toggleAutoTriggerAuthStateSubscription.dispose(); + } + + if (amazonQCommonActions != null) { + amazonQCommonActions.dispose(); + amazonQCommonActions = null; + } + } + } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CallToActionView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CallToActionView.java index 6f385ec51..22871f4b6 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CallToActionView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/CallToActionView.java @@ -62,6 +62,8 @@ public final Composite setupView(final Composite parentComposite) { setupButton(container); setupButtonFooterContent(container); + setupAmazonQStaticActions(); + return container; } @@ -85,8 +87,8 @@ protected void updateButtonStyle(final Button button) { } @Override - public void dispose() { - // Default implementation - subclasses can override if they need to dispose of resources + public final void dispose() { + super.dispose(); } protected abstract String getIconPath(); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ChatAssetMissingView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ChatAssetMissingView.java index e6a043805..e0734e421 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ChatAssetMissingView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ChatAssetMissingView.java @@ -9,7 +9,6 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; -import software.aws.toolkits.eclipse.amazonq.util.ChatAssetProvider; public final class ChatAssetMissingView extends BaseAmazonQView { public static final String ID = "software.aws.toolkits.eclipse.amazonq.views.ChatAssetMissingView"; @@ -17,14 +16,9 @@ public final class ChatAssetMissingView extends BaseAmazonQView { private static final String ICON_PATH = "icons/AmazonQ64.png"; private static final String HEADER_LABEL = "Error loading Q chat."; private static final String DETAIL_MESSAGE = "Restart Eclipse or review error logs for troubleshooting"; - private ChatAssetProvider chatAssetProvider; private Image icon; private Composite container; - public ChatAssetMissingView() { - this.chatAssetProvider = new ChatAssetProvider(); - } - @Override public Composite setupView(final Composite parentComposite) { container = new Composite(parentComposite, SWT.NONE); @@ -62,14 +56,13 @@ public Composite setupView(final Composite parentComposite) { detailLabel.setText(DETAIL_MESSAGE); detailLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + setupAmazonQStaticActions(); + return container; } @Override public void dispose() { - if (chatAssetProvider != null) { - chatAssetProvider.dispose(); - chatAssetProvider = null; - } + super.dispose(); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/DependencyMissingView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/DependencyMissingView.java index c6f3b993d..bc76cd28f 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/DependencyMissingView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/DependencyMissingView.java @@ -72,7 +72,6 @@ protected void setupButtonFooterContent(final Composite composite) { private String getInstallUrl() { return platform == PluginPlatform.WINDOWS ? EDGE_INSTALL : WEBKIT_INSTALL; - } private String getLearnMoreUrl() { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java index f384436f9..3b2e5c052 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java @@ -21,10 +21,6 @@ public final class LspStartUpFailedView extends BaseAmazonQView { private Image icon; private Composite container; - public LspStartUpFailedView() { - // - } - @Override public Composite setupView(final Composite parentComposite) { container = new Composite(parentComposite, SWT.NONE); @@ -62,6 +58,8 @@ public Composite setupView(final Composite parentComposite) { detailLabel.setText(DETAIL_MESSAGE); detailLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + setupAmazonQStaticActions(); + return container; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java index 1340436b0..29a7a4a36 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java @@ -90,6 +90,8 @@ public Object function(final Object[] arguments) { browser.setText(content.get()); + setupAmazonQStaticActions(); + return parent; } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQCommonActions.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQCommonActions.java index f27ab6f33..4e768cbc8 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQCommonActions.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQCommonActions.java @@ -22,7 +22,7 @@ public final class AmazonQCommonActions { private ViewLogsAction viewLogsAction; private ReportAnIssueAction reportAnIssueAction; - private IActionBars bars; + private IMenuManager menuManager; public AmazonQCommonActions(final IViewSite viewSite) { createActions(viewSite); @@ -59,18 +59,18 @@ private void createActions(final IViewSite viewSite) { private void contributeToActionBars(final IViewSite viewSite) { IActionBars bars = viewSite.getActionBars(); - IMenuManager menuManager = bars.getMenuManager(); + menuManager = bars.getMenuManager(); IToolBarManager toolBarManager = bars.getToolBarManager(); menuManager.removeAll(); toolBarManager.removeAll(); bars.updateActionBars(); - fillLocalPullDown(menuManager); + fillLocalPullDown(); fillLocalToolBar(toolBarManager); } - private void fillLocalPullDown(final IMenuManager manager) { + private void fillLocalPullDown() { IMenuManager feedbackSubMenu = new MenuManager("Feedback"); feedbackSubMenu.add(reportAnIssueAction); feedbackSubMenu.add(feedbackDialogContributionItem.getDialogContributionItem()); @@ -81,19 +81,31 @@ private void fillLocalPullDown(final IMenuManager manager) { helpSubMenu.add(viewSourceAction); helpSubMenu.add(viewLogsAction); - manager.add(openCodeReferenceLogAction); - manager.add(new Separator()); - manager.add(toggleAutoTriggerContributionItem); - manager.add(customizationDialogContributionItem); - manager.add(new Separator()); - manager.add(feedbackSubMenu); - manager.add(helpSubMenu); - manager.add(new Separator()); - manager.add(signoutAction); + menuManager.add(openCodeReferenceLogAction); + menuManager.add(new Separator()); + menuManager.add(toggleAutoTriggerContributionItem); + menuManager.add(customizationDialogContributionItem); + menuManager.add(new Separator()); + menuManager.add(feedbackSubMenu); + menuManager.add(helpSubMenu); + menuManager.add(new Separator()); + menuManager.add(signoutAction); } private void fillLocalToolBar(final IToolBarManager manager) { // No actions added to the view toolbar at this time } + public void dispose() { + if (toggleAutoTriggerContributionItem != null) { + toggleAutoTriggerContributionItem.dispose(); + toggleAutoTriggerContributionItem = null; + } + + if (menuManager != null) { + menuManager.dispose(); + menuManager = null; + } + } + } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/ToggleAutoTriggerContributionItem.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/ToggleAutoTriggerContributionItem.java index 5f95e7616..e997db3f3 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/ToggleAutoTriggerContributionItem.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/ToggleAutoTriggerContributionItem.java @@ -79,8 +79,16 @@ public void widgetSelected(final SelectionEvent e) { @Override public void dispose() { - pause.dispose(); - resume.dispose(); + if (pause != null) { + pause.dispose(); + pause = null; + } + + if (resume != null) { + resume.dispose(); + resume = null; + } + super.dispose(); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/router/ViewRouter.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/router/ViewRouter.java index 7d63ee215..88758cb53 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/router/ViewRouter.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/router/ViewRouter.java @@ -104,7 +104,7 @@ private void refreshActiveView(final PluginState pluginState) { if (pluginState.browserCompatibilityState() == BrowserCompatibilityState.DEPENDENCY_MISSING) { newActiveView = AmazonQViewType.DEPENDENCY_MISSING_VIEW; - } else if (pluginState.lspState().hasFailed()) { + } else if (pluginState.lspState() == LspState.FAILED) { newActiveView = AmazonQViewType.LSP_STARTUP_FAILED_VIEW; } else if (pluginState.chatWebViewAssetState() == ChatWebViewAssetState.DEPENDENCY_MISSING || pluginState.toolkitLoginWebViewAssetState() == ToolkitLoginWebViewAssetState.DEPENDENCY_MISSING) { From 0427fde5f4ee954c76d7b8d72a2e6d70360375f9 Mon Sep 17 00:00:00 2001 From: Ishan Taldekar Date: Mon, 17 Feb 2025 14:27:32 -0500 Subject: [PATCH 2/4] Improve disposal logic --- .../amazonq/views/BaseAmazonQView.java | 25 ++++++++++++++----- .../amazonq/views/LspStartUpFailedView.java | 2 +- .../views/actions/AmazonQStaticActions.java | 18 ++++++++++--- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java index af20dc1ed..00afc4fda 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java @@ -64,6 +64,10 @@ protected final AmazonQCommonActions getAmazonQCommonActions() { return amazonQCommonActions; } + protected final AmazonQStaticActions getAmazonQStaticActions() { + return amazonQStaticActions; + } + protected final Image loadImage(final String imagePath) { Image loadedImage = null; try { @@ -111,23 +115,32 @@ private void setupCommonActionAuthListeners() { * to prevent potential null pointer exceptions. */ public void dispose() { + if (amazonQCommonActions != null) { + amazonQCommonActions.dispose(); + amazonQCommonActions = null; + } + + if (amazonQStaticActions != null) { + amazonQStaticActions.dispose(); + amazonQStaticActions = null; + } + if (signOutActionAuthStateSubscription != null && !signOutActionAuthStateSubscription.isDisposed()) { signOutActionAuthStateSubscription.dispose(); + signOutActionAuthStateSubscription = null; } if (feedbackDialogAuthStateSubscription != null && !feedbackDialogAuthStateSubscription.isDisposed()) { - feedbackDialogAuthStateSubscription.dispose(); + signOutActionAuthStateSubscription.dispose(); + signOutActionAuthStateSubscription = null; } if (customizationDialogAuthStateSubscription != null && !customizationDialogAuthStateSubscription.isDisposed()) { customizationDialogAuthStateSubscription.dispose(); + customizationDialogAuthStateSubscription = null; } if (toggleAutoTriggerAuthStateSubscription != null && !toggleAutoTriggerAuthStateSubscription.isDisposed()) { toggleAutoTriggerAuthStateSubscription.dispose(); - } - - if (amazonQCommonActions != null) { - amazonQCommonActions.dispose(); - amazonQCommonActions = null; + toggleAutoTriggerAuthStateSubscription = null; } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java index 3b2e5c052..30350858e 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/LspStartUpFailedView.java @@ -65,7 +65,7 @@ public Composite setupView(final Composite parentComposite) { @Override public void dispose() { - //default implementation + super.dispose(); } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQStaticActions.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQStaticActions.java index f84e2760c..cf16cc606 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQStaticActions.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/actions/AmazonQStaticActions.java @@ -15,6 +15,8 @@ public final class AmazonQStaticActions { private ViewLogsAction viewLogsAction; private ReportAnIssueAction reportAnIssueAction; + private IMenuManager menuManager; + public AmazonQStaticActions(final IViewSite viewSite) { createActions(viewSite); contributeToActionBars(viewSite); @@ -29,10 +31,11 @@ private void createActions(final IViewSite viewSite) { private void contributeToActionBars(final IViewSite viewSite) { IActionBars bars = viewSite.getActionBars(); - fillLocalPullDown(bars.getMenuManager()); + menuManager = bars.getMenuManager(); + fillLocalPullDown(); } - private void fillLocalPullDown(final IMenuManager manager) { + private void fillLocalPullDown() { IMenuManager feedbackSubMenu = new MenuManager("Feedback"); feedbackSubMenu.add(reportAnIssueAction); @@ -42,8 +45,15 @@ private void fillLocalPullDown(final IMenuManager manager) { helpSubMenu.add(viewSourceAction); helpSubMenu.add(viewLogsAction); - manager.add(feedbackSubMenu); - manager.add(helpSubMenu); + menuManager.add(feedbackSubMenu); + menuManager.add(helpSubMenu); + } + + public void dispose() { + if (menuManager != null) { + menuManager.dispose(); + menuManager = null; + } } } From d0451de4bcf94eff85376c2325ee4b52d540ad14 Mon Sep 17 00:00:00 2001 From: Ishan Taldekar Date: Mon, 17 Feb 2025 16:11:39 -0500 Subject: [PATCH 3/4] Fix minor bugs --- .../aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java | 4 ++-- .../toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java index 00afc4fda..7080d8ead 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java @@ -130,8 +130,8 @@ public void dispose() { signOutActionAuthStateSubscription = null; } if (feedbackDialogAuthStateSubscription != null && !feedbackDialogAuthStateSubscription.isDisposed()) { - signOutActionAuthStateSubscription.dispose(); - signOutActionAuthStateSubscription = null; + feedbackDialogAuthStateSubscription.dispose(); + feedbackDialogAuthStateSubscription = null; } if (customizationDialogAuthStateSubscription != null && !customizationDialogAuthStateSubscription.isDisposed()) { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java index 29a7a4a36..5b3499ca6 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java @@ -90,7 +90,7 @@ public Object function(final Object[] arguments) { browser.setText(content.get()); - setupAmazonQStaticActions(); + setupAmazonQCommonActions(); return parent; } From af9f60ffb30a9fb368d1f28b2e598646e65b1b46 Mon Sep 17 00:00:00 2001 From: Ishan Taldekar Date: Mon, 17 Feb 2025 16:11:39 -0500 Subject: [PATCH 4/4] Fix minor bugs --- .../aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java index 7080d8ead..9d3eddb0b 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/BaseAmazonQView.java @@ -57,7 +57,6 @@ protected final void setupAmazonQStaticActions() { amazonQStaticActions = new AmazonQStaticActions(viewSite); viewSite.getActionBars().updateActionBars(); - } protected final AmazonQCommonActions getAmazonQCommonActions() { @@ -129,15 +128,18 @@ public void dispose() { signOutActionAuthStateSubscription.dispose(); signOutActionAuthStateSubscription = null; } + if (feedbackDialogAuthStateSubscription != null && !feedbackDialogAuthStateSubscription.isDisposed()) { feedbackDialogAuthStateSubscription.dispose(); feedbackDialogAuthStateSubscription = null; } + if (customizationDialogAuthStateSubscription != null && !customizationDialogAuthStateSubscription.isDisposed()) { customizationDialogAuthStateSubscription.dispose(); customizationDialogAuthStateSubscription = null; } + if (toggleAutoTriggerAuthStateSubscription != null && !toggleAutoTriggerAuthStateSubscription.isDisposed()) { toggleAutoTriggerAuthStateSubscription.dispose(); toggleAutoTriggerAuthStateSubscription = null;