Skip to content

Commit

Permalink
Add Browser Provider component (#357)
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)

* Add webview dependency missing logic to ViewRouter

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

* Revert 'Pass populated AWS_CA_BUNDLE env var to Flare'

---------

Co-authored-by: Jonathan Breedlove <[email protected]>
Co-authored-by: Nicolas <[email protected]>
  • Loading branch information
3 people authored Feb 7, 2025
1 parent 68ee9c5 commit 4ec1937
Show file tree
Hide file tree
Showing 24 changed files with 111 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.model.UpdateCredentialsPayload;
import software.aws.toolkits.eclipse.amazonq.lsp.model.UpdateCredentialsPayloadData;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;

public final class DefaultAuthCredentialsService implements AuthCredentialsService {
private LspProvider lspProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.UpdateProfileOptions;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.UpdateProfileParams;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
import software.aws.toolkits.eclipse.amazonq.util.Constants;

public final class DefaultAuthTokenService implements AuthTokenService {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.LoginType;
import software.aws.toolkits.eclipse.amazonq.lsp.encryption.DefaultLspEncryptionManager;
import software.aws.toolkits.eclipse.amazonq.lsp.encryption.LspEncryptionManager;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.util.AuthUtil;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;

/**
* Core authentication service for the Amazon Q Eclipse plugin that manages
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.manager.fetcher.RecordLspSetupArgs;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.preferences.AmazonQPreferencePage;
import software.aws.toolkits.eclipse.amazonq.providers.LspManagerProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspManagerProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.LanguageServerTelemetryProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.metadata.ExceptionMetadata;
import software.aws.toolkits.eclipse.amazonq.util.ProxyUtil;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public final class LspStatusManager {

private LspStatusManager() {
lspState = LspState.PENDING;
Activator.getEventBroker().post(lspState);
Activator.getEventBroker().post(LspState.class, lspState);
}

public static LspStatusManager getInstance() {
Expand All @@ -31,15 +31,15 @@ public boolean lspFailed() {

public void setToActive() {
lspState = LspState.ACTIVE;
Activator.getEventBroker().post(lspState);
Activator.getEventBroker().post(LspState.class, lspState);
ViewVisibilityManager.showDefaultView("restart");
}

public void setToFailed() {
if (lspState != LspState.FAILED) {
ViewVisibilityManager.showLspStartUpFailedView("update");
lspState = LspState.FAILED;
Activator.getEventBroker().post(lspState);
Activator.getEventBroker().post(LspState.class, lspState);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import software.aws.toolkits.eclipse.amazonq.configuration.PluginStore;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.DefaultLoginService;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.LoginService;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.LspProviderImpl;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.controllers;
package software.aws.toolkits.eclipse.amazonq.providers.browser;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform;
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;

public class AmazonQViewController {
public class AmazonQBrowserProvider {
private boolean hasWebViewDependency = false;
private PluginPlatform pluginPlatform;
private Browser browser;

public AmazonQViewController() {
public AmazonQBrowserProvider() {
this(PluginUtils.getPlatform());
}
// Test constructor that accepts a platform
public AmazonQViewController(final PluginPlatform platform) {
public AmazonQBrowserProvider(final PluginPlatform platform) {
this.pluginPlatform = platform;
publishBrowserCompatibilityState();
}

/*
Expand All @@ -41,6 +44,11 @@ public final boolean checkWebViewCompatibility(final String browserType) {
Activator.getLogger()
.info("Browser detected:" + browserType + " is not of expected type: " + expectedType);
}

Activator.getEventBroker().post(BrowserCompatibilityState.class,
hasWebViewDependency ? BrowserCompatibilityState.COMPATIBLE
: BrowserCompatibilityState.DEPENDENCY_MISSING);

return this.hasWebViewDependency;
}

Expand Down Expand Up @@ -80,4 +88,19 @@ public final boolean hasWebViewDependency() {
public final void updateBrowser(final Browser browser) {
this.browser = browser;
}

private void publishBrowserCompatibilityState() {
Display display = Display.getDefault();
Shell shell = display.getActiveShell();
if (shell == null) {
shell = new Shell(display);
}

Composite parent = new Composite(shell, SWT.NONE);
parent.setVisible(false);

setupBrowser(parent);
parent.dispose();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.providers.browser;

public enum BrowserCompatibilityState {
COMPATIBLE, DEPENDENCY_MISSING;

public boolean isDependencyMissing() {
return this == DEPENDENCY_MISSING;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.providers;
package software.aws.toolkits.eclipse.amazonq.providers.lsp;

import software.aws.toolkits.eclipse.amazonq.lsp.manager.DefaultLspManager;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspConstants;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.providers;
package software.aws.toolkits.eclipse.amazonq.providers.lsp;

import org.eclipse.lsp4j.services.LanguageServer;
import java.util.concurrent.CompletableFuture;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.eclipse.amazonq.providers;
package software.aws.toolkits.eclipse.amazonq.providers.lsp;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.Optional;

import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspManagerProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspManagerProvider;

public final class ChatAssetProvider {
private WebviewAssetServer webviewAssetServer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,22 @@

import io.reactivex.rxjava3.disposables.Disposable;
import software.aws.toolkits.eclipse.amazonq.broker.api.EventObserver;
import software.aws.toolkits.eclipse.amazonq.controllers.AmazonQViewController;
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 ViewPart implements EventObserver<AuthState> {

private AmazonQViewController viewController;
private AmazonQBrowserProvider viewController;
private AmazonQCommonActions amazonQCommonActions;
private static final ThemeDetector THEME_DETECTOR = new ThemeDetector();

private Disposable authStateSubscription;

protected AmazonQView() {
this.viewController = new AmazonQViewController();
this.viewController = new AmazonQBrowserProvider();
}

public final Browser getBrowser() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspState;
import software.aws.toolkits.eclipse.amazonq.providers.browser.BrowserCompatibilityState;

public record PluginState(AuthState authState, LspState lspState) {
public record PluginState(AuthState authState, LspState lspState, BrowserCompatibilityState browserCompatibilityState) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.AuthState;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspState;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.browser.BrowserCompatibilityState;

/**
* Routes to appropriate views based on the combined auth and lsp states (plugin
Expand Down Expand Up @@ -37,12 +38,19 @@ private ViewRouter(final Builder builder) {
builder.lspStateObservable = Activator.getEventBroker().ofObservable(LspState.class);
}

if (builder.browserCompatibilityState == null) {
builder.browserCompatibilityState = Activator.getEventBroker()
.ofObservable(BrowserCompatibilityState.class);
}

/*
* Combine auth and lsp streams and publish combined state updates on changes to
* either stream consisting of the latest events from both streams (this will
* happen only after one event has been published to both streams):
*/
Observable.combineLatest(builder.authStateObservable, builder.lspStateObservable, PluginState::new)
Observable
.combineLatest(builder.authStateObservable, builder.lspStateObservable,
builder.browserCompatibilityState, PluginState::new)
.observeOn(Schedulers.computation()).subscribe(this::onEvent);
}

Expand Down Expand Up @@ -75,7 +83,7 @@ public void onEvent(final PluginState pluginState) {
private void refreshActiveView(final PluginState pluginState) {
AmazonQViewType newActiveView;

if (isDependencyMissing()) { // TODO: dependency missing check logic needs to be implemented
if (pluginState.browserCompatibilityState().isDependencyMissing()) {
newActiveView = AmazonQViewType.DEPENDENCY_MISSING_VIEW;
} else if (pluginState.lspState() == LspState.FAILED) {
newActiveView = AmazonQViewType.LSP_STARTUP_FAILED_VIEW;
Expand Down Expand Up @@ -112,16 +120,6 @@ private void notifyActiveViewChange() {
Activator.getEventBroker().post(AmazonQViewType.class, activeView);
}

/**
* Checks if browsers available are compatible or is dependency missing.
* TODO: Implement actual dependency checking logic
*
* @return true if dependencies are missing, false otherwise
*/
private boolean isDependencyMissing() {
return false;
}

/**
* Checks if required chat UI assets are missing.
* TODO: Implement actual asset checking logic
Expand All @@ -136,6 +134,7 @@ public static final class Builder {

private Observable<AuthState> authStateObservable;
private Observable<LspState> lspStateObservable;
private Observable<BrowserCompatibilityState> browserCompatibilityState;

public Builder withAuthStateObservable(final Observable<AuthState> authStateObservable) {
this.authStateObservable = authStateObservable;
Expand All @@ -147,6 +146,12 @@ public Builder withLspStateObservable(final Observable<LspState> lspStateObserva
return this;
}

public Builder withBrowserCompatibilityStateObservable(
final Observable<BrowserCompatibilityState> browserCompatibilityState) {
this.browserCompatibilityState = browserCompatibilityState;
return this;
}

public ViewRouter build() {
return new ViewRouter(this);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,19 @@
import org.junit.jupiter.params.provider.MethodSource;

import software.aws.toolkits.eclipse.amazonq.extensions.implementation.ActivatorStaticMockExtension;
import software.aws.toolkits.eclipse.amazonq.providers.browser.AmazonQBrowserProvider;
import software.aws.toolkits.eclipse.amazonq.util.PluginPlatform;

public final class AmazonQViewControllerTest {
private AmazonQViewController viewController;
private AmazonQBrowserProvider viewController;

@RegisterExtension
private static ActivatorStaticMockExtension activatorExtension = new ActivatorStaticMockExtension();

@ParameterizedTest
@MethodSource("provideBrowserStyleData")
public void getBrowserStyle(final PluginPlatform platform, final int expectedStyle) {
viewController = new AmazonQViewController(platform);
viewController = new AmazonQBrowserProvider(platform);
assertEquals(expectedStyle, viewController.getBrowserStyle());
}

Expand All @@ -39,7 +40,7 @@ private static Stream<Arguments> provideBrowserStyleData() {
@ParameterizedTest
@MethodSource("provideCompatibilityData")
void checkWebViewCompatibility(final PluginPlatform platform, final String browserType, final boolean expectedResult) {
viewController = new AmazonQViewController(platform);
viewController = new AmazonQBrowserProvider(platform);

assertFalse(viewController.hasWebViewDependency());
viewController.checkWebViewCompatibility(browserType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer;
import software.aws.toolkits.eclipse.amazonq.lsp.model.GetConfigurationFromServerParams;
import software.aws.toolkits.eclipse.amazonq.lsp.model.LspServerConfigurations;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
import software.aws.toolkits.eclipse.amazonq.util.LoggingService;
import org.eclipse.lsp4j.DidChangeConfigurationParams;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import software.aws.toolkits.eclipse.amazonq.extensions.api.StaticMockExtension;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.LoginService;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
import software.aws.toolkits.eclipse.amazonq.telemetry.service.TelemetryService;
import software.aws.toolkits.eclipse.amazonq.util.CodeReferenceLoggingService;
import software.aws.toolkits.eclipse.amazonq.util.LoggingService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
import software.aws.toolkits.eclipse.amazonq.extensions.api.StaticMockExtension;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspInstallResult;
import software.aws.toolkits.eclipse.amazonq.lsp.manager.LspManager;
import software.aws.toolkits.eclipse.amazonq.providers.LspManagerProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspManagerProvider;

import static org.mockito.Mockito.mockStatic;

import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer;
import software.aws.toolkits.eclipse.amazonq.lsp.encryption.LspEncryptionManager;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;

public class DefaultAuthCredentialsServiceTest {
private static DefaultAuthCredentialsService authCredentialsService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.UpdateProfileOptions;
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.UpdateProfileParams;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
import software.aws.toolkits.eclipse.amazonq.util.Constants;
import software.aws.toolkits.eclipse.amazonq.util.LoggingService;
import software.aws.toolkits.eclipse.amazonq.util.QConstants;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.auth.model.SsoToken;
import software.aws.toolkits.eclipse.amazonq.lsp.encryption.LspEncryptionManager;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;
import software.aws.toolkits.eclipse.amazonq.util.AuthUtil;
import software.aws.toolkits.eclipse.amazonq.util.Constants;
import software.aws.toolkits.eclipse.amazonq.util.LoggingService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
import software.aws.toolkits.eclipse.amazonq.lsp.model.InlineCompletionResponse;
import software.aws.toolkits.eclipse.amazonq.lsp.model.InlineCompletionTriggerKind;
import software.aws.toolkits.eclipse.amazonq.plugin.Activator;
import software.aws.toolkits.eclipse.amazonq.providers.LspProvider;
import software.aws.toolkits.eclipse.amazonq.providers.lsp.LspProvider;

public class QInvocationSessionTest {

Expand Down
Loading

0 comments on commit 4ec1937

Please sign in to comment.