[file_selector_windows] Fix the problem that the initial directory does not work after completing a file selection on windows (#5416)

diff --git a/packages/file_selector/file_selector_windows/CHANGELOG.md b/packages/file_selector/file_selector_windows/CHANGELOG.md
index 6db4fb3..1c53df0 100644
--- a/packages/file_selector/file_selector_windows/CHANGELOG.md
+++ b/packages/file_selector/file_selector_windows/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.1+2
+
+* Fixes the problem that the initial directory does not work after completing a file selection.
+
 ## 0.9.1+1
 
 * Updates README for endorsement.
diff --git a/packages/file_selector/file_selector_windows/pubspec.yaml b/packages/file_selector/file_selector_windows/pubspec.yaml
index e4f38d8..90751df 100644
--- a/packages/file_selector/file_selector_windows/pubspec.yaml
+++ b/packages/file_selector/file_selector_windows/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Windows implementation of the file_selector plugin.
 repository: https://github.com/flutter/plugins/tree/main/packages/file_selector/file_selector_windows
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22
-version: 0.9.1+1
+version: 0.9.1+2
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/file_selector/file_selector_windows/windows/file_dialog_controller.cpp b/packages/file_selector/file_selector_windows/windows/file_dialog_controller.cpp
index e4b1a2a..5820c4a 100644
--- a/packages/file_selector/file_selector_windows/windows/file_dialog_controller.cpp
+++ b/packages/file_selector/file_selector_windows/windows/file_dialog_controller.cpp
@@ -17,8 +17,8 @@
 
 FileDialogController::~FileDialogController() {}
 
-HRESULT FileDialogController::SetDefaultFolder(IShellItem* folder) {
-  return dialog_->SetDefaultFolder(folder);
+HRESULT FileDialogController::SetFolder(IShellItem* folder) {
+  return dialog_->SetFolder(folder);
 }
 
 HRESULT FileDialogController::SetFileName(const wchar_t* name) {
diff --git a/packages/file_selector/file_selector_windows/windows/file_dialog_controller.h b/packages/file_selector/file_selector_windows/windows/file_dialog_controller.h
index e735733..f5c9397 100644
--- a/packages/file_selector/file_selector_windows/windows/file_dialog_controller.h
+++ b/packages/file_selector/file_selector_windows/windows/file_dialog_controller.h
@@ -30,7 +30,7 @@
   FileDialogController& operator=(const FileDialogController&) = delete;
 
   // IFileDialog wrappers:
-  virtual HRESULT SetDefaultFolder(IShellItem* folder);
+  virtual HRESULT SetFolder(IShellItem* folder);
   virtual HRESULT SetFileName(const wchar_t* name);
   virtual HRESULT SetFileTypes(UINT count, COMDLG_FILTERSPEC* filters);
   virtual HRESULT SetOkButtonLabel(const wchar_t* text);
diff --git a/packages/file_selector/file_selector_windows/windows/file_selector_plugin.cpp b/packages/file_selector/file_selector_windows/windows/file_selector_plugin.cpp
index 7f37a1a..b9e6d21 100644
--- a/packages/file_selector/file_selector_windows/windows/file_selector_plugin.cpp
+++ b/packages/file_selector/file_selector_windows/windows/file_selector_plugin.cpp
@@ -86,7 +86,7 @@
 
   // Attempts to set the default folder for the dialog to |path|,
   // if it exists.
-  void SetDefaultFolder(std::string_view path) {
+  void SetFolder(std::string_view path) {
     std::wstring wide_path = Utf16FromUtf8(path);
     IShellItemPtr item;
     last_result_ = SHCreateItemFromParsingName(wide_path.c_str(), nullptr,
@@ -94,7 +94,7 @@
     if (!SUCCEEDED(last_result_)) {
       return;
     }
-    dialog_controller_->SetDefaultFolder(item);
+    dialog_controller_->SetFolder(item);
   }
 
   // Sets the file name that is initially shown in the dialog.
@@ -230,7 +230,7 @@
   }
 
   if (initial_directory) {
-    dialog.SetDefaultFolder(*initial_directory);
+    dialog.SetFolder(*initial_directory);
   }
   if (suggested_name) {
     dialog.SetFileName(*suggested_name);
diff --git a/packages/file_selector/file_selector_windows/windows/test/file_selector_plugin_test.cpp b/packages/file_selector/file_selector_windows/windows/test/file_selector_plugin_test.cpp
index f3d130b..2325a27 100644
--- a/packages/file_selector/file_selector_windows/windows/test/file_selector_plugin_test.cpp
+++ b/packages/file_selector/file_selector_windows/windows/test/file_selector_plugin_test.cpp
@@ -115,7 +115,9 @@
     EXPECT_EQ(parent, fake_window);
 
     // Validate arguments.
-    EXPECT_EQ(dialog.GetDefaultFolderPath(), L"C:\\Program Files");
+    EXPECT_EQ(dialog.GetDialogFolderPath(), L"C:\\Program Files");
+    // Make sure that the folder was called via SetFolder, not SetDefaultFolder.
+    EXPECT_EQ(dialog.GetSetFolderPath(), L"C:\\Program Files");
     EXPECT_EQ(dialog.GetOkButtonLabel(), L"Open it!");
 
     return MockShowResult(fake_result_array);
@@ -322,7 +324,10 @@
         EXPECT_EQ(parent, fake_window);
 
         // Validate arguments.
-        EXPECT_EQ(dialog.GetDefaultFolderPath(), L"C:\\Program Files");
+        EXPECT_EQ(dialog.GetDialogFolderPath(), L"C:\\Program Files");
+        // Make sure that the folder was called via SetFolder, not
+        // SetDefaultFolder.
+        EXPECT_EQ(dialog.GetSetFolderPath(), L"C:\\Program Files");
         EXPECT_EQ(dialog.GetFileName(), L"a name");
         EXPECT_EQ(dialog.GetOkButtonLabel(), L"Save it!");
 
diff --git a/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.cpp b/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.cpp
index a98b686..15065f9 100644
--- a/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.cpp
+++ b/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.cpp
@@ -20,6 +20,17 @@
 
 TestFileDialogController::~TestFileDialogController() {}
 
+HRESULT TestFileDialogController::SetFolder(IShellItem* folder) {
+  wchar_t* path_chars = nullptr;
+  if (SUCCEEDED(folder->GetDisplayName(SIGDN_FILESYSPATH, &path_chars))) {
+    set_folder_path_ = path_chars;
+  } else {
+    set_folder_path_ = L"";
+  }
+
+  return FileDialogController::SetFolder(folder);
+}
+
 HRESULT TestFileDialogController::SetFileTypes(UINT count,
                                                COMDLG_FILTERSPEC* filters) {
   filter_groups_.clear();
@@ -56,7 +67,11 @@
   return S_OK;
 }
 
-std::wstring TestFileDialogController::GetDefaultFolderPath() const {
+std::wstring TestFileDialogController::GetSetFolderPath() const {
+  return set_folder_path_;
+}
+
+std::wstring TestFileDialogController::GetDialogFolderPath() const {
   IShellItemPtr item;
   if (!SUCCEEDED(dialog_->GetFolder(&item))) {
     return L"";
diff --git a/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.h b/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.h
index 2e7292b..1c221fc 100644
--- a/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.h
+++ b/packages/file_selector/file_selector_windows/windows/test/test_file_dialog_controller.h
@@ -51,6 +51,7 @@
   ~TestFileDialogController();
 
   // FileDialogController:
+  HRESULT SetFolder(IShellItem* folder) override;
   HRESULT SetFileTypes(UINT count, COMDLG_FILTERSPEC* filters) override;
   HRESULT SetOkButtonLabel(const wchar_t* text) override;
   HRESULT Show(HWND parent) override;
@@ -58,7 +59,14 @@
   HRESULT GetResults(IShellItemArray** out_items) const override;
 
   // Accessors for validating IFileDialogController setter calls.
-  std::wstring GetDefaultFolderPath() const;
+  // Gets the folder path set by FileDialogController::SetFolder.
+  //
+  // This exists because there are multiple ways that the value returned by
+  // GetDialogFolderPath can be changed, so this allows specifically validating
+  // calls to SetFolder.
+  std::wstring GetSetFolderPath() const;
+  // Gets dialog folder path by calling IFileDialog::GetFolder.
+  std::wstring GetDialogFolderPath() const;
   std::wstring GetFileName() const;
   const std::vector<DialogFilter>& GetFileTypes() const;
   std::wstring GetOkButtonLabel() const;
@@ -70,6 +78,7 @@
 
   // The last set values, for IFileDialog properties that have setters but no
   // corresponding getters.
+  std::wstring set_folder_path_;
   std::wstring ok_button_label_;
   std::vector<DialogFilter> filter_groups_;
 };