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_H_
      6 #define CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "chrome/browser/chromeos/options/network_config_view.h"
     13 #include "third_party/skia/include/core/SkBitmap.h"
     14 #include "ui/base/models/menu_model.h"
     15 #include "ui/gfx/native_widget_types.h"
     16 #include "views/controls/menu/view_menu_delegate.h"
     17 
     18 namespace gfx {
     19 class Canvas;
     20 }
     21 
     22 namespace views {
     23 class Menu2;
     24 }
     25 
     26 namespace chromeos {
     27 
     28 class NetworkMenu;
     29 
     30 class NetworkMenuModel : public ui::MenuModel {
     31  public:
     32   struct NetworkInfo {
     33     NetworkInfo() :
     34         need_passphrase(false), remembered(true), auto_connect(true) {}
     35     // "ethernet" | "wifi" | "cellular" | "other".
     36     std::string network_type;
     37     // "connected" | "connecting" | "disconnected" | "error".
     38     std::string status;
     39     // status message or error message, empty if unknown status.
     40     std::string message;
     41     // IP address (if network is active, empty otherwise)
     42     std::string ip_address;
     43     // Remembered passphrase.
     44     std::string passphrase;
     45     // true if the network requires a passphrase.
     46     bool need_passphrase;
     47     // true if the network is currently remembered.
     48     bool remembered;
     49     // true if the network is auto connect (meaningful for Wifi only).
     50     bool auto_connect;
     51   };
     52 
     53   explicit NetworkMenuModel(NetworkMenu* owner) : owner_(owner) {}
     54   virtual ~NetworkMenuModel() {}
     55 
     56   // Connect or reconnect to the network at |index|.
     57   // If remember >= 0, set the favorite state of the network.
     58   // Returns true if a connect occurred (e.g. menu should be closed).
     59   bool ConnectToNetworkAt(int index,
     60                           const std::string& passphrase,
     61                           const std::string& ssid,
     62                           int remember) const;
     63 
     64   // Called by NetworkMenu::RunMenu to initialize list of menu items.
     65   virtual void InitMenuItems(bool is_browser_mode,
     66                              bool should_open_button_options) = 0;
     67 
     68   // ui::MenuModel implementation.
     69   virtual bool HasIcons() const  { return true; }
     70   virtual int GetItemCount() const;
     71   virtual ui::MenuModel::ItemType GetTypeAt(int index) const;
     72   virtual int GetCommandIdAt(int index) const { return index; }
     73   virtual string16 GetLabelAt(int index) const;
     74   virtual bool IsItemDynamicAt(int index) const { return true; }
     75   virtual const gfx::Font* GetLabelFontAt(int index) const;
     76   virtual bool GetAcceleratorAt(int index,
     77       ui::Accelerator* accelerator) const { return false; }
     78   virtual bool IsItemCheckedAt(int index) const;
     79   virtual int GetGroupIdAt(int index) const { return 0; }
     80   virtual bool GetIconAt(int index, SkBitmap* icon);
     81   virtual ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const {
     82     return NULL;
     83   }
     84   virtual bool IsEnabledAt(int index) const;
     85   virtual ui::MenuModel* GetSubmenuModelAt(int index) const;
     86   virtual void HighlightChangedTo(int index) {}
     87   virtual void ActivatedAt(int index);
     88   virtual void MenuWillShow() {}
     89   virtual void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) {}
     90 
     91  protected:
     92   enum MenuItemFlags {
     93     FLAG_NONE              = 0,
     94     FLAG_DISABLED          = 1 << 0,
     95     FLAG_TOGGLE_ETHERNET   = 1 << 1,
     96     FLAG_TOGGLE_WIFI       = 1 << 2,
     97     FLAG_TOGGLE_CELLULAR   = 1 << 3,
     98     FLAG_TOGGLE_OFFLINE    = 1 << 4,
     99     FLAG_ASSOCIATED        = 1 << 5,
    100     FLAG_ETHERNET          = 1 << 6,
    101     FLAG_WIFI              = 1 << 7,
    102     FLAG_CELLULAR          = 1 << 8,
    103     FLAG_OPTIONS           = 1 << 9,
    104     FLAG_ADD_WIFI          = 1 << 10,
    105     FLAG_ADD_CELLULAR      = 1 << 11,
    106     FLAG_VPN               = 1 << 12,
    107     FLAG_ADD_VPN           = 1 << 13,
    108     FLAG_DISCONNECT_VPN    = 1 << 14,
    109     FLAG_VIEW_ACCOUNT      = 1 << 15,
    110   };
    111 
    112   struct MenuItem {
    113     MenuItem()
    114         : type(ui::MenuModel::TYPE_SEPARATOR),
    115           sub_menu_model(NULL),
    116           flags(0) {}
    117     MenuItem(ui::MenuModel::ItemType type, string16 label, SkBitmap icon,
    118              const std::string& service_path, int flags)
    119         : type(type),
    120           label(label),
    121           icon(icon),
    122           service_path(service_path),
    123           sub_menu_model(NULL),
    124           flags(flags) {}
    125     MenuItem(ui::MenuModel::ItemType type, string16 label, SkBitmap icon,
    126              NetworkMenuModel* sub_menu_model, int flags)
    127         : type(type),
    128           label(label),
    129           icon(icon),
    130           sub_menu_model(sub_menu_model),
    131           flags(flags) {}
    132 
    133     ui::MenuModel::ItemType type;
    134     string16 label;
    135     SkBitmap icon;
    136     std::string service_path;
    137     NetworkMenuModel* sub_menu_model;  // Weak.
    138     int flags;
    139   };
    140   typedef std::vector<MenuItem> MenuItemVector;
    141 
    142   // Our menu items.
    143   MenuItemVector menu_items_;
    144 
    145   NetworkMenu* owner_;  // Weak pointer to NetworkMenu that owns this MenuModel.
    146 
    147   // Top up URL of the current carrier on empty string if there's none.
    148   std::string top_up_url_;
    149 
    150   // Carrier ID which top up URL is initialized for.
    151   // Used to update top up URL only when cellular carrier has changed.
    152   std::string carrier_id_;
    153 
    154  private:
    155   // Show a NetworkConfigView modal dialog instance.
    156   void ShowNetworkConfigView(NetworkConfigView* view) const;
    157 
    158   void ActivateCellular(const CellularNetwork* cellular) const;
    159   void ShowOther(ConnectionType type) const;
    160   void ShowOtherCellular() const;
    161 
    162   DISALLOW_COPY_AND_ASSIGN(NetworkMenuModel);
    163 };
    164 
    165 // Menu for network menu button in the status area/welcome screen.
    166 // This class will populating the menu with the list of networks.
    167 // It will also handle connecting to another wifi/cellular network.
    168 //
    169 // The network menu looks like this:
    170 //
    171 // <icon>  Ethernet
    172 // <icon>  Wifi Network A
    173 // <icon>  Wifi Network B
    174 // <icon>  Wifi Network C
    175 // <icon>  Cellular Network A
    176 // <icon>  Cellular Network B
    177 // <icon>  Cellular Network C
    178 // <icon>  Other...
    179 // <icon>  Private networks ->
    180 //         <icon>  Virtual Network A
    181 //         <icon>  Virtual Network B
    182 //         ----------------------------------
    183 //                 Add private network...
    184 //                 Disconnect private network
    185 // --------------------------------
    186 //         Disable Wifi
    187 //         Disable Celluar
    188 // --------------------------------
    189 //         <IP Address>
    190 //         Network settings...
    191 //
    192 // <icon> will show the strength of the wifi/cellular networks.
    193 // The label will be BOLD if the network is currently connected.
    194 class NetworkMenu : public views::ViewMenuDelegate {
    195  public:
    196   NetworkMenu();
    197   virtual ~NetworkMenu();
    198 
    199   void SetFirstLevelMenuWidth(int width);
    200 
    201   // Cancels the active menu.
    202   void CancelMenu();
    203 
    204   virtual bool IsBrowserMode() const = 0;
    205 
    206   // The following methods returns pointer to a shared instance of the SkBitmap.
    207   // This shared bitmap is owned by the resource bundle and should not be freed.
    208 
    209   // Returns the Icon for a network strength for a WifiNetwork |wifi|.
    210   // |black| is used to specify whether to return a black icon for display
    211   // on a light background or a white icon for display on a dark background.
    212   // Expected to never return NULL.
    213   static const SkBitmap* IconForNetworkStrength(const WifiNetwork* wifi,
    214                                                 bool black);
    215   // Returns the Icon for a network strength for CellularNetwork |cellular|.
    216   // |black| is used to specify whether to return a black icon for display
    217   // on a light background or a white icon for display on a dark background.
    218   // Expected to never return NULL.
    219   static const SkBitmap* IconForNetworkStrength(const CellularNetwork* cellular,
    220                                                 bool black);
    221   // Returns the Icon for animating network connecting.
    222   // |animation_value| is the value from Animation.GetCurrentValue()
    223   // |black| is used to specify whether to return a black icon for display
    224   // on a light background or a white icon for display on a dark background.
    225   // Expected to never return NULL.
    226   static const SkBitmap* IconForNetworkConnecting(double animation_value,
    227                                                   bool black);
    228 
    229   // Returns the Badge for a given network technology.
    230   // This returns different colored symbols depending on cellular data left.
    231   // Returns NULL if not badge is needed.
    232   static const SkBitmap* BadgeForNetworkTechnology(
    233       const CellularNetwork* cellular);
    234   // Returns the Badge for a given network roaming status.
    235   // This returns "R" badge if network is in roaming state, otherwise
    236   // returns NULL. Badge is supposed to be shown on top right of the icon.
    237   static const SkBitmap* BadgeForRoamingStatus(const CellularNetwork* cellular);
    238   // Returns the badge for the given network if it's active with vpn.
    239   // If |network| is not null, will check if it's the active network.
    240   // If |network| is null or if |network| is the active one, the yellow lock
    241   // badge will be returned, otherwise returns null.
    242   // Badge is supposed to be shown on in bottom left corner of the icon.
    243   static const SkBitmap* BadgeForPrivateNetworkStatus(const Network* network);
    244 
    245   // This method will convert the |icon| bitmap to the correct size for display.
    246   // |icon| must be non-NULL.
    247   // If |badge| icon is not NULL, it will be drawn on top of the icon in
    248   // the bottom-right corner.
    249   static SkBitmap IconForDisplay(const SkBitmap* icon, const SkBitmap* badge);
    250   // This method will convert the |icon| bitmap to the correct size for display.
    251   // |icon| must be non-NULL.
    252   // If one of the |bottom_right_badge| or |top_left_badge| or
    253   // |bottom_left_badge| icons are not NULL, they will be drawn on top of the
    254   // icon.
    255   static SkBitmap IconForDisplay(const SkBitmap* icon,
    256                                  const SkBitmap* bottom_right_badge,
    257                                  const SkBitmap* top_left_badge,
    258                                  const SkBitmap* bottom_left_badge);
    259 
    260  protected:
    261   virtual gfx::NativeWindow GetNativeWindow() const = 0;
    262   virtual void OpenButtonOptions() = 0;
    263   virtual bool ShouldOpenButtonOptions() const = 0;
    264 
    265   // Notify subclasses that connection to |network| was initiated.
    266   virtual void OnConnectNetwork(const Network* network,
    267                                 SkBitmap selected_icon_) {}
    268 
    269   // Shows network details in Web UI options window.
    270   void ShowTabbedNetworkSettings(const Network* network) const;
    271 
    272   // Update the menu (e.g. when the network list or status has changed).
    273   void UpdateMenu();
    274 
    275  private:
    276   friend class NetworkMenuModel;
    277 
    278   // views::ViewMenuDelegate implementation.
    279   virtual void RunMenu(views::View* source, const gfx::Point& pt);
    280 
    281   // Set to true if we are currently refreshing the menu.
    282   bool refreshing_menu_;
    283 
    284   // The number of bars images for representing network strength.
    285   static const int kNumBarsImages;
    286 
    287   // Bars image resources.
    288   static const int kBarsImages[];
    289   static const int kBarsImagesBlack[];
    290   static const int kBarsImagesOrange[];
    291   // TODO(chocobo): Add this back when we decide to do colored bars again.
    292   // static const int kBarsImagesVLowData[];
    293 
    294   // Animation images. These are created lazily.
    295   static SkBitmap kAnimatingImages[];
    296   static SkBitmap kAnimatingImagesBlack[];
    297 
    298   // The network menu.
    299   scoped_ptr<views::Menu2> network_menu_;
    300 
    301   scoped_ptr<NetworkMenuModel> main_menu_model_;
    302 
    303   // Holds minimum width or -1 if it wasn't set up.
    304   int min_width_;
    305 
    306   // If true, call into the settings UI for network configuration dialogs.
    307   bool use_settings_ui_;
    308 
    309   DISALLOW_COPY_AND_ASSIGN(NetworkMenu);
    310 };
    311 
    312 }  // namespace chromeos
    313 
    314 #endif  // CHROME_BROWSER_CHROMEOS_STATUS_NETWORK_MENU_H_
    315