| // Copyright 2023 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/sync/synced_session_client_ash.h" |
| |
| #include <utility> |
| |
| #include "chromeos/crosapi/mojom/synced_session_client.mojom.h" |
| #include "components/sync_sessions/synced_session.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| |
| namespace ash { |
| |
| ForeignSyncedSessionAsh::ForeignSyncedSessionAsh() = default; |
| ForeignSyncedSessionAsh::ForeignSyncedSessionAsh( |
| const ForeignSyncedSessionAsh&) = default; |
| ForeignSyncedSessionAsh::ForeignSyncedSessionAsh(ForeignSyncedSessionAsh&&) = |
| default; |
| ForeignSyncedSessionAsh& ForeignSyncedSessionAsh::operator=( |
| const ForeignSyncedSessionAsh&) = default; |
| ForeignSyncedSessionAsh& ForeignSyncedSessionAsh::operator=( |
| ForeignSyncedSessionAsh&&) = default; |
| ForeignSyncedSessionAsh::~ForeignSyncedSessionAsh() = default; |
| |
| ForeignSyncedSessionWindowAsh::ForeignSyncedSessionWindowAsh() = default; |
| ForeignSyncedSessionWindowAsh::ForeignSyncedSessionWindowAsh( |
| const ForeignSyncedSessionWindowAsh&) = default; |
| ForeignSyncedSessionWindowAsh::ForeignSyncedSessionWindowAsh( |
| ForeignSyncedSessionWindowAsh&&) = default; |
| ForeignSyncedSessionWindowAsh& ForeignSyncedSessionWindowAsh::operator=( |
| const ForeignSyncedSessionWindowAsh&) = default; |
| ForeignSyncedSessionWindowAsh& ForeignSyncedSessionWindowAsh::operator=( |
| ForeignSyncedSessionWindowAsh&&) = default; |
| ForeignSyncedSessionWindowAsh::~ForeignSyncedSessionWindowAsh() = default; |
| |
| ForeignSyncedSessionTabAsh::ForeignSyncedSessionTabAsh() = default; |
| ForeignSyncedSessionTabAsh::ForeignSyncedSessionTabAsh( |
| const ForeignSyncedSessionTabAsh&) = default; |
| ForeignSyncedSessionTabAsh::ForeignSyncedSessionTabAsh( |
| ForeignSyncedSessionTabAsh&&) = default; |
| ForeignSyncedSessionTabAsh& ForeignSyncedSessionTabAsh::operator=( |
| const ForeignSyncedSessionTabAsh&) = default; |
| ForeignSyncedSessionTabAsh& ForeignSyncedSessionTabAsh::operator=( |
| ForeignSyncedSessionTabAsh&&) = default; |
| ForeignSyncedSessionTabAsh::~ForeignSyncedSessionTabAsh() = default; |
| |
| SyncedSessionClientAsh::SyncedSessionClientAsh() = default; |
| SyncedSessionClientAsh::~SyncedSessionClientAsh() = default; |
| |
| mojo::PendingRemote<crosapi::mojom::SyncedSessionClient> |
| SyncedSessionClientAsh::CreateRemote() { |
| mojo::PendingReceiver<crosapi::mojom::SyncedSessionClient> pending_receiver; |
| mojo::PendingRemote<crosapi::mojom::SyncedSessionClient> pending_remote = |
| pending_receiver.InitWithNewPipeAndPassRemote(); |
| receivers_.Add(this, std::move(pending_receiver)); |
| return {pending_remote.PassPipe(), |
| crosapi::mojom::SyncedSessionClient::Version_}; |
| } |
| |
| void SyncedSessionClientAsh::OnForeignSyncedPhoneSessionsUpdated( |
| std::vector<crosapi::mojom::SyncedSessionPtr> sessions) { |
| // TODO(b/260599791): Implement the deserialization as a Mojom StructTrait as |
| // a fast follow after initial prototype. |
| last_foreign_synced_phone_sessions_.clear(); |
| for (const crosapi::mojom::SyncedSessionPtr& session : sessions) { |
| ForeignSyncedSessionAsh current_session; |
| current_session.session_name = session->session_name; |
| current_session.modified_time = session->modified_time; |
| for (const crosapi::mojom::SyncedSessionWindowPtr& window : |
| session->windows) { |
| ForeignSyncedSessionWindowAsh current_window; |
| for (const crosapi::mojom::SyncedSessionTabPtr& tab : window->tabs) { |
| ForeignSyncedSessionTabAsh current_tab; |
| current_tab.current_navigation_title = tab->current_navigation_title; |
| current_tab.last_modified_timestamp = tab->last_modified_timestamp; |
| current_tab.current_navigation_url = tab->current_navigation_url; |
| current_window.tabs.push_back(std::move(current_tab)); |
| } |
| current_session.windows.push_back(std::move(current_window)); |
| } |
| last_foreign_synced_phone_sessions_.push_back(std::move(current_session)); |
| } |
| for (auto& observer : observers_) { |
| observer.OnForeignSyncedPhoneSessionsUpdated( |
| last_foreign_synced_phone_sessions_); |
| } |
| } |
| |
| void SyncedSessionClientAsh::OnSessionSyncEnabledChanged(bool enabled) { |
| is_session_sync_enabled_ = enabled; |
| for (auto& observer : observers_) { |
| observer.OnSessionSyncEnabledChanged(is_session_sync_enabled_); |
| } |
| } |
| |
| void SyncedSessionClientAsh::SetFaviconDelegate( |
| mojo::PendingRemote<crosapi::mojom::SyncedSessionClientFaviconDelegate> |
| delegate) { |
| if (favicon_delegate_.is_bound()) { |
| favicon_delegate_.reset(); |
| } |
| |
| favicon_delegate_.Bind(std::move(delegate)); |
| } |
| |
| void SyncedSessionClientAsh::GetFaviconImageForPageURL( |
| const GURL& url, |
| base::OnceCallback<void(const gfx::ImageSkia&)> callback) { |
| if (!favicon_delegate_.is_bound()) { |
| std::move(callback).Run(gfx::ImageSkia()); |
| return; |
| } |
| |
| favicon_delegate_->GetFaviconImageForPageURL(url, std::move(callback)); |
| } |
| |
| void SyncedSessionClientAsh::AddObserver(Observer* observer) { |
| observers_.AddObserver(observer); |
| } |
| |
| void SyncedSessionClientAsh::RemoveObserver(Observer* observer) { |
| observers_.RemoveObserver(observer); |
| } |
| |
| } // namespace ash |