Add public install link for WDP.

Bug: 349606136
Test: npm run test:unit:ci
Change-Id: Ic0bd5bb3605a05f2dd5d92688093df1eee0e60e9
diff --git a/tools/winscope/src/app/components/wdp_setup_component.ts b/tools/winscope/src/app/components/wdp_setup_component.ts
index 0916441..76f59fa 100644
--- a/tools/winscope/src/app/components/wdp_setup_component.ts
+++ b/tools/winscope/src/app/components/wdp_setup_component.ts
@@ -36,11 +36,15 @@
             Please check you have Web Device Proxy installed.
           </p>
         </div>
-
         <div class="further-adb-info-actions">
           <button
             color="primary"
             mat-stroked-button
+            class="install"
+            (click)="onInstallButtonClick()">Install Web Device Proxy</button>
+          <button
+            color="primary"
+            mat-stroked-button
             class="retry"
             (click)="onRetryButtonClick()">Retry</button>
         </div>
@@ -72,6 +76,13 @@
   @Input() state: ConnectionState | undefined;
   @Output() readonly retryConnection = new EventEmitter();
 
+  onInstallButtonClick() {
+    window.open(
+      'https://tools.google.com/dlpage/android_web_device_proxy',
+      '_blank',
+    );
+  }
+
   onRetryButtonClick() {
     this.retryConnection.emit();
   }
diff --git a/tools/winscope/src/app/components/wdp_setup_component_test.ts b/tools/winscope/src/app/components/wdp_setup_component_test.ts
index b337165..46bfff7 100644
--- a/tools/winscope/src/app/components/wdp_setup_component_test.ts
+++ b/tools/winscope/src/app/components/wdp_setup_component_test.ts
@@ -55,6 +55,7 @@
       htmlElement.querySelector('.connecting-message')?.textContent,
     ).toContain('Connecting...');
     expect(htmlElement.querySelector('.retry')).toBeNull();
+    expect(htmlElement.querySelector('.install')).toBeNull();
   });
 
   it('correct icon and message displays if no proxy', () => {
@@ -67,7 +68,17 @@
       "Failed to connect. Web Device Proxy doesn't seem to be running.",
     );
     expect(text).toContain('Please check you have Web Device Proxy installed.');
-    expect(htmlElement.querySelector('.retry')).toBeTruthy();
+    checkRetryButton();
+
+    const windowSpy = spyOn(window, 'open');
+    assertDefined(
+      htmlElement.querySelector<HTMLButtonElement>('.install'),
+    ).click();
+    fixture.detectChanges();
+    expect(windowSpy).toHaveBeenCalledOnceWith(
+      'https://tools.google.com/dlpage/android_web_device_proxy',
+      '_blank',
+    );
   });
 
   it('correct icon and message displays if unauthorized proxy', () => {
@@ -77,19 +88,16 @@
       'Web Device Proxy not yet authorized. Enable popups and try again.',
     );
     expect(htmlElement.querySelector('.adb-icon')?.textContent).toEqual('lock');
-    expect(htmlElement.querySelector('.retry')).toBeTruthy();
+    checkRetryButton();
+    expect(htmlElement.querySelector('.install')).toBeNull();
   });
 
-  it('retry button emits event', () => {
-    component.state = ConnectionState.UNAUTH;
-    fixture.detectChanges();
-
+  function checkRetryButton() {
     const spy = spyOn(assertDefined(component.retryConnection), 'emit');
-    const button = assertDefined(
+    assertDefined(
       htmlElement.querySelector<HTMLButtonElement>('.retry'),
-    );
-    button.click();
+    ).click();
     fixture.detectChanges();
     expect(spy).toHaveBeenCalled();
-  });
+  }
 });
diff --git a/tools/winscope/src/trace_collection/controller/user_request_parser.ts b/tools/winscope/src/trace_collection/controller/user_request_parser.ts
index 5a928d0..5628381 100644
--- a/tools/winscope/src/trace_collection/controller/user_request_parser.ts
+++ b/tools/winscope/src/trace_collection/controller/user_request_parser.ts
@@ -32,7 +32,7 @@
 
 export class UserRequestParser {
   private readonly targetPerfettoDsMap = new Map([
-  [UiTraceTarget.SURFACE_FLINGER_TRACE, 'android.surfaceflinger.layers'],
+    [UiTraceTarget.SURFACE_FLINGER_TRACE, 'android.surfaceflinger.layers'],
     [UiTraceTarget.WINDOW_MANAGER_TRACE, 'android.windowmanager'],
     [UiTraceTarget.IME, 'android.inputmethod'],
     [UiTraceTarget.TRANSACTIONS, 'android.surfaceflinger.transactions'],