Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / mobile / mobile_activator.h
1 // Copyright (c) 2012 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_MOBILE_MOBILE_ACTIVATOR_H_
6 #define CHROME_BROWSER_CHROMEOS_MOBILE_MOBILE_ACTIVATOR_H_
7
8 #include <map>
9 #include <string>
10
11 #include "base/files/file_path.h"
12 #include "base/gtest_prod_util.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/singleton.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/observer_list.h"
17 #include "base/timer/timer.h"
18 #include "chromeos/network/network_handler_callbacks.h"
19 #include "chromeos/network/network_state_handler_observer.h"
20
21 namespace base {
22 class DictionaryValue;
23 }
24
25 namespace chromeos {
26
27 class NetworkConnectionHandler;
28 class NetworkState;
29 class NetworkStateHandler;
30 class TestMobileActivator;
31
32 // Cellular plan config document.
33 class CellularConfigDocument
34     : public base::RefCountedThreadSafe<CellularConfigDocument> {
35  public:
36   CellularConfigDocument();
37
38   // Return error message for a given code.
39   std::string GetErrorMessage(const std::string& code);
40   void LoadCellularConfigFile();
41   const std::string& version() { return version_; }
42
43  private:
44   friend class base::RefCountedThreadSafe<CellularConfigDocument>;
45   typedef std::map<std::string, std::string> ErrorMap;
46
47   virtual ~CellularConfigDocument();
48
49   void SetErrorMap(const ErrorMap& map);
50   bool LoadFromFile(const base::FilePath& config_path);
51
52   std::string version_;
53   ErrorMap error_map_;
54   base::Lock config_lock_;
55
56   DISALLOW_COPY_AND_ASSIGN(CellularConfigDocument);
57 };
58
59 // This class performs mobile plan activation process.
60 //
61 // There are two types of activation flow:
62 //
63 //   1. Over-the-air Service Provision (OTASP) activation
64 //      a. Call shill Activate() to partially activate modem so it can
65 //         connect to the network.
66 //      b. Enable auto-connect on the modem so it will connect to the network
67 //         in the next step.
68 //      c. Call shill Activate() again which resets the modem, when the modem
69 //         comes back, it will auto-connect to the network.
70 //      d. Navigate to the payment portal.
71 //      e. Activate the modem using OTASP via shill Activate().
72 //
73 //   2. Simple activation - used by non-cellular activation and over-the-air
74 //      (OTA) activation.
75 //      a. Ensure there's a network connection.
76 //      a. Navigate to payment portal.
77 //      b. Activate the modem via shill CompletetActivation().
78 class MobileActivator
79     : public base::SupportsWeakPtr<MobileActivator>,
80       public NetworkStateHandlerObserver {
81  public:
82   // Activation state.
83   enum PlanActivationState {
84     // Activation WebUI page is loading, activation not started.
85     PLAN_ACTIVATION_PAGE_LOADING            = -1,
86     // Activation process started.
87     PLAN_ACTIVATION_START                   = 0,
88     // Initial over the air activation attempt.
89     PLAN_ACTIVATION_TRYING_OTASP            = 1,
90     // Performing pre-activation process.
91     PLAN_ACTIVATION_INITIATING_ACTIVATION   = 3,
92     // Reconnecting to network. Used for networks activated over cellular
93     // connection.
94     PLAN_ACTIVATION_RECONNECTING            = 4,
95     // Passively waiting for a network connection. Used for networks activated
96     // over non-cellular network.
97     PLAN_ACTIVATION_WAITING_FOR_CONNECTION  = 5,
98     // Loading payment portal page.
99     PLAN_ACTIVATION_PAYMENT_PORTAL_LOADING  = 6,
100     // Showing payment portal page.
101     PLAN_ACTIVATION_SHOWING_PAYMENT         = 7,
102     // Decides whether to load the portal again or call us done.
103     PLAN_ACTIVATION_RECONNECTING_PAYMENT    = 8,
104     // Delaying activation until payment portal catches up.
105     PLAN_ACTIVATION_DELAY_OTASP             = 9,
106     // Starting post-payment activation attempt.
107     PLAN_ACTIVATION_START_OTASP             = 10,
108     // Attempting activation.
109     PLAN_ACTIVATION_OTASP                   = 11,
110     // Finished activation.
111     PLAN_ACTIVATION_DONE                    = 12,
112     // Error occured during activation process.
113     PLAN_ACTIVATION_ERROR                   = 0xFF,
114   };
115
116   // Activation process observer.
117   class Observer {
118    public:
119     // Signals activation |state| change for given |network|.
120     virtual void OnActivationStateChanged(
121         const NetworkState* network,
122         PlanActivationState state,
123         const std::string& error_description) = 0;
124
125    protected:
126     Observer() {}
127     virtual ~Observer() {}
128   };
129
130   static MobileActivator* GetInstance();
131
132   // Add/remove activation process observer.
133   void AddObserver(Observer* observer);
134   void RemoveObserver(Observer* observer);
135
136   // Activation is in process.
137   bool RunningActivation() const;
138   // Activation state.
139   PlanActivationState state() const { return state_; }
140   // Initiates activation process.  Can only be called from the UI thread.
141   void InitiateActivation(const std::string& service_path);
142   // Terminates activation process if already started.
143   void TerminateActivation();
144   // Process portal load attempt status.
145   void OnPortalLoaded(bool success);
146   // Process payment transaction status.
147   void OnSetTransactionStatus(bool success);
148
149  protected:
150   // For unit tests.
151   void set_state_for_test(PlanActivationState state) {
152     state_ = state;
153   }
154   virtual const NetworkState* GetNetworkState(const std::string& service_path);
155   virtual const NetworkState* GetDefaultNetwork();
156
157  private:
158   friend struct DefaultSingletonTraits<MobileActivator>;
159   friend class TestMobileActivator;
160   friend class MobileActivatorTest;
161
162   MobileActivator();
163   virtual ~MobileActivator();
164
165   // NetworkStateHandlerObserver overrides.
166   virtual void DefaultNetworkChanged(const NetworkState* network) override;
167   virtual void NetworkPropertiesUpdated(const NetworkState* network) override;
168
169   // Continue activation after inital setup (config load). Makes an
170   // asynchronous call to NetworkConfigurationHandler::GetProperties.
171   void ContinueActivation();
172   void GetPropertiesAndContinueActivation(
173       const std::string& service_path,
174       const base::DictionaryValue& properties);
175   void GetPropertiesFailure(const std::string& error_name,
176                             scoped_ptr<base::DictionaryValue> error_data);
177   // Handles the signal that the payment portal has finished loading.
178   void HandlePortalLoaded(bool success);
179   // Handles the signal that the user has finished with the portal.
180   void HandleSetTransactionStatus(bool success);
181   // Starts activation.
182   void StartActivation();
183   // Starts activation over non-cellular network.
184   void StartActivationOverNonCellularNetwork();
185   // Starts OTA activation.
186   void StartActivationOTA();
187   // Starts OTASP activation.
188   void StartActivationOTASP();
189   // Called after we delay our OTASP (after payment).
190   void RetryOTASP();
191   // Continues activation process. This method is called after we disconnect
192   // due to detected connectivity issue to kick off reconnection.
193   void ContinueConnecting();
194
195   // Sends message to host registration page with system/user info data.
196   void SendDeviceInfo();
197
198   // Starts OTASP process.
199   void StartOTASP();
200   // Called when an OTASP attempt times out.
201   void HandleOTASPTimeout();
202   // Connect to network.
203   virtual void ConnectNetwork(const NetworkState* network);
204   // Forces disconnect / reconnect when we detect portal connectivity issues.
205   void ForceReconnect(const NetworkState* network,
206                       PlanActivationState next_state);
207   // Called when ForceReconnect takes too long to reconnect.
208   void ReconnectTimedOut();
209
210   // Called on default network changes to update cellular network activation
211   // state.
212   void RefreshCellularNetworks();
213
214   // Verify the state of cellular network and modify internal state.
215   virtual void EvaluateCellularNetwork(const NetworkState* network);
216   // PickNextState selects the desired state based on the current state of the
217   // modem and the activator.  It does not transition to this state however.
218   PlanActivationState PickNextState(const NetworkState* network,
219                                     std::string* error_description) const;
220   // One of PickNext*State are called in PickNextState based on whether the
221   // modem is online or not.
222   PlanActivationState PickNextOnlineState(const NetworkState* network) const;
223   PlanActivationState PickNextOfflineState(const NetworkState* network) const;
224   // Check the current cellular network for error conditions.
225   bool GotActivationError(const NetworkState* network,
226                           std::string* error) const;
227   // Sends status updates to WebUI page.
228   void UpdatePage(const NetworkState* network,
229                   const std::string& error_description);
230
231   // Callback used to handle an activation error.
232   void HandleActivationFailure(
233       const std::string& service_path,
234       PlanActivationState new_state,
235       const std::string& error_name,
236       scoped_ptr<base::DictionaryValue> error_data);
237
238   // Request cellular activation for |network|.
239   // On success, |success_callback| will be called.
240   // On failure, |error_callback| will be called.
241   virtual void RequestCellularActivation(
242       const NetworkState* network,
243       const base::Closure& success_callback,
244       const network_handler::ErrorCallback& error_callback);
245
246   // Changes internal state.
247   virtual void ChangeState(const NetworkState* network,
248                            PlanActivationState new_state,
249                            std::string error_description);
250   // Resets network devices after cellular activation process.
251   void CompleteActivation();
252   // Disables SSL certificate revocation checking mechanism. In the case
253   // where captive portal connection is the only one present, such revocation
254   // checks could prevent payment portal page from loading.
255   void DisableCertRevocationChecking();
256   // Reenables SSL certificate revocation checking mechanism.
257   void ReEnableCertRevocationChecking();
258   // Return error message for a given code.
259   std::string GetErrorMessage(const std::string& code) const;
260
261   // Performs activation state cellular device evaluation.
262   // Returns false if device activation failed. In this case |error|
263   // will contain error message to be reported to Web UI.
264   static bool EvaluateCellularDeviceState(bool* report_status,
265                                           std::string* state,
266                                           std::string* error);
267   // Starts the OTASP timeout timer.  If the timer fires, we'll force a
268   // disconnect/reconnect cycle on this network.
269   virtual void StartOTASPTimer();
270
271   // Records information that cellular plan payment has happened.
272   virtual void SignalCellularPlanPayment();
273
274   // Returns true if cellular plan payment has been recorded recently.
275   virtual bool HasRecentCellularPlanPayment() const;
276
277   static const char* GetStateDescription(PlanActivationState state);
278
279   scoped_refptr<CellularConfigDocument> cellular_config_;
280   // Internal handler state.
281   PlanActivationState state_;
282   // MEID of cellular device to activate.
283   std::string meid_;
284   // ICCID of the SIM card on cellular device to activate.
285   std::string iccid_;
286   // Service path of network being activated. Note that the path can change
287   // during the activation process while still representing the same service.
288   std::string service_path_;
289   // Device on which the network service is activated. While the service path
290   // can change during activation due to modem resets, the device path stays
291   // the same.
292   std::string device_path_;
293   // Flags that controls if cert_checks needs to be restored
294   // after the activation of cellular network.
295   bool reenable_cert_check_;
296   // True if activation process has been terminated.
297   bool terminated_;
298   // True if an asynchronous activation request was dispatched to Shill
299   // but the succcess or failure of the request is yet unknown.
300   bool pending_activation_request_;
301   // Connection retry counter.
302   int connection_retry_count_;
303   // Counters for how many times we've tried each OTASP step.
304   int initial_OTASP_attempts_;
305   int trying_OTASP_attempts_;
306   int final_OTASP_attempts_;
307   // Payment portal reload/reconnect attempt count.
308   int payment_reconnect_count_;
309   // Timer that monitors how long we spend in error-prone states.
310   base::RepeatingTimer<MobileActivator> state_duration_timer_;
311
312   // State we will return to if we are disconnected.
313   PlanActivationState post_reconnect_state_;
314   // Called to continue the reconnect attempt.
315   base::RepeatingTimer<MobileActivator> continue_reconnect_timer_;
316   // Called when the reconnect attempt times out.
317   base::OneShotTimer<MobileActivator> reconnect_timeout_timer_;
318   // Cellular plan payment time.
319   base::Time cellular_plan_payment_time_;
320
321   ObserverList<Observer> observers_;
322   base::WeakPtrFactory<MobileActivator> weak_ptr_factory_;
323
324   DISALLOW_COPY_AND_ASSIGN(MobileActivator);
325 };
326
327 }  // namespace chromeos
328
329 #endif  // CHROME_BROWSER_CHROMEOS_MOBILE_MOBILE_ACTIVATOR_H_