| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/crosapi/sharesheet_ash.h" |
| |
| #include <utility> |
| |
| #include "ash/shell.h" |
| #include "chrome/browser/apps/app_service/intent_util.h" |
| #include "chrome/browser/ash/crosapi/window_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/sharesheet/sharesheet_service.h" |
| #include "chrome/browser/sharesheet/sharesheet_service_factory.h" |
| #include "chromeos/crosapi/mojom/sharesheet_mojom_traits.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace { |
| |
| gfx::NativeWindow GetNativeWindowFromId(const std::string& window_id) { |
| return crosapi::GetShellSurfaceWindow(window_id); |
| } |
| |
| void OnClosedCallbackWrapper( |
| crosapi::SharesheetAsh::ShowBubbleWithOnClosedCallback callback, |
| views::Widget::ClosedReason reason) { |
| if (callback) |
| std::move(callback).Run(); |
| } |
| |
| } // namespace |
| |
| namespace crosapi { |
| |
| SharesheetAsh::SharesheetAsh() = default; |
| SharesheetAsh::~SharesheetAsh() = default; |
| |
| void SharesheetAsh::MaybeSetProfile(Profile* profile) { |
| CHECK(profile); |
| if (profile_) { |
| VLOG(1) << "SharesheetAsh is already initialized. Skip init."; |
| return; |
| } |
| |
| profile_ = profile; |
| profile_observation_.Observe(profile_); |
| } |
| |
| void SharesheetAsh::BindReceiver( |
| mojo::PendingReceiver<mojom::Sharesheet> pending_receiver) { |
| receivers_.Add(this, std::move(pending_receiver)); |
| } |
| |
| void SharesheetAsh::ShowBubble(const std::string& window_id, |
| sharesheet::LaunchSource source, |
| crosapi::mojom::IntentPtr intent, |
| ShowBubbleCallback callback) { |
| DCHECK(profile_); |
| if (source == sharesheet::LaunchSource::kUnknown) |
| return; |
| |
| sharesheet::SharesheetService* const sharesheet_service = |
| sharesheet::SharesheetServiceFactory::GetForProfile(profile_); |
| sharesheet_service->ShowBubble( |
| apps_util::CreateAppServiceIntentFromCrosapi(intent, profile_), source, |
| base::BindOnce(&GetNativeWindowFromId, window_id), std::move(callback)); |
| } |
| |
| void SharesheetAsh::ShowBubbleWithOnClosed( |
| const std::string& window_id, |
| sharesheet::LaunchSource source, |
| crosapi::mojom::IntentPtr intent, |
| ShowBubbleWithOnClosedCallback callback) { |
| DCHECK(profile_); |
| if (source == sharesheet::LaunchSource::kUnknown) |
| return; |
| |
| sharesheet::SharesheetService* const sharesheet_service = |
| sharesheet::SharesheetServiceFactory::GetForProfile(profile_); |
| sharesheet_service->ShowBubble( |
| apps_util::CreateAppServiceIntentFromCrosapi(intent, profile_), source, |
| base::BindOnce(&GetNativeWindowFromId, window_id), base::DoNothing(), |
| base::BindOnce(&OnClosedCallbackWrapper, std::move(callback))); |
| } |
| |
| void SharesheetAsh::CloseBubble(const std::string& window_id) { |
| gfx::NativeWindow window = crosapi::GetShellSurfaceWindow(window_id); |
| if (!window) |
| return; |
| |
| sharesheet::SharesheetService* const sharesheet_service = |
| sharesheet::SharesheetServiceFactory::GetForProfile(profile_); |
| sharesheet::SharesheetController* sharesheet_controller = |
| sharesheet_service->GetSharesheetController(window); |
| if (!sharesheet_controller) |
| return; |
| |
| sharesheet_controller->CloseBubble(sharesheet::SharesheetResult::kCancel); |
| } |
| |
| void SharesheetAsh::OnProfileWillBeDestroyed(Profile* profile) { |
| CHECK_EQ(profile_, profile); |
| profile_ = nullptr; |
| profile_observation_.Reset(); |
| } |
| |
| } // namespace crosapi |