• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
NetworkInfoNetworkInfo33     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 
NetworkMenuModel(NetworkMenu * owner)53   explicit NetworkMenuModel(NetworkMenu* owner) : owner_(owner) {}
~NetworkMenuModel()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.
HasIcons()69   virtual bool HasIcons() const  { return true; }
70   virtual int GetItemCount() const;
71   virtual ui::MenuModel::ItemType GetTypeAt(int index) const;
GetCommandIdAt(int index)72   virtual int GetCommandIdAt(int index) const { return index; }
73   virtual string16 GetLabelAt(int index) const;
IsItemDynamicAt(int index)74   virtual bool IsItemDynamicAt(int index) const { return true; }
75   virtual const gfx::Font* GetLabelFontAt(int index) const;
GetAcceleratorAt(int index,ui::Accelerator * accelerator)76   virtual bool GetAcceleratorAt(int index,
77       ui::Accelerator* accelerator) const { return false; }
78   virtual bool IsItemCheckedAt(int index) const;
GetGroupIdAt(int index)79   virtual int GetGroupIdAt(int index) const { return 0; }
80   virtual bool GetIconAt(int index, SkBitmap* icon);
GetButtonMenuItemAt(int index)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;
HighlightChangedTo(int index)86   virtual void HighlightChangedTo(int index) {}
87   virtual void ActivatedAt(int index);
MenuWillShow()88   virtual void MenuWillShow() {}
SetMenuModelDelegate(ui::MenuModelDelegate * delegate)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 {
MenuItemMenuItem113     MenuItem()
114         : type(ui::MenuModel::TYPE_SEPARATOR),
115           sub_menu_model(NULL),
116           flags(0) {}
MenuItemMenuItem117     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) {}
MenuItemMenuItem125     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.
OnConnectNetwork(const Network * network,SkBitmap selected_icon_)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