Home | History | Annotate | Download | only in status
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_BUTTON_H_
      6 #define CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_BUTTON_H_
      7 #pragma once
      8 
      9 #include <string>
     10 
     11 #include "base/task.h"
     12 #include "base/timer.h"
     13 #include "chrome/browser/chromeos/cros/network_library.h"
     14 #include "chrome/browser/chromeos/customization_document.h"
     15 #include "chrome/browser/chromeos/login/message_bubble.h"
     16 #include "chrome/browser/chromeos/status/network_menu.h"
     17 #include "chrome/browser/chromeos/status/status_area_button.h"
     18 #include "ui/base/animation/throb_animation.h"
     19 
     20 namespace gfx {
     21 class Canvas;
     22 }
     23 
     24 namespace chromeos {
     25 
     26 class StatusAreaHost;
     27 
     28 // The network menu button in the status area.
     29 // This class will handle getting the wifi networks and populating the menu.
     30 // It will also handle the status icon changing and connecting to another
     31 // wifi/cellular network.
     32 //
     33 // The network menu looks like this:
     34 //
     35 // <icon>  Ethernet
     36 // <icon>  Wifi Network A
     37 // <icon>  Wifi Network B
     38 // <icon>  Wifi Network C
     39 // <icon>  Cellular Network A
     40 // <icon>  Cellular Network B
     41 // <icon>  Cellular Network C
     42 // <icon>  Other...
     43 // --------------------------------
     44 //         Disable Wifi
     45 //         Disable Celluar
     46 // --------------------------------
     47 //         <IP Address>
     48 //         Network settings...
     49 //
     50 // <icon> will show the strength of the wifi/cellular networks.
     51 // The label will be BOLD if the network is currently connected.
     52 class NetworkMenuButton : public StatusAreaButton,
     53                           public NetworkMenu,
     54                           public NetworkLibrary::NetworkDeviceObserver,
     55                           public NetworkLibrary::NetworkManagerObserver,
     56                           public NetworkLibrary::NetworkObserver,
     57                           public NetworkLibrary::CellularDataPlanObserver,
     58                           public MessageBubbleDelegate {
     59  public:
     60   explicit NetworkMenuButton(StatusAreaHost* host);
     61   virtual ~NetworkMenuButton();
     62 
     63   // ui::AnimationDelegate implementation.
     64   virtual void AnimationProgressed(const ui::Animation* animation);
     65 
     66   // NetworkLibrary::NetworkDeviceObserver implementation.
     67   virtual void OnNetworkDeviceChanged(NetworkLibrary* cros,
     68                                       const NetworkDevice* device);
     69   // NetworkLibrary::NetworkManagerObserver implementation.
     70   virtual void OnNetworkManagerChanged(NetworkLibrary* cros);
     71   // NetworkLibrary::NetworkObserver implementation.
     72   virtual void OnNetworkChanged(NetworkLibrary* cros, const Network* network);
     73   // NetworkLibrary::CellularDataPlanObserver implementation.
     74   virtual void OnCellularDataPlanChanged(NetworkLibrary* cros);
     75 
     76   // NetworkMenu implementation:
     77   virtual bool IsBrowserMode() const;
     78 
     79  protected:
     80   // NetworkMenu implementation:
     81   virtual gfx::NativeWindow GetNativeWindow() const;
     82   virtual void OpenButtonOptions();
     83   virtual bool ShouldOpenButtonOptions() const;
     84 
     85   // views::View
     86   virtual void OnLocaleChanged() OVERRIDE;
     87 
     88   // MessageBubbleDelegate implementation:
     89   virtual void BubbleClosing(Bubble* bubble, bool closed_by_escape) {
     90     mobile_data_bubble_ = NULL;
     91   }
     92   virtual bool CloseOnEscape() { return true; }
     93   virtual bool FadeInOnShow() { return false; }
     94   virtual void OnHelpLinkActivated();
     95 
     96  private:
     97   // Returns carrier deal if it's specified and should be shown,
     98   // otherwise returns NULL.
     99   const ServicesCustomizationDocument::CarrierDeal* GetCarrierDeal(
    100       NetworkLibrary* cros);
    101 
    102   // Sets the icon and the badges (badges are at the bottom of the icon).
    103   void SetIconAndBadges(const SkBitmap* icon,
    104                         const SkBitmap* right_badge,
    105                         const SkBitmap* left_badge);
    106   // Sets the icon only. Keep the previous badge.
    107   void SetIconOnly(const SkBitmap* icon);
    108   // Sets the badges only. Keep the previous icon.
    109   void SetBadgesOnly(const SkBitmap* right_badge, const SkBitmap* left_badge);
    110   // Set the network icon based on the status of the |network|
    111   void SetNetworkIcon(NetworkLibrary* cros, const Network* network);
    112 
    113   // Called when the list of devices has possibly changed. This will remove
    114   // old network device observers and add a network observers
    115   // for the new devices.
    116   void RefreshNetworkDeviceObserver(NetworkLibrary* cros);
    117 
    118   // Called when the active network has possibly changed. This will remove
    119   // old network observer and add a network observer for the active network.
    120   void RefreshNetworkObserver(NetworkLibrary* cros);
    121 
    122   // Shows 3G promo notification if needed.
    123   void ShowOptionalMobileDataPromoNotification(NetworkLibrary* cros);
    124 
    125   // Path of the Cellular device that we monitor property updates from.
    126   std::string cellular_device_path_;
    127 
    128   // The icon showing the network strength.
    129   const SkBitmap* icon_;
    130   // A badge icon displayed on top of icon, in bottom-right corner.
    131   const SkBitmap* right_badge_;
    132   // A  badge icon displayed on top of icon, in bottom-left corner.
    133   const SkBitmap* left_badge_;
    134 
    135   // Notification bubble for 3G promo.
    136   MessageBubble* mobile_data_bubble_;
    137 
    138   // True if check for promo needs to be done,
    139   // otherwise just ignore it for current session.
    140   bool check_for_promo_;
    141 
    142   // Cellular device SIM was locked when we last checked
    143   bool was_sim_locked_;
    144 
    145   // The throb animation that does the wifi connecting animation.
    146   ui::ThrobAnimation animation_connecting_;
    147 
    148   // The duration of the icon throbbing in milliseconds.
    149   static const int kThrobDuration;
    150 
    151   // If any network is currently active, this is the service path of the one
    152   // whose status is displayed in the network menu button.
    153   std::string active_network_;
    154 
    155   // Current carrier deal URL.
    156   std::string deal_url_;
    157 
    158   // Factory for delaying showing promo notification.
    159   ScopedRunnableMethodFactory<NetworkMenuButton> method_factory_;
    160 
    161   DISALLOW_COPY_AND_ASSIGN(NetworkMenuButton);
    162 };
    163 
    164 }  // namespace chromeos
    165 
    166 #endif  // CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_BUTTON_H_
    167