chromium/chromecast/browser/cast_feature_update_observer.cc

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromecast/browser/cast_feature_update_observer.h"

#include "base/check.h"
#include "base/functional/bind.h"
#include "chromecast/base/pref_names.h"
#include "chromecast/common/mojom/constants.mojom.h"
#include "chromecast/external_mojo/external_service_support/external_connector.h"
#include "components/prefs/pref_service.h"

namespace chromecast {

CastFeatureUpdateObserver::CastFeatureUpdateObserver(
    external_service_support::ExternalConnector* connector,
    PrefService* pref_service)
    : connector_(connector), pref_service_(pref_service) {
  DCHECK(connector_);
  DCHECK(pref_service_);

  BindFeatureUpdateService();
}

CastFeatureUpdateObserver::~CastFeatureUpdateObserver() = default;

void CastFeatureUpdateObserver::BindFeatureUpdateService() {
  feature_update_service_.reset();
  receiver_.reset();
  connector_->BindInterface(
      mojom::kChromecastServiceName,
      feature_update_service_.BindNewPipeAndPassReceiver());
  feature_update_service_->RegisterFeatureUpdateObserver(
      receiver_.BindNewPipeAndPassRemote());

  // Right now we are in the process of making the `cast_service` manage the
  // lifecycle of `cast_browser`. Until that is done, `cast_service` has a
  // shorter lifecycle than `cast_browser`, so we need to handle disconnects
  // here.
  // TODO(crbug.com/40210465): remove once process lifecycles are inverted.
  receiver_.set_disconnect_handler(
      base::BindOnce(&CastFeatureUpdateObserver::BindFeatureUpdateService,
                     base::Unretained(this)));
}

void CastFeatureUpdateObserver::OnFeaturesUpdated(base::Value::Dict features) {
  pref_service_->SetDict(prefs::kLatestDCSFeatures, std::move(features));
  pref_service_->CommitPendingWrite();
}

}  // namespace chromecast