Notes: add profile pref storing the sort order for notes ui in side panel.

Bug: 1394044
Change-Id: Ia7dda2c5deb193a894b4e579640c32e226c25335
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4246680
Commit-Queue: Caroline Rising <[email protected]>
Reviewed-by: Yuheng Huang <[email protected]>
Reviewed-by: Ken Buchanan <[email protected]>
Reviewed-by: Gabriel Charette <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1108316}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ab1c802..e0d02c7 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4435,6 +4435,7 @@
       "//components/soda:constants",
       "//components/ukm/content",
       "//components/user_notes:features",
+      "//components/user_notes:user_notes_prefs",
       "//components/user_notes/browser",
       "//components/user_notes/interfaces",
       "//components/user_notes/storage",
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 91c260e..f13774f 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -283,6 +283,7 @@
 #include "components/live_caption/live_caption_controller.h"
 #include "components/live_caption/live_translate_controller.h"
 #include "components/ntp_tiles/custom_links_manager_impl.h"
+#include "components/user_notes/user_notes_prefs.h"
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_CHROMEOS)
@@ -1486,6 +1487,7 @@
   UnifiedAutoplayConfig::RegisterProfilePrefs(registry);
   CartService::RegisterProfilePrefs(registry);
   commerce::ShoppingListUiTabHelper::RegisterProfilePrefs(registry);
+  user_notes::RegisterProfilePrefs(registry);
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
   captions::LiveCaptionController::RegisterProfilePrefs(registry);
 #endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts b/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
index 2477804..da91ab83 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
+++ b/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
@@ -17,6 +17,7 @@
   updateNote(guid: string, text: string): Promise<{success: boolean}>;
   deleteNote(guid: string): Promise<{success: boolean}>;
   noteOverviewSelected(url: Url, clickModifiers: ClickModifiers): void;
+  setSortOrder(sortByNewest: boolean): void;
   getCallbackRouter(): UserNotesPageCallbackRouter;
 }
 
@@ -61,6 +62,10 @@
     this.handler.noteOverviewSelected(url, clickModifiers);
   }
 
+  setSortOrder(sortByNewest: boolean) {
+    this.handler.setSortOrder(sortByNewest);
+  }
+
   getCallbackRouter() {
     return this.callbackRouter;
   }
diff --git a/chrome/browser/resources/side_panel/user_notes/user_notes_list.ts b/chrome/browser/resources/side_panel/user_notes/user_notes_list.ts
index 11b58ea..efef10a9 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_notes_list.ts
+++ b/chrome/browser/resources/side_panel/user_notes/user_notes_list.ts
@@ -12,6 +12,7 @@
 
 import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {loadTimeData} from '//resources/js/load_time_data.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
 import {DomRepeat, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Note} from './user_notes.mojom-webui.js';
@@ -44,7 +45,9 @@
       activeSortIndex_: {
         type: Number,
         observer: 'onActiveSortIndexChanged_',
-        value: 1,
+        value: function() {
+          return loadTimeData.getBoolean('sortByNewest') ? 0 : 1;
+        },
       },
 
       sortTypes_: {
@@ -61,7 +64,28 @@
   private sortTypes_: string[];
   private userNotesApi_: UserNotesApiProxy =
       UserNotesApiProxyImpl.getInstance();
-  private listenerIds_: number[] = [];
+  private listenerId_: number|null = null;
+
+  override connectedCallback() {
+    super.connectedCallback();
+
+    const callbackRouter = this.userNotesApi_.getCallbackRouter();
+    this.listenerId_ = callbackRouter.sortByNewestPrefChanged.addListener(
+        (sortByNewest: boolean) => {
+          const sortIndex = sortByNewest ? 0 : 1;
+          if (this.activeSortIndex_ !== sortIndex) {
+            this.activeSortIndex_ = sortIndex;
+          }
+        });
+  }
+
+  override disconnectedCallback() {
+    super.disconnectedCallback();
+
+    assert(this.listenerId_);
+    this.userNotesApi_.getCallbackRouter().removeListener(this.listenerId_);
+    this.listenerId_ = null;
+  }
 
   private onAllNotesClick_(event: MouseEvent) {
     event.preventDefault();
@@ -94,7 +118,8 @@
     event.preventDefault();
     event.stopPropagation();
     this.$.sortMenu.close();
-    this.activeSortIndex_ = event.model.index;
+    const sortByNewest = event.model.index === 0;
+    this.userNotesApi_.setSortOrder(sortByNewest);
   }
 
   private onActiveSortIndexChanged_() {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 5b25ed8..4f26009 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1854,6 +1854,7 @@
       "//components/user_education/common",
       "//components/user_education/webui",
       "//components/user_notes:features",
+      "//components/user_notes:user_notes_prefs",
       "//components/vector_icons",
       "//components/web_modal",
       "//components/webauthn/content/browser",
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes.mojom b/chrome/browser/ui/webui/side_panel/user_notes/user_notes.mojom
index 86ea1b1d..0ce461a8 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes.mojom
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes.mojom
@@ -83,6 +83,10 @@
   // should be shown.
   NoteOverviewSelected(url.mojom.Url url,
                        ui.mojom.ClickModifiers click_modifiers);
+
+  // Called when the sort option has been updated and the profile pref should be
+  // updated.
+  SetSortOrder(bool sort_by_newest);
 };
 
 // WebUI-side handler for requests from the browser.
@@ -98,4 +102,8 @@
   // This could be triggered by either switching tab or navigating to
   // a new URL.
   CurrentTabUrlChanged();
+
+  // Called when the kUserNotesSortByNewest pref has changed so that the UI can
+  // match this sort order if it doesn't already.
+  SortByNewestPrefChanged(bool sort_by_newest);
 };
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.cc b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.cc
index 88706cf2..f2629dc0 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.cc
@@ -17,7 +17,9 @@
 #include "components/power_bookmarks/common/power.h"
 #include "components/power_bookmarks/common/power_overview.h"
 #include "components/power_bookmarks/core/power_bookmark_service.h"
+#include "components/prefs/pref_service.h"
 #include "components/sync/protocol/power_bookmark_specifics.pb.h"
+#include "components/user_notes/user_notes_prefs.h"
 #include "ui/base/l10n/time_format.h"
 #include "ui/base/mojom/window_open_disposition.mojom.h"
 #include "ui/base/window_open_disposition.h"
@@ -105,6 +107,11 @@
       service_(PowerBookmarkServiceFactory::GetForBrowserContext(profile_)),
       browser_(browser),
       user_notes_ui_(user_notes_ui) {
+  pref_change_registrar_.Init(profile_->GetPrefs());
+  pref_change_registrar_.Add(
+      prefs::kUserNotesSortByNewest,
+      base::BindRepeating(&UserNotesPageHandler::OnSortByNewestPrefChanged,
+                          base::Unretained(this)));
   service_->AddObserver(this);
   DCHECK(browser_);
   browser_->tab_strip_model()->AddObserver(this);
@@ -222,6 +229,22 @@
   browser_->OpenURL(params);
 }
 
+void UserNotesPageHandler::SetSortOrder(bool sort_by_newest) {
+  PrefService* pref_service = profile_->GetPrefs();
+  if (pref_service && pref_service->GetBoolean(prefs::kUserNotesSortByNewest) !=
+                          sort_by_newest) {
+    pref_service->SetBoolean(prefs::kUserNotesSortByNewest, sort_by_newest);
+  }
+}
+
+void UserNotesPageHandler::OnSortByNewestPrefChanged() {
+  PrefService* pref_service = profile_->GetPrefs();
+  if (pref_service) {
+    page_->SortByNewestPrefChanged(
+        pref_service->GetBoolean(prefs::kUserNotesSortByNewest));
+  }
+}
+
 void UserNotesPageHandler::OnPowersChanged() {
   page_->NotesChanged();
 }
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.h b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.h
index d39b0c2..13c38f2 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler.h
@@ -10,6 +10,7 @@
 #include "chrome/browser/ui/webui/side_panel/user_notes/user_notes.mojom.h"
 #include "components/power_bookmarks/common/power_bookmark_observer.h"
 #include "components/power_bookmarks/core/power_bookmark_service.h"
+#include "components/prefs/pref_change_registrar.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -55,6 +56,9 @@
   void NoteOverviewSelected(
       const ::GURL& url,
       ui::mojom::ClickModifiersPtr click_modifiers) override;
+  void SetSortOrder(bool sort_by_newest) override;
+
+  void OnSortByNewestPrefChanged();
 
   void SetCurrentTabUrlForTesting(GURL url) { current_tab_url_ = url; }
 
@@ -78,6 +82,7 @@
   mojo::Receiver<side_panel::mojom::UserNotesPageHandler> receiver_;
   mojo::Remote<side_panel::mojom::UserNotesPage> page_;
   const raw_ptr<Profile> profile_;
+  PrefChangeRegistrar pref_change_registrar_;
   const raw_ptr<power_bookmarks::PowerBookmarkService> service_;
   const raw_ptr<Browser> browser_;
   raw_ptr<UserNotesSidePanelUI> user_notes_ui_ = nullptr;
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler_unittest.cc
index c33905839..465b21a3 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_page_handler_unittest.cc
@@ -44,6 +44,7 @@
 
   MOCK_METHOD0(NotesChanged, void());
   MOCK_METHOD0(CurrentTabUrlChanged, void());
+  MOCK_METHOD1(SortByNewestPrefChanged, void(bool));
 };
 
 struct Note {
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
index 6b8a4405..099d232 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
@@ -17,7 +17,9 @@
 #include "chrome/grit/side_panel_shared_resources_map.h"
 #include "chrome/grit/side_panel_user_notes_resources.h"
 #include "chrome/grit/side_panel_user_notes_resources_map.h"
+#include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/user_notes/user_notes_prefs.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/base/ui_base_features.h"
@@ -45,6 +47,13 @@
     webui::AddLocalizedString(source, str.name, str.id);
   }
 
+  Profile* const profile = Profile::FromWebUI(web_ui);
+  PrefService* pref_service = profile->GetPrefs();
+  if (pref_service) {
+    source->AddBoolean("sortByNewest",
+                       pref_service->GetBoolean(prefs::kUserNotesSortByNewest));
+  }
+
   source->AddString(
       "chromeRefresh2023Attribute",
       features::IsChromeRefresh2023() ? "chrome-refresh-2023" : "");