summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/sync_status_ui_helper.cc
blob: 22a1f6ce049bf749c8014a456e05a81bf60d53b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifdef CHROME_PERSONALIZATION

#include "chrome/browser/sync/sync_status_ui_helper.h"

#include "base/string_util.h"
#include "chrome/browser/sync/auth_error_state.h"
#include "chrome/browser/sync/personalization_strings.h"
#include "chrome/browser/sync/profile_sync_service.h"

static void GetLabelsForAuthError(AuthErrorState auth_error,
    ProfileSyncService* service, std::wstring* status_label,
    std::wstring* link_label) {
  if (link_label)
    link_label->assign(kSyncReLoginLinkLabel);
  if (auth_error == AUTH_ERROR_INVALID_GAIA_CREDENTIALS) {
    // If the user name is empty then the first login failed, otherwise the
    // credentials are out-of-date.
    if (service->GetAuthenticatedUsername().empty())
      status_label->append(kSyncInvalidCredentialsError);
    else
      status_label->append(kSyncExpiredCredentialsError);
  } else if (auth_error == AUTH_ERROR_CONNECTION_FAILED) {
    // Note that there is little the user can do if the server is not
    // reachable. Since attempting to re-connect is done automatically by
    // the Syncer, we do not show the (re)login link.
    status_label->append(kSyncServerUnavailableMsg);
    if (link_label)
      link_label->clear();
  } else {
    status_label->append(kSyncOtherLoginErrorLabel);
  }
}

static std::wstring GetSyncedStateStatusLabel(ProfileSyncService* service) {
  std::wstring label;
  std::wstring user_name(UTF16ToWide(service->GetAuthenticatedUsername()));
  if (user_name.empty())
    return label;

  label += kSyncAccountLabel;
  label += user_name;
  label += L"\n";
  label += kLastSyncedLabel;
  label += service->GetLastSyncedTimeString();
  return label;
}

// static
SyncStatusUIHelper::MessageType SyncStatusUIHelper::GetLabels(
    ProfileSyncService* service, std::wstring* status_label,
    std::wstring* link_label) {
  MessageType result_type(SYNCED);
  bool sync_enabled = service->IsSyncEnabledByUser();

  if (sync_enabled) {
    ProfileSyncService::Status status(service->QueryDetailedSyncStatus());
    AuthErrorState auth_error(service->GetAuthErrorState());
    // Either show auth error information with a link to re-login, auth in prog,
    // or note that everything is OK with the last synced time.
    status_label->assign(GetSyncedStateStatusLabel(service));
    if (status.authenticated) {
      // Everything is peachy.
      DCHECK_EQ(auth_error, AUTH_ERROR_NONE);
    } else if (service->UIShouldDepictAuthInProgress()) {
      status_label->append(kSyncAuthenticatingLabel);
      result_type = PRE_SYNCED;
    } else if (auth_error != AUTH_ERROR_NONE) {
      GetLabelsForAuthError(auth_error, service, status_label, link_label);
      result_type = SYNC_ERROR;
    } else {
      NOTREACHED() << "Setup complete, backend !authenticated, AUTH_ERROR_NONE";
    }
  } else {
    // Either show auth error information with a link to re-login, auth in prog,
    // or provide a link to continue with setup.
    result_type = PRE_SYNCED;
    if (service->SetupInProgress()) {
      ProfileSyncService::Status status(service->QueryDetailedSyncStatus());
      AuthErrorState auth_error(service->GetAuthErrorState());
      status_label->assign(UTF8ToWide(kSettingUpText));
      if (service->UIShouldDepictAuthInProgress()) {
        status_label->assign(kSyncAuthenticatingLabel);
      } else if (auth_error != AUTH_ERROR_NONE) {
        status_label->clear();
        GetLabelsForAuthError(auth_error, service, status_label, NULL);
        result_type = SYNC_ERROR;
      } else if (!status.authenticated) {
        status_label->assign(kSyncCredentialsNeededLabel);
      }
    } else {
      status_label->assign(kSyncNotSetupInfo);
    }
  }
  return result_type;
}

#endif  // CHROME_PERSONALIZATION