Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4549)

Unified Diff: chrome/browser/chromeos/system/ash_system_tray_delegate.cc

Issue 10214013: Created uber tray UI for monitoring ongoing WebDrive sync operations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_util.cc ('k') | ui/resources/ui_resources.grd » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/system/ash_system_tray_delegate.cc
diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
index ab6b54b7a425e54ca194fc4a301249b5f99293bf..37fbac61f36d37a4a20ea27033c90e001d1978f0 100644
--- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
+++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc
@@ -10,6 +10,7 @@
#include "ash/system/bluetooth/bluetooth_observer.h"
#include "ash/system/brightness/brightness_observer.h"
#include "ash/system/date/clock_observer.h"
+#include "ash/system/drive/drive_observer.h"
#include "ash/system/ime/ime_observer.h"
#include "ash/system/network/network_observer.h"
#include "ash/system/power/power_status_observer.h"
@@ -21,6 +22,7 @@
#include "ash/system/user/user_observer.h"
#include "base/chromeos/chromeos_version.h"
#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/audio/audio_handler.h"
@@ -28,6 +30,8 @@
#include "chrome/browser/chromeos/bluetooth/bluetooth_device.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/network_library.h"
+#include "chrome/browser/chromeos/gdata/gdata_system_service.h"
+#include "chrome/browser/chromeos/gdata/gdata_util.h"
#include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "chrome/browser/chromeos/input_method/input_method_util.h"
#include "chrome/browser/chromeos/input_method/input_method_whitelist.h"
@@ -54,16 +58,26 @@
#include "chrome/common/url_constants.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/user_metrics.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
+using gdata::GDataFileSystem;
+using gdata::GDataOperationRegistry;
+using gdata::GDataSystemService;
+using gdata::GDataSystemServiceFactory;
+
namespace chromeos {
namespace {
+// Time delay for rechecking gdata operation when we suspect that there will
+// be no upcoming activity notifications that need to be pushed to UI.
+const int kGDataOperationRecheckDelayMs = 5000;
+
bool ShouldShowNetworkIconInTray(const Network* network) {
if (!network)
return true;
@@ -90,6 +104,25 @@ void ExtractIMEInfo(const input_method::InputMethodDescriptor& ime,
info->short_name = util.GetInputMethodShortName(ime);
}
+ash::DriveOperationStatusList GetDriveStatusList(
+ const std::vector<GDataOperationRegistry::ProgressStatus>& list) {
+ ash::DriveOperationStatusList results;
+ for (GDataOperationRegistry::ProgressStatusList::const_iterator it =
+ list.begin();
+ it != list.end(); ++it) {
+ ash::DriveOperationStatus status;
+ status.file_path = it->file_path;
+ status.progress = it->progress_total == 0 ? 0.0 :
+ static_cast<double>(it->progress_current) /
+ static_cast<double>(it->progress_total);
+ status.type = static_cast<ash::DriveOperationStatus::OperationType>(
+ it->operation_type);
+ status.state = static_cast<ash::DriveOperationStatus::OperationState>(
+ it->transfer_state);
+ results.push_back(status);
+ }
+ return results;
+}
void BluetoothPowerFailure() {
// TODO(sad): Show an error bubble?
@@ -115,6 +148,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
public NetworkLibrary::NetworkManagerObserver,
public NetworkLibrary::NetworkObserver,
public NetworkLibrary::CellularDataPlanObserver,
+ public gdata::GDataOperationRegistry::Observer,
public content::NotificationObserver,
public input_method::InputMethodManager::Observer,
public system::TimezoneSettings::Observer,
@@ -124,6 +158,8 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
public:
explicit SystemTrayDelegate(ash::SystemTray* tray)
: tray_(tray),
+ ui_weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(
+ new base::WeakPtrFactory<SystemTrayDelegate>(this))),
network_icon_(ALLOW_THIS_IN_INITIALIZER_LIST(
new NetworkMenuIcon(this, NetworkMenuIcon::MENU_MODE))),
network_icon_dark_(ALLOW_THIS_IN_INITIALIZER_LIST(
@@ -270,6 +306,10 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
// TODO(sad): Make this work.
}
+ virtual void ShowDriveSettings() OVERRIDE {
+ // TODO(zelidrag): Show settings once we put them in.
+ }
+
virtual void ShowIMESettings() OVERRIDE {
content::RecordAction(
content::UserMetricsAction("OpenLanguageOptionsDialog"));
@@ -404,6 +444,37 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
ActivateInputMethodProperty(key);
}
+ virtual void CancelDriveOperation(const FilePath& file_path) OVERRIDE {
+ Profile* profile = ProfileManager::GetDefaultProfile();
+ if (!gdata::util::IsGDataAvailable(profile))
+ return;
+
+ GDataSystemService* system_service =
+ GDataSystemServiceFactory::FindForProfile(profile);
+ if (!system_service)
+ return;
+
+ system_service->file_system()->GetOperationRegistry()->CancelForFilePath(
+ file_path);
+ }
+
+ virtual void GetDriveOperationStatusList(
+ ash::DriveOperationStatusList* list) OVERRIDE {
+ Profile* profile = ProfileManager::GetDefaultProfile();
+ if (!gdata::util::IsGDataAvailable(profile))
+ return;
+
+ GDataSystemService* system_service =
+ GDataSystemServiceFactory::FindForProfile(profile);
+ if (!system_service)
+ return;
+
+ *list = GetDriveStatusList(
+ system_service->file_system()->GetOperationRegistry()->
+ GetProgressStatusList());
+ }
+
+
virtual void GetMostRelevantNetworkIcon(ash::NetworkIconInfo* info,
bool dark) OVERRIDE {
NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary();
@@ -655,6 +726,13 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
UpdateClockType(profile->GetPrefs());
search_key_mapped_to_ =
profile->GetPrefs()->GetInteger(prefs::kLanguageXkbRemapSearchKeyTo);
+
+ if (gdata::util::IsGDataAvailable(profile)) {
+ GDataSystemService* system_service =
+ GDataSystemServiceFactory::FindForProfile(profile);
+ system_service->file_system()->GetOperationRegistry()->
+ AddObserver(this);
+ }
}
void UpdateClockType(PrefService* service) {
@@ -695,6 +773,12 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
observer->OnIMERefresh();
}
+ void NotifyRefreshDrive(ash::DriveOperationStatusList& list) {
+ ash::DriveObserver* observer = tray_->drive_observer();
+ if (observer)
+ observer->OnDriveRefresh(list);
+ }
+
void RefreshNetworkObserver(NetworkLibrary* crosnet) {
const Network* network = crosnet->active_network();
std::string new_path = network ? network->service_path() : std::string();
@@ -872,6 +956,61 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
NotifyRefreshIME();
}
+ // gdata::GDataOperationRegistry::Observer overrides.
+ virtual void OnProgressUpdate(
+ const GDataOperationRegistry::ProgressStatusList& list) {
+ std::vector<ash::DriveOperationStatus> ui_list = GetDriveStatusList(list);
+ NotifyRefreshDrive(ui_list);
+
+ // If we have something to report right now (i.e. completion status only),
+ // we need to delayed re-check the status in few seconds to ensure we
+ // raise events that will let us properly clear the uber tray state.
+ if (list.size() > 0) {
+ bool has_in_progress_items = false;
+ for (GDataOperationRegistry::ProgressStatusList::const_iterator it =
+ list.begin();
+ it != list.end(); ++it) {
+ if (it->transfer_state ==
+ GDataOperationRegistry::OPERATION_STARTED ||
+ it->transfer_state ==
+ GDataOperationRegistry::OPERATION_IN_PROGRESS ||
+ it->transfer_state ==
+ GDataOperationRegistry::OPERATION_SUSPENDED) {
+ has_in_progress_items = true;
+ break;
+ }
+ }
+
+ if (!has_in_progress_items) {
+ content::BrowserThread::PostDelayedTask(
+ content::BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&SystemTrayDelegate::RecheckGDataOperations,
+ ui_weak_ptr_factory_->GetWeakPtr()),
+ base::TimeDelta::FromMilliseconds(kGDataOperationRecheckDelayMs));
+ }
+ }
+
+ }
+
+ // Pulls the list of ongoing drive operations and initiates status update.
+ // This method is needed to ensure delayed cleanup of the latest reported
+ // status in UI in cases when there are no new changes coming (i.e. when the
+ // last set of transfer operations completed).
+ void RecheckGDataOperations() {
+ Profile* profile = ProfileManager::GetDefaultProfile();
+ if (!gdata::util::IsGDataAvailable(profile))
+ return;
+
+ GDataSystemService* system_service =
+ GDataSystemServiceFactory::FindForProfile(profile);
+ if (!system_service)
+ return;
+
+ OnProgressUpdate(system_service->file_system()->GetOperationRegistry()->
+ GetProgressStatusList());
+ }
+
// Overridden from system::TimezoneSettings::Observer.
virtual void TimezoneChanged(const icu::TimeZone& timezone) OVERRIDE {
NotifyRefreshClock();
@@ -957,6 +1096,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate,
}
ash::SystemTray* tray_;
+ scoped_ptr<base::WeakPtrFactory<SystemTrayDelegate> > ui_weak_ptr_factory_;
scoped_ptr<NetworkMenuIcon> network_icon_;
scoped_ptr<NetworkMenuIcon> network_icon_dark_;
scoped_ptr<NetworkMenu> network_menu_;
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_util.cc ('k') | ui/resources/ui_resources.grd » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698