15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_impl.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/chrome_version_info.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_thread.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sync/util/get_session_name.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/device_form_factor.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace browser_sync {
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Converts VersionInfo::Channel to string for user-agent string.
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string ChannelToString(chrome::VersionInfo::Channel channel) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (channel) {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::VersionInfo::CHANNEL_UNKNOWN:
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "unknown";
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::VersionInfo::CHANNEL_CANARY:
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "canary";
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::VersionInfo::CHANNEL_DEV:
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "dev";
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::VersionInfo::CHANNEL_BETA:
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "beta";
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case chrome::VersionInfo::CHANNEL_STABLE:
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "stable";
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return "unknown";
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool IsTabletUI() {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisync_pb::SyncEnums::DeviceType GetLocalDeviceType() {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS)
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sync_pb::SyncEnums_DeviceType_TYPE_CROS;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_LINUX)
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sync_pb::SyncEnums_DeviceType_TYPE_LINUX;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sync_pb::SyncEnums_DeviceType_TYPE_MAC;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_WIN)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sync_pb::SyncEnums_DeviceType_TYPE_WIN;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_ANDROID)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return IsTabletUI() ? sync_pb::SyncEnums_DeviceType_TYPE_TABLET
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      : sync_pb::SyncEnums_DeviceType_TYPE_PHONE;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sync_pb::SyncEnums_DeviceType_TYPE_OTHER;
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::LocalDeviceInfoProviderImpl()
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : weak_factory_(this) {
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::~LocalDeviceInfoProviderImpl() {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static.
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string LocalDeviceInfoProviderImpl::MakeUserAgentForSyncApi(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const chrome::VersionInfo& version_info) {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string user_agent;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent = "Chrome ";
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "WIN ";
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_CHROMEOS)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "CROS ";
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_ANDROID)
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsTabletUI())
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_agent += "ANDROID-TABLET ";
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_agent += "ANDROID-PHONE ";
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_LINUX)
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "LINUX ";
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_FREEBSD)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "FREEBSD ";
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_OPENBSD)
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "OPENBSD ";
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX)
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += "MAC ";
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!version_info.is_valid()) {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DLOG(ERROR) << "Unable to create chrome::VersionInfo object";
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return user_agent;
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += version_info.Version();
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user_agent += " (" + version_info.LastChange() + ")";
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!version_info.IsOfficialBuild()) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_agent += "-devel";
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_agent +=
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        " channel(" + ChannelToString(version_info.GetChannel()) + ")";
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return user_agent;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst sync_driver::DeviceInfo*
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::GetLocalDeviceInfo() const {
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return local_device_info_.get();
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string LocalDeviceInfoProviderImpl::GetLocalSyncCacheGUID() const {
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return cache_guid_;
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<sync_driver::LocalDeviceInfoProvider::Subscription>
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::RegisterOnInitializedCallback(
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Closure& callback) {
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!local_device_info_.get());
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return callback_list_.Add(callback);
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LocalDeviceInfoProviderImpl::Initialize(
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& cache_guid, const std::string& signin_scoped_device_id) {
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!cache_guid.empty());
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cache_guid_ = cache_guid;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  syncer::GetSessionName(
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::BrowserThread::GetBlockingPool(),
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&LocalDeviceInfoProviderImpl::InitializeContinuation,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_factory_.GetWeakPtr(),
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 cache_guid,
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 signin_scoped_device_id));
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LocalDeviceInfoProviderImpl::InitializeContinuation(
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& guid,
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& signin_scoped_device_id,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& session_name) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome::VersionInfo version_info;
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  local_device_info_.reset(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new sync_driver::DeviceInfo(guid,
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  session_name,
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  version_info.CreateVersionString(),
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  MakeUserAgentForSyncApi(version_info),
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  GetLocalDeviceType(),
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  signin_scoped_device_id));
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Notify observers.
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  callback_list_.Notify();
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace browser_sync
155