| // Copyright 2020 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/sharesheet/sharesheet_service_delegator.h" |
| |
| #include <utility> |
| |
| #include "base/functional/callback.h" |
| #include "base/notimplemented.h" |
| #include "build/build_config.h" |
| #include "chrome/browser/sharesheet/sharesheet_service.h" |
| #include "chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h" |
| #include "chrome/browser/ui/ash/sharesheet/sharesheet_header_view.h" |
| #include "ui/base/accelerators/accelerator.h" |
| #include "ui/views/view.h" |
| |
| namespace sharesheet { |
| |
| SharesheetServiceDelegator::SharesheetServiceDelegator( |
| gfx::NativeWindow native_window, |
| SharesheetService* sharesheet_service) |
| : native_window_(native_window), sharesheet_service_(sharesheet_service) { |
| #if BUILDFLAG(IS_CHROMEOS) |
| sharesheet_controller_ = |
| std::make_unique<ash::sharesheet::SharesheetBubbleViewDelegate>( |
| native_window_, this); |
| #else |
| NOTIMPLEMENTED(); |
| #endif // BUILDFLAG(IS_CHROMEOS) |
| } |
| |
| SharesheetServiceDelegator::~SharesheetServiceDelegator() = default; |
| |
| gfx::NativeWindow SharesheetServiceDelegator::GetNativeWindow() { |
| DCHECK(native_window_); |
| return native_window_; |
| } |
| |
| SharesheetController* SharesheetServiceDelegator::GetSharesheetController() { |
| DCHECK(sharesheet_controller_); |
| return sharesheet_controller_.get(); |
| } |
| |
| Profile* SharesheetServiceDelegator::GetProfile() { |
| DCHECK(sharesheet_service_); |
| return sharesheet_service_->GetProfile(); |
| } |
| |
| SharesheetUiDelegate* SharesheetServiceDelegator::GetUiDelegateForTesting() { |
| return sharesheet_controller_.get(); |
| } |
| |
| void SharesheetServiceDelegator::ShowBubble( |
| std::vector<TargetInfo> targets, |
| apps::IntentPtr intent, |
| DeliveredCallback delivered_callback, |
| CloseCallback close_callback) { |
| if (sharesheet_controller_) { |
| sharesheet_controller_->ShowBubble(std::move(targets), std::move(intent), |
| std::move(delivered_callback), |
| std::move(close_callback)); |
| return; |
| } |
| NOTREACHED(); |
| } |
| |
| #if BUILDFLAG(IS_CHROMEOS) |
| // Skips the generic Sharesheet bubble and directly displays the |
| // NearbyShare bubble dialog. |
| void SharesheetServiceDelegator::ShowNearbyShareBubbleForArc( |
| apps::IntentPtr intent, |
| DeliveredCallback delivered_callback, |
| CloseCallback close_callback) { |
| DCHECK(sharesheet_controller_); |
| sharesheet_controller_->ShowNearbyShareBubbleForArc( |
| std::move(intent), std::move(delivered_callback), |
| std::move(close_callback)); |
| } |
| #endif // BUILDFLAG(IS_CHROMEOS) |
| |
| // Invoked immediately after an action has launched in the event that UI |
| // changes need to occur at this point. |
| void SharesheetServiceDelegator::OnActionLaunched(bool has_action_view) { |
| if (sharesheet_controller_) { |
| sharesheet_controller_->OnActionLaunched(has_action_view); |
| return; |
| } |
| NOTREACHED(); |
| } |
| |
| void SharesheetServiceDelegator::CloseBubble(SharesheetResult result) { |
| if (sharesheet_controller_) { |
| sharesheet_controller_->CloseBubble(result); |
| return; |
| } |
| NOTREACHED(); |
| } |
| |
| void SharesheetServiceDelegator::OnBubbleClosed( |
| const std::optional<ShareActionType>& share_action_type) { |
| DCHECK(sharesheet_service_); |
| sharesheet_service_->OnBubbleClosed(native_window_, share_action_type); |
| // This object is now deleted and nothing can be accessed any more. |
| } |
| |
| void SharesheetServiceDelegator::OnTargetSelected( |
| const TargetType type, |
| const std::optional<ShareActionType>& share_action_type, |
| const std::optional<std::u16string>& app_name, |
| apps::IntentPtr intent, |
| views::View* share_action_view) { |
| DCHECK(sharesheet_service_); |
| sharesheet_service_->OnTargetSelected(native_window_, type, share_action_type, |
| app_name, std::move(intent), |
| share_action_view); |
| } |
| |
| bool SharesheetServiceDelegator::OnAcceleratorPressed( |
| const ui::Accelerator& accelerator, |
| const ShareActionType share_action_type) { |
| DCHECK(sharesheet_service_); |
| return sharesheet_service_->OnAcceleratorPressed(accelerator, |
| share_action_type); |
| } |
| |
| const gfx::VectorIcon* SharesheetServiceDelegator::GetVectorIcon( |
| const std::optional<ShareActionType>& share_action_type) { |
| DCHECK(sharesheet_service_); |
| return sharesheet_service_->GetVectorIcon(share_action_type); |
| } |
| |
| } // namespace sharesheet |