Pass storage object where required

Test: npm run build:all && npm run test:all
Change-Id: I3da6b4c0a10a0c17c961820a06fc7d849fce8b59
diff --git a/tools/winscope-ng/src/app/components/app.component.ts b/tools/winscope-ng/src/app/components/app.component.ts
index 80ffc79..ea6c66f 100644
--- a/tools/winscope-ng/src/app/components/app.component.ts
+++ b/tools/winscope-ng/src/app/components/app.component.ts
@@ -238,7 +238,7 @@
 
   public onDataLoadedChange(dataLoaded: boolean) {
     if (dataLoaded && !(this.traceCoordinator.getViewers().length > 0)) {
-      this.traceCoordinator.createViewers();
+      this.traceCoordinator.createViewers(localStorage);
       this.allViewers = this.traceCoordinator.getViewers();
       // TODO: Update to handle viewers with more than one dependency
       if (this.traceCoordinator.getViewers()[0].getDependencies().length !== 1) {
diff --git a/tools/winscope-ng/src/app/trace_coordinator.spec.ts b/tools/winscope-ng/src/app/trace_coordinator.spec.ts
index c82c282..25b44c8 100644
--- a/tools/winscope-ng/src/app/trace_coordinator.spec.ts
+++ b/tools/winscope-ng/src/app/trace_coordinator.spec.ts
@@ -20,6 +20,7 @@
 import {ViewerFactory} from "viewers/viewer_factory";
 import {ViewerStub} from "viewers/viewer_stub";
 import { TimelineCoordinator } from "./timeline_coordinator";
+import { MockStorage } from "test/unit/mock_storage";
 
 describe("TraceCoordinator", () => {
   let traceCoordinator: TraceCoordinator;
@@ -137,7 +138,7 @@
 
     // create viewers (mocked factory)
     expect(traceCoordinator.getViewers()).toEqual([]);
-    traceCoordinator.createViewers();
+    traceCoordinator.createViewers(new MockStorage());
     expect(traceCoordinator.getViewers()).toEqual([viewerStub]);
 
     // Gets notified of the current timestamp on creation
diff --git a/tools/winscope-ng/src/app/trace_coordinator.ts b/tools/winscope-ng/src/app/trace_coordinator.ts
index cd24c44..8117d30 100644
--- a/tools/winscope-ng/src/app/trace_coordinator.ts
+++ b/tools/winscope-ng/src/app/trace_coordinator.ts
@@ -101,9 +101,9 @@
     throw Error("No common timestamp type across all traces");
   }
 
-  public createViewers() {
+  public createViewers(storage: Storage) {
     const activeTraceTypes = this.parsers.map(parser => parser.getTraceType());
-    this.viewers = new ViewerFactory().createViewers(new Set<TraceType>(activeTraceTypes));
+    this.viewers = new ViewerFactory().createViewers(new Set<TraceType>(activeTraceTypes), storage);
 
     // Make sure to update the viewers active entries as soon as they are created.
     if (this.timelineCoordinator.currentTimestamp) {
diff --git a/tools/winscope-ng/src/viewers/common/presenter_input_method.ts b/tools/winscope-ng/src/viewers/common/presenter_input_method.ts
index 34ee949..5a66d48 100644
--- a/tools/winscope-ng/src/viewers/common/presenter_input_method.ts
+++ b/tools/winscope-ng/src/viewers/common/presenter_input_method.ts
@@ -32,7 +32,8 @@
 export abstract class PresenterInputMethod {
   constructor(
     notifyViewCallback: NotifyImeViewCallbackType,
-    dependencies: Array<TraceType>
+    dependencies: Array<TraceType>,
+    private storage: Storage
   ) {
     this.notifyViewCallback = notifyViewCallback;
     this.dependencies = dependencies;
@@ -221,7 +222,7 @@
       name: "Flat",
       enabled: false
     }
-  });
+  }, this.storage);
   protected propertiesUserOptions: UserOptions = PersistentStoreObject.new<UserOptions>("ImePropertiesOptions", {
     showDefaults: {
       name: "Show defaults",
@@ -232,7 +233,7 @@
                 the default for its data type.
               `
     },
-  });
+  }, this.storage);
 
   protected abstract updateHierarchyTableProperties(): TableProperties;
 }
diff --git a/tools/winscope-ng/src/viewers/common/presenter_input_method_test_utils.ts b/tools/winscope-ng/src/viewers/common/presenter_input_method_test_utils.ts
index e67953f..5032148 100644
--- a/tools/winscope-ng/src/viewers/common/presenter_input_method_test_utils.ts
+++ b/tools/winscope-ng/src/viewers/common/presenter_input_method_test_utils.ts
@@ -24,6 +24,7 @@
 import {PresenterInputMethodClients} from "viewers/viewer_input_method_clients/presenter_input_method_clients";
 import {PresenterInputMethodService} from "viewers/viewer_input_method_service/presenter_input_method_service";
 import {PresenterInputMethodManagerService} from "viewers/viewer_input_method_manager_service/presenter_input_method_manager_service";
+import { MockStorage } from "test/unit/mock_storage";
 
 export function executePresenterInputMethodTests(
   selected: HierarchyTreeNode,
@@ -44,7 +45,7 @@
       selectedTree = selected;
       presenter = new PresenterInputMethod((newData: ImeUiData) => {
         uiData = newData;
-      }, [traceType]);
+      }, [traceType], new MockStorage());
     });
 
     it("can notify current trace entries", () => {
diff --git a/tools/winscope-ng/src/viewers/common/viewer_input_method.ts b/tools/winscope-ng/src/viewers/common/viewer_input_method.ts
index a2f4ec2..4e25b05 100644
--- a/tools/winscope-ng/src/viewers/common/viewer_input_method.ts
+++ b/tools/winscope-ng/src/viewers/common/viewer_input_method.ts
@@ -20,9 +20,9 @@
 import {ImeUiData} from "viewers/common/ime_ui_data";
 
 abstract class ViewerInputMethod implements Viewer {
-  constructor() {
+  constructor(storage: Storage) {
     this.htmlElement = document.createElement("viewer-input-method");
-    this.presenter = this.initialisePresenter();
+    this.presenter = this.initialisePresenter(storage);
     this.addViewerEventListeners();
   }
 
@@ -52,7 +52,7 @@
     this.htmlElement.addEventListener(ViewerEvents.AdditionalPropertySelected, (event) => this.presenter.newAdditionalPropertiesTree((event as CustomEvent).detail.selectedItem));
   }
 
-  protected abstract initialisePresenter(): PresenterInputMethod;
+  protected abstract initialisePresenter(storage: Storage): PresenterInputMethod;
 
   protected htmlElement: HTMLElement;
   protected presenter: PresenterInputMethod;
diff --git a/tools/winscope-ng/src/viewers/viewer_factory.ts b/tools/winscope-ng/src/viewers/viewer_factory.ts
index ddfdd91..fc35ecb 100644
--- a/tools/winscope-ng/src/viewers/viewer_factory.ts
+++ b/tools/winscope-ng/src/viewers/viewer_factory.ts
@@ -39,7 +39,7 @@
     ViewerScreenRecording,
   ];
 
-  public createViewers(activeTraceTypes: Set<TraceType>): Viewer[] {
+  public createViewers(activeTraceTypes: Set<TraceType>, storage: Storage): Viewer[] {
     const viewers: Viewer[] = [];
 
     for (const Viewer of ViewerFactory.VIEWERS) {
@@ -48,7 +48,7 @@
       );
 
       if (areViewerDepsSatisfied) {
-        viewers.push(new Viewer());
+        viewers.push(new Viewer(storage));
       }
     }
 
diff --git a/tools/winscope-ng/src/viewers/viewer_input_method_clients/viewer_input_method_clients.ts b/tools/winscope-ng/src/viewers/viewer_input_method_clients/viewer_input_method_clients.ts
index afe87eb..bb4b333 100644
--- a/tools/winscope-ng/src/viewers/viewer_input_method_clients/viewer_input_method_clients.ts
+++ b/tools/winscope-ng/src/viewers/viewer_input_method_clients/viewer_input_method_clients.ts
@@ -27,8 +27,8 @@
     return ViewerInputMethodClients.DEPENDENCIES;
   }
 
-  override initialisePresenter() {
-    return new PresenterInputMethodClients(this.imeUiCallback, this.getDependencies());
+  override initialisePresenter(storage: Storage) {
+    return new PresenterInputMethodClients(this.imeUiCallback, this.getDependencies(), storage);
   }
 
   public static readonly DEPENDENCIES: TraceType[] = [TraceType.INPUT_METHOD_CLIENTS];
diff --git a/tools/winscope-ng/src/viewers/viewer_input_method_manager_service/viewer_input_method_manager_service.ts b/tools/winscope-ng/src/viewers/viewer_input_method_manager_service/viewer_input_method_manager_service.ts
index 4a89554..36c5b09 100644
--- a/tools/winscope-ng/src/viewers/viewer_input_method_manager_service/viewer_input_method_manager_service.ts
+++ b/tools/winscope-ng/src/viewers/viewer_input_method_manager_service/viewer_input_method_manager_service.ts
@@ -32,8 +32,8 @@
     return ViewerInputMethodManagerService.DEPENDENCIES;
   }
 
-  override initialisePresenter() {
-    return new PresenterInputMethodManagerService(this.imeUiCallback, this.getDependencies());
+  override initialisePresenter(storage: Storage) {
+    return new PresenterInputMethodManagerService(this.imeUiCallback, this.getDependencies(), storage);
   }
 
   public static readonly DEPENDENCIES: TraceType[] = [TraceType.INPUT_METHOD_MANAGER_SERVICE];
diff --git a/tools/winscope-ng/src/viewers/viewer_input_method_service/viewer_input_method_service.ts b/tools/winscope-ng/src/viewers/viewer_input_method_service/viewer_input_method_service.ts
index b0d0e32..c7e0e6e 100644
--- a/tools/winscope-ng/src/viewers/viewer_input_method_service/viewer_input_method_service.ts
+++ b/tools/winscope-ng/src/viewers/viewer_input_method_service/viewer_input_method_service.ts
@@ -34,8 +34,8 @@
     return ViewerInputMethodService.DEPENDENCIES;
   }
 
-  override initialisePresenter() {
-    return new PresenterInputMethodService(this.imeUiCallback, this.getDependencies());
+  override initialisePresenter(storage: Storage) {
+    return new PresenterInputMethodService(this.imeUiCallback, this.getDependencies(), storage);
   }
 
   public static readonly DEPENDENCIES: TraceType[] = [TraceType.INPUT_METHOD_SERVICE];
diff --git a/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.spec.ts b/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.spec.ts
index 8f901f1..0876c67 100644
--- a/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.spec.ts
+++ b/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.spec.ts
@@ -21,6 +21,7 @@
 import {HierarchyTreeNode, PropertiesTreeNode} from "viewers/common/ui_tree_utils";
 import {UnitTestUtils} from "test/unit/utils";
 import {HierarchyTreeBuilder} from "test/unit/hierarchy_tree_builder";
+import { MockStorage } from "test/unit/mock_storage";
 
 describe("PresenterSurfaceFlinger", () => {
   let presenter: Presenter;
@@ -41,7 +42,7 @@
   beforeEach(async () => {
     presenter = new Presenter((newData: UiData) => {
       uiData = newData;
-    });
+    }, new MockStorage());
   });
 
   it("processes current trace entries", () => {
diff --git a/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.ts b/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.ts
index d3295fb..a0cbed8 100644
--- a/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.ts
+++ b/tools/winscope-ng/src/viewers/viewer_surface_flinger/presenter.ts
@@ -29,7 +29,7 @@
 type NotifyViewCallbackType = (uiData: UiData) => void;
 
 export class Presenter {
-  constructor(notifyViewCallback: NotifyViewCallbackType) {
+  constructor(notifyViewCallback: NotifyViewCallbackType, private storage: Storage) {
     this.notifyViewCallback = notifyViewCallback;
     this.uiData = new UiData([TraceType.SURFACE_FLINGER]);
     this.notifyViewCallback(this.uiData);
@@ -274,7 +274,7 @@
       name: "Flat",
       enabled: false
     }
-  });
+  }, this.storage);
 
   private propertiesUserOptions: UserOptions = PersistentStoreObject.new<UserOptions>("SfPropertyOptions", {
     showDiff: {
@@ -290,5 +290,5 @@
                 the default for its data type.
               `
     },
-  });
+  }, this.storage);
 }
diff --git a/tools/winscope-ng/src/viewers/viewer_surface_flinger/viewer_surface_flinger.ts b/tools/winscope-ng/src/viewers/viewer_surface_flinger/viewer_surface_flinger.ts
index d6e6df0..606cc4f 100644
--- a/tools/winscope-ng/src/viewers/viewer_surface_flinger/viewer_surface_flinger.ts
+++ b/tools/winscope-ng/src/viewers/viewer_surface_flinger/viewer_surface_flinger.ts
@@ -20,7 +20,7 @@
 import {ViewerEvents} from "viewers/common/viewer_events";
 
 class ViewerSurfaceFlinger implements Viewer {
-  constructor() {
+  constructor(storage: Storage) {
     this.htmlElement = document.createElement("viewer-surface-flinger");
     this.presenter = new Presenter((uiData: UiData) => {
       // Angular does not deep watch @Input properties. Clearing inputData to null before repopulating
@@ -28,7 +28,7 @@
       // resetting, Angular does not auto-detect that inputData has changed.
       (this.htmlElement as any).inputData = null;
       (this.htmlElement as any).inputData = uiData;
-    });
+    }, storage);
     this.htmlElement.addEventListener(ViewerEvents.HierarchyPinnedChange, (event) => this.presenter.updatePinnedItems(((event as CustomEvent).detail.pinnedItem)));
     this.htmlElement.addEventListener(ViewerEvents.HighlightedChange, (event) => this.presenter.updateHighlightedItems(`${(event as CustomEvent).detail.id}`));
     this.htmlElement.addEventListener(ViewerEvents.HierarchyUserOptionsChange, (event) => this.presenter.updateHierarchyTree((event as CustomEvent).detail.userOptions));
diff --git a/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.spec.ts b/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.spec.ts
index 1c08080..24c0b84 100644
--- a/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.spec.ts
+++ b/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.spec.ts
@@ -22,6 +22,7 @@
 import { UnitTestUtils } from "test/unit/utils";
 import { HierarchyTreeBuilder } from "test/unit/hierarchy_tree_builder";
 import { VISIBLE_CHIP } from "viewers/common/chip";
+import { MockStorage } from "test/unit/mock_storage";
 
 describe("PresenterWindowManager", () => {
   let presenter: Presenter;
@@ -44,7 +45,7 @@
   beforeEach(async () => {
     presenter = new Presenter((newData: UiData) => {
       uiData = newData;
-    });
+    }, new MockStorage());
   });
 
   it("processes current trace entries", () => {
diff --git a/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.ts b/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.ts
index 87cb789..326f842 100644
--- a/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.ts
+++ b/tools/winscope-ng/src/viewers/viewer_window_manager/presenter.ts
@@ -28,7 +28,7 @@
 type NotifyViewCallbackType = (uiData: UiData) => void;
 
 export class Presenter {
-  constructor(notifyViewCallback: NotifyViewCallbackType) {
+  constructor(notifyViewCallback: NotifyViewCallbackType, private storage: Storage) {
     this.notifyViewCallback = notifyViewCallback;
     this.uiData = new UiData([TraceType.WINDOW_MANAGER]);
     this.notifyViewCallback(this.uiData);
@@ -246,7 +246,7 @@
       name: "Flat",
       enabled: false
     }
-  });
+  }, this.storage);
   private propertiesUserOptions: UserOptions = PersistentStoreObject.new<UserOptions>("WmPropertyOptions", {
     showDiff: {
       name: "Show diff",
@@ -261,5 +261,5 @@
                 the default for its data type.
               `
     },
-  });
+  }, this.storage);
 }
diff --git a/tools/winscope-ng/src/viewers/viewer_window_manager/viewer_window_manager.ts b/tools/winscope-ng/src/viewers/viewer_window_manager/viewer_window_manager.ts
index fde93dd..ef8ca51 100644
--- a/tools/winscope-ng/src/viewers/viewer_window_manager/viewer_window_manager.ts
+++ b/tools/winscope-ng/src/viewers/viewer_window_manager/viewer_window_manager.ts
@@ -18,6 +18,7 @@
 import {Presenter} from "./presenter";
 import {UiData} from "./ui_data";
 import { ViewerEvents } from "viewers/common/viewer_events";
+import { MockStorage } from "test/unit/mock_storage";
 
 class ViewerWindowManager implements Viewer {
   constructor() {
@@ -28,7 +29,7 @@
       // resetting, Angular does not auto-detect that inputData has changed.
       (this.htmlElement as any).inputData = null;
       (this.htmlElement as any).inputData = uiData;
-    });
+    }, new MockStorage());
     this.htmlElement.addEventListener(ViewerEvents.HierarchyPinnedChange, (event) => this.presenter.updatePinnedItems(((event as CustomEvent).detail.pinnedItem)));
     this.htmlElement.addEventListener(ViewerEvents.HighlightedChange, (event) => this.presenter.updateHighlightedItems(`${(event as CustomEvent).detail.id}`));
     this.htmlElement.addEventListener(ViewerEvents.HierarchyUserOptionsChange, (event) => this.presenter.updateHierarchyTree((event as CustomEvent).detail.userOptions));