Migrate the UserService/Model to not be a singleton

- Rename userService to userModel on appContext
- Merge user-model.ts and user-service.ts
- Rename UserService to UserModel
- Move all observables onto UserModel
- Inject UserModel in the models/services that were directly accessing
the observables

Google-Bug-Id: b/206459178, b/207628953
Change-Id: Icf4f81c877efb58e289678a7331bde7254142a58
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
index 0d63360..fd30c6a 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.ts
@@ -50,7 +50,7 @@
   // Private but accessed by tests.
   readonly browserModel = getAppContext().browserModel;
 
-  private readonly userService = getAppContext().userService;
+  private readonly userModel = getAppContext().userModel;
 
   private subscriptions: Subscription[] = [];
 
@@ -83,7 +83,7 @@
    */
   setMode(newMode: DiffViewMode) {
     if (this.saveOnChange && this.mode && this.mode !== newMode) {
-      this.userService.updatePreferences({diff_view: newMode});
+      this.userModel.updatePreferences({diff_view: newMode});
     }
     this.mode = newMode;
     let announcement;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog_test.ts b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog_test.ts
index 7f7f265..f469799 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog_test.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog_test.ts
@@ -19,7 +19,6 @@
 import './gr-diff-preferences-dialog';
 import {GrDiffPreferencesDialog} from './gr-diff-preferences-dialog';
 import {createDefaultDiffPrefs} from '../../../constants/constants';
-import {updateDiffPreferences} from '../../../services/user/user-model';
 import * as MockInteractions from '@polymer/iron-test-helpers/mock-interactions';
 
 const basicFixture = fixtureFromElement('gr-diff-preferences-dialog');
@@ -37,7 +36,6 @@
       line_wrapping: true,
     };
     element.diffPrefs = originalDiffPrefs;
-    updateDiffPreferences(originalDiffPrefs);
     await flush();
     element.open();
     await flush();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index c4e2488..ca89b1d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -118,10 +118,6 @@
 import {Subscription, combineLatest} from 'rxjs';
 import {listen} from '../../../services/shortcuts/shortcuts-service';
 import {
-  preferences$,
-  diffPreferences$,
-} from '../../../services/user/user-model';
-import {
   diffPath$,
   currentPatchNum$,
   change$,
@@ -359,11 +355,12 @@
 
   private readonly restApiService = getAppContext().restApiService;
 
-  private readonly userService = getAppContext().userService;
+  // Private but used in tests.
+  readonly userModel = getAppContext().userModel;
 
   private readonly changeService = getAppContext().changeService;
 
-  // Private but used in tests
+  // Private but used in tests.
   readonly browserModel = getAppContext().browserModel;
 
   // We just want to make sure that CommentsService is instantiated.
@@ -401,12 +398,12 @@
     );
 
     this.subscriptions.push(
-      preferences$.subscribe(preferences => {
+      this.userModel.preferences$.subscribe(preferences => {
         this._userPrefs = preferences;
       })
     );
     this.subscriptions.push(
-      diffPreferences$.subscribe(diffPreferences => {
+      this.userModel.diffPreferences$.subscribe(diffPreferences => {
         this._prefs = diffPreferences;
       })
     );
@@ -423,7 +420,12 @@
     // properties since the method will be called anytime a property updates
     // but we only want to call this on the initial load.
     this.subscriptions.push(
-      combineLatest(currentPatchNum$, routerView$, diffPath$, diffPreferences$)
+      combineLatest(
+        currentPatchNum$,
+        routerView$,
+        diffPath$,
+        this.userModel.diffPreferences$
+      )
         .pipe(
           filter(
             ([currentPatchNum, routerView, path, diffPrefs]) =>
@@ -784,9 +786,9 @@
   _handleToggleDiffMode() {
     if (!this._userPrefs) return;
     if (this._userPrefs.diff_view === DiffViewMode.SIDE_BY_SIDE) {
-      this.userService.updatePreferences({diff_view: DiffViewMode.UNIFIED});
+      this.userModel.updatePreferences({diff_view: DiffViewMode.UNIFIED});
     } else {
-      this.userService.updatePreferences({
+      this.userModel.updatePreferences({
         diff_view: DiffViewMode.SIDE_BY_SIDE,
       });
     }
@@ -1764,7 +1766,7 @@
   }
 
   _handleReloadingDiffPreference() {
-    this.userService.getDiffPreferences();
+    this.userModel.getDiffPreferences();
   }
 
   _computeCanEdit(
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
index 2367342..9076420 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.js
@@ -31,7 +31,6 @@
 import {EditPatchSetNum} from '../../../types/common.js';
 import {CursorMoveResult} from '../../../api/core.js';
 import {Side} from '../../../api/diff.js';
-import {_testOnly_setState as setUserModelState, _testOnly_getState as getUserModelState} from '../../../services/user/user-model.js';
 import {_testOnly_setState as setChangeModelState} from '../../../services/change/change-model.js';
 import {_testOnly_setState as setCommentState} from '../../../services/comments/comments-model.js';
 
@@ -1199,7 +1198,7 @@
         ...createDefaultDiffPrefs(),
         manual_review: true,
       };
-      setUserModelState({...getUserModelState(), diffPreferences});
+      element.userModel.setDiffPreferences(diffPreferences);
       setChangeModelState({change: createChange(), diffPath: '/COMMIT_MSG'});
 
       setRouterModelState({
@@ -1216,8 +1215,7 @@
       assert.isTrue(getReviewedStub.called);
 
       // if prefs are updated then the reviewed status should not be set again
-      setUserModelState({...getUserModelState(),
-        diffPreferences: createDefaultDiffPrefs()});
+      element.userModel.setDiffPreferences(createDefaultDiffPrefs());
 
       await flush();
       assert.isFalse(saveReviewedStub.called);
@@ -1237,7 +1235,7 @@
             ...createDefaultDiffPrefs(),
             manual_review: false,
           };
-          setUserModelState({...getUserModelState(), diffPreferences});
+          element.userModel.setDiffPreferences(diffPreferences);
           setChangeModelState({change: createChange(),
             diffPath: '/COMMIT_MSG'});
 
@@ -1262,8 +1260,7 @@
           .callsFake(() => Promise.resolve());
       sinon.stub(element.$.diffHost, 'reload');
 
-      setUserModelState({...getUserModelState(),
-        diffPreferences: createDefaultDiffPrefs()});
+      element.userModel.setDiffPreferences(createDefaultDiffPrefs());
       setChangeModelState({change: createChange(), diffPath: '/COMMIT_MSG'});
 
       setRouterModelState({