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