Skip to content

Commit

Permalink
Integrate browser based views in ViewContainer (#359)
Browse files Browse the repository at this point in the history
* Pass populated AWS_CA_BUNDLE env var to Flare (#341)

* Add UI notification to alert user of deprecated manifest version (#312)

* Revert commit 'Add UI notification to alert user of deprecated manifest version'

* Revert 'Pass populated AWS_CA_BUNDLE env var to Flare'

* Rebase changes from Browser Provider PR

* Fix ViewRouter

* Integrate browser based views in ViewContainer

* Fix checkstyle issues

* Fix AmazonQBrowserProvider tests

* Fix bug due to display sync exec call

* Add semaphore locking to container to prevent race conditions

* Add browser focus handling

* Add state checking methods to LspState

* Clean up code

* Remove unnecessary parent assignment from chat webview

* Refactor ViewVisibilityManager to default to one view

* Add accidentally removed telemetry emissions

* Update plugin descriptor (#360)

* Move semaphore locking/unlocking to try/finally block

---------

Co-authored-by: Jonathan Breedlove <[email protected]>
Co-authored-by: Nicolas <[email protected]>
  • Loading branch information
3 people authored Feb 12, 2025
1 parent 5dc56b9 commit c29e968
Show file tree
Hide file tree
Showing 24 changed files with 297 additions and 469 deletions.
88 changes: 3 additions & 85 deletions plugin/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,6 @@
name="Amazon Q"
icon="icons/AmazonQ.png">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView"
name="Amazon Q"
icon="icons/AmazonQ.png"
class="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView"
name="Amazon Q"
icon="icons/AmazonQ.png"
class="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview"
name="Amazon Q"
icon="icons/AmazonQ.png"
class="software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview"
category="amazonq"
inject="true">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.AmazonQChatWebview"
name="Amazon Q"
icon="icons/AmazonQ.png"
class="software.aws.toolkits.eclipse.amazonq.views.AmazonQChatWebview"
inject="true">
</view>
<view
class="software.aws.toolkits.eclipse.amazonq.views.AmazonQCodeReferenceView"
icon="icons/AmazonQ.png"
Expand All @@ -59,40 +32,15 @@
<extension point="org.eclipse.ui.activities">
<!-- These activities and activityPatternBindings prevent the view from showing up in the Show View menu. Logic exists that will filter these views out. -->
<!-- ToolkitLoginWebview is intentionally excluded here as this should be the only view that should show in the menu. -->
<activity id="software.aws.toolkits.eclipse.amazonq.activity.AmazonQChatWebview" name="Amazon Q Chat">
</activity>
<activity id="software.aws.toolkits.eclipse.amazonq.activity.AmazonQCodeReferenceView" name="Amazon Q Code Reference">
</activity>
<activity id="software.aws.toolkits.eclipse.amazonq.activity.DependencyMissingView" name="Amazon Q Dependency Missing">
</activity>
<activity id="software.aws.toolkits.eclipse.amazonq.activity.ReauthenticateView" name="Amazon Q Reauthenticate">
</activity>
<activity id="software.aws.toolkits.eclipse.amazonq.activity.ChatAssetMissingView" name="Amazon Q Chat Missing">
</activity>
<activityPatternBinding
activityId="software.aws.toolkits.eclipse.amazonq.activity.AmazonQChatWebview"
isEqualityPattern="true"
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.AmazonQChatWebview">
</activityPatternBinding>
<activityPatternBinding
activityId="software.aws.toolkits.eclipse.amazonq.activity.AmazonQCodeReferenceView"
isEqualityPattern="true"
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.AmazonQCodeReferenceView">
</activityPatternBinding>
<activityPatternBinding
activityId="software.aws.toolkits.eclipse.amazonq.activity.DependencyMissingView"
isEqualityPattern="true"
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.DependencyMissingView">
</activityPatternBinding>
<activityPatternBinding
activityId="software.aws.toolkits.eclipse.amazonq.activity.ReauthenticateView"
activityId="software.aws.toolkits.eclipse.amazonq.activity.AmazonQViewContainer"
isEqualityPattern="true"
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.ReauthenticateView">
</activityPatternBinding>
<activityPatternBinding
activityId="software.aws.toolkits.eclipse.amazonq.activity.ChatAssetMissingView"
isEqualityPattern="true"
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.ChatAssetMissingView">
pattern="amazon-q-eclipse/software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer">
</activityPatternBinding>
</extension>
<extension
Expand All @@ -106,36 +54,6 @@
relationship="right"
visible="false">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview"
relative="software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer"
relationship="stack"
visible="false">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.AmazonQChatWebview"
relative="software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer"
relationship="stack"
visible="false">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.AmazonQCodeReferenceView"
relative="software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer"
relationship="stack"
visible="false">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView"
relative="software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview"
relationship="stack"
visible="false">
</view>
<view
id="software.aws.toolkits.eclipse.amazonq.views.LspStartUpFailedView"
relative="software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview"
relationship="stack"
visible="false">
</view>
</perspectiveExtension>
</extension>
<extension
Expand Down Expand Up @@ -381,7 +299,7 @@
<equals value="org.eclipse.ui.DefaultTextEditor"/>
<equals value="org.eclipse.jdt.ui.CompilationUnitEditor"/>
<equals value="org.eclipse.ui.genericeditor.GenericEditor"/>
<equals value="software.aws.toolkits.eclipse.amazonq.views.AmazonQChatWebview" />
<equals value="software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer"/>
</or>
</with>
</and>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ private void sendGenericCommand(final String selection, final String genericComm

private void openQChat() {
Display.getDefault().syncExec(() -> {
ViewVisibilityManager.showChatView("shortcut");
ViewVisibilityManager.showDefaultView("shortcut");
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;

import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspStatusManager;
import software.aws.toolkits.eclipse.amazonq.views.ViewVisibilityManager;

public class QOpenLoginViewHandler extends AbstractHandler {
@Override
public final Object execute(final ExecutionEvent event) {
ViewVisibilityManager.showViewContainer("statusBar");
ViewVisibilityManager.showDefaultView("statusBar");
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,27 @@
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.lsp4e.LanguageServersRegistry;
import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.mylyn.commons.ui.dialogs.AbstractNotificationPopup;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IStartup;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

import software.aws.toolkits.eclipse.amazonq.util.Constants;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerDocumentListener;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerPartListener;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerTopLevelListener;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.telemetry.ToolkitTelemetryProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata;
import software.aws.toolkits.eclipse.amazonq.views.ViewConstants;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerDocumentListener;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerPartListener;
import software.aws.toolkits.eclipse.amazonq.util.AutoTriggerTopLevelListener;
import software.aws.toolkits.eclipse.amazonq.util.Constants;
import software.aws.toolkits.eclipse.amazonq.util.ToolkitNotification;
import software.aws.toolkits.eclipse.amazonq.util.UpdateUtils;
import org.eclipse.mylyn.commons.ui.dialogs.AbstractNotificationPopup;
import software.aws.toolkits.eclipse.amazonq.views.ViewConstants;
import software.aws.toolkits.eclipse.amazonq.views.ViewVisibilityManager;
import software.aws.toolkits.eclipse.amazonq.views.actions.ToggleAutoTriggerContributionItem;
import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.lsp4e.LanguageServersRegistry;

@SuppressWarnings("restriction")
public class LspStartupActivity implements IStartup {
Expand Down Expand Up @@ -73,22 +72,24 @@ protected IStatus run(final IProgressMonitor monitor) {
}

private void launchWebview() {
String viewId = "software.aws.toolkits.eclipse.amazonq.views.ToolkitLoginWebview";
String viewId = "software.aws.toolkits.eclipse.amazonq.views.AmazonQViewContainer";

IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
try {
showTelemetryNotification();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
IWorkbenchPage page = window.getActivePage();
page.showView(viewId);
ToolkitTelemetryProvider.emitOpenModuleEventMetric(viewId, "firstStartUp", "none");
Activator.getPluginStore().put(ViewConstants.PREFERENCE_STORE_PLUGIN_FIRST_STARTUP_KEY, "true");
}
} catch (PartInitException e) {
ViewVisibilityManager.showDefaultView("launch");
} catch (Exception e) {
Activator.getLogger().warn("Error occurred during auto loading of plugin", e);
ToolkitTelemetryProvider.emitOpenModuleEventMetric(viewId, "firstStartUp", ExceptionMetadata.scrubException("Plugin load error", e));
ToolkitTelemetryProvider.emitOpenModuleEventMetric(viewId, "firstStartUp",
ExceptionMetadata.scrubException("Plugin load error", e));
}
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,19 @@
package software.aws.toolkits.eclipse.amazonq.lsp.manager;

public enum LspState {
ACTIVE,
FAILED,
PENDING

ACTIVE, FAILED, PENDING;

public boolean hasFailed() {
return this == FAILED;
}

public boolean isActive() {
return this == ACTIVE;
}

public boolean isPending() {
return this == PENDING;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ public void setToActive() {

public void setToFailed() {
if (lspState != LspState.FAILED) {
ViewVisibilityManager.showLspStartUpFailedView("update");
lspState = LspState.FAILED;
Activator.getEventBroker().post(LspState.class, lspState);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProviderImpl;
import software.aws.toolkits.eclipse.amazonq.telemetry.service.DefaultTelemetryService;
import software.aws.toolkits.eclipse.amazonq.telemetry.service.TelemetryService;
import software.aws.toolkits.eclipse.amazonq.util.PluginLogger;
import software.aws.toolkits.eclipse.amazonq.util.CodeReferenceLoggingService;
import software.aws.toolkits.eclipse.amazonq.util.DefaultCodeReferenceLoggingService;
import software.aws.toolkits.eclipse.amazonq.util.LoggingService;
import software.aws.toolkits.eclipse.amazonq.util.PluginLogger;
import software.aws.toolkits.eclipse.amazonq.views.router.ViewRouter;

public class Activator extends AbstractUIPlugin {

Expand All @@ -33,6 +34,8 @@ public class Activator extends AbstractUIPlugin {
private static PluginStore pluginStore;
private static EventBroker eventBroker = new EventBroker();

private static ViewRouter viewRouter = ViewRouter.builder().build();

public Activator() {
super();
plugin = this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import software.aws.toolkits.eclipse.amazonq.util.ObjectMapperFactory;
import software.aws.toolkits.eclipse.amazonq.util.WebviewAssetServer;

public class ChatWebViewAssetProvider extends WebViewAssetProvider {
public final class ChatWebViewAssetProvider extends WebViewAssetProvider {

private WebviewAssetServer webviewAssetServer;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
Expand All @@ -23,8 +24,8 @@ public AmazonQBrowserProvider() {
}
// Test constructor that accepts a platform
public AmazonQBrowserProvider(final PluginPlatform platform) {
this.pluginPlatform = platform;
publishBrowserCompatibilityState();
this.pluginPlatform = platform;
Display.getDefault().asyncExec(this::publishBrowserCompatibilityState);
}

/*
Expand Down Expand Up @@ -63,6 +64,10 @@ public final int getBrowserStyle() {
*/
public final boolean setupBrowser(final Composite parent) {
var browser = new Browser(parent, getBrowserStyle());

GridData layoutData = new GridData(GridData.FILL_BOTH);
browser.setLayoutData(layoutData);

checkWebViewCompatibility(browser.getBrowserType());
// only set the browser if compatible webview browser can be found for the
// platform
Expand All @@ -89,7 +94,7 @@ public final void updateBrowser(final Browser browser) {
this.browser = browser;
}

private void publishBrowserCompatibilityState() {
protected final void publishBrowserCompatibilityState() {
Display display = Display.getDefault();
Shell shell = display.getActiveShell();
if (shell == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,26 @@
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;

import com.fasterxml.jackson.databind.JsonNode;

import software.aws.toolkits.eclipse.amazonq.chat.ChatCommunicationManager;
import software.aws.toolkits.eclipse.amazonq.chat.models.CursorState;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

import com.fasterxml.jackson.databind.JsonNode;

import software.aws.toolkits.eclipse.amazonq.chat.ChatCommunicationManager;
import software.aws.toolkits.eclipse.amazonq.chat.models.CopyToClipboardParams;
import software.aws.toolkits.eclipse.amazonq.chat.models.CursorState;
import software.aws.toolkits.eclipse.amazonq.chat.models.InfoLinkClickParams;
import software.aws.toolkits.eclipse.amazonq.chat.models.InsertToCursorPositionParams;
import software.aws.toolkits.eclipse.amazonq.configuration.PluginStoreKeys;
import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthFollowUpClickedParams;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthFollowUpType;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.util.Constants;
import software.aws.toolkits.eclipse.amazonq.util.JsonHandler;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;
import software.aws.toolkits.eclipse.amazonq.util.QEclipseEditorUtils;
import software.aws.toolkits.eclipse.amazonq.views.model.Command;
Expand Down Expand Up @@ -195,9 +194,6 @@ private void handleAuthFollowUpClicked(final AuthFollowUpClickedParams params) {
try {
if (incomingType.equals(fullAuth) || incomingType.equals(useSupportedAuth)) {
Activator.getLoginService().logout();
Display.getDefault().asyncExec(() -> {
ViewVisibilityManager.showLoginView("update");
});
return;
}
} catch (Exception ex) {
Expand Down
Loading

0 comments on commit c29e968

Please sign in to comment.