1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/sms_observer.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/notifications/system_notification.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/theme_resources.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "third_party/cros/chromeos_network.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos { 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSmsObserver::SmsObserver(Profile* profile) 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : profile_(profile) { 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(profile_); 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!CrosLibrary::Get()->EnsureLoaded()) 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateObservers(chromeos::CrosLibrary::Get()->GetNetworkLibrary()); 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenSmsObserver::~SmsObserver() { 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NetworkLibrary* library = chromeos::CrosLibrary::Get()->GetNetworkLibrary(); 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen library->RemoveNetworkManagerObserver(this); 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DisconnectAll(); 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SmsObserver::UpdateObservers(NetworkLibrary* library) { 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!CrosLibrary::Get()->EnsureLoaded()) 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const CellularNetworkVector& networks = library->cellular_networks(); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove monitors for networks that are not in the list anymore. 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ObserversMap::iterator it_observer = observers_.begin(); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it_observer != observers_.end();) { 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool found = false; 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (CellularNetworkVector::const_iterator it_network = networks.begin(); 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it_network != networks.end(); ++it_network) { 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (it_observer->first == (*it_network)->device_path()) { 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen found = true; 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen break; 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!found) { 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Remove SMS monitor for " << it_observer->first; 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DisconnectSMSMonitor(it_observer->second); 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.erase(it_observer++); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++it_observer; 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add monitors for new networks. 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (CellularNetworkVector::const_iterator it_network = networks.begin(); 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it_network != networks.end(); ++it_network) { 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ObserversMap::iterator it_observer = 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.find((*it_network)->device_path()); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (it_observer == observers_.end()) { 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Add SMS monitor for " << (*it_network)->device_path(); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.insert(ObserversMap::value_type((*it_network)->device_path(), 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MonitorSMS((*it_network)->device_path().c_str(), 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &StaticCallback, this))); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Already has SMS monitor for " << (*it_network)->device_path(); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SmsObserver::DisconnectAll() { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!CrosLibrary::Get()->EnsureLoaded()) 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ObserversMap::iterator it = observers_.begin(); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it != observers_.end(); ++it) { 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "Remove SMS monitor for " << it->first; 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DisconnectSMSMonitor(it->second); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen observers_.clear(); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SmsObserver::OnNetworkManagerChanged(NetworkLibrary* library) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateObservers(library); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SmsObserver::StaticCallback(void* object, 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* modem_device_path, 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const SMS* message) { 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SmsObserver* monitor = static_cast<SmsObserver*>(object); 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen monitor->OnNewMessage(modem_device_path, message); 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SmsObserver::OnNewMessage(const char* modem_device_path, 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const SMS* message) { 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VLOG(1) << "New message notification from " << message->number 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen << " text: " << message->text; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SystemNotification note( 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_, 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "incoming _sms.chromeos", 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDR_NOTIFICATION_SMS, 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen l10n_util::GetStringFUTF16( 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_SMS_NOTIFICATION_TITLE, UTF8ToUTF16(message->number))); 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen note.Show(UTF8ToUTF16(message->text), true, false); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace chromeos 114