[ENROLLEE] Tizen enrollee sample application build using scons command
[platform/upstream/iotivity.git] / service / easy-setup / sdk / mediator / android / EasySetupCore / src / main / java / org / iotivity / service / easysetup / mediator / EasySetupService.java
1 /**\r
2  * ***************************************************************\r
3  * <p/>\r
4  * Copyright 2015 Samsung Electronics All Rights Reserved.\r
5  * <p/>\r
6  * <p/>\r
7  * <p/>\r
8  * Licensed under the Apache License, Version 2.0 (the "License");\r
9  * you may not use this file except in compliance with the License.\r
10  * You may obtain a copy of the License at\r
11  * <p/>\r
12  * http://www.apache.org/licenses/LICENSE-2.0\r
13  * <p/>\r
14  * Unless required by applicable law or agreed to in writing, software\r
15  * distributed under the License is distributed on an "AS IS" BASIS,\r
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
17  * See the License for the specific language governing permissions and\r
18  * limitations under the License.\r
19  * <p/>\r
20  * ****************************************************************\r
21  */\r
22 \r
23 package org.iotivity.service.easysetup.mediator;\r
24 \r
25 import android.content.Context;\r
26 import android.util.Log;\r
27 \r
28 import org.iotivity.service.easysetup.core.EasySetupManager;\r
29 import org.iotivity.service.easysetup.core.ProvisionEnrollee;\r
30 \r
31 import java.io.IOException;\r
32 import java.util.ArrayList;\r
33 \r
34 /**\r
35  * This is facade class, a single point of contact for Application.\r
36  * It contains set of APIs to do easy setup of the enrolling device.\r
37  * ON-BOARDING - This is a step to establish connectivity between the device & Mediator device.\r
38  * PROVISION   - This is a step where the netowork's detail & credentials are given to the\r
39  * enrolling device.\r
40  */\r
41 public class EasySetupService {\r
42 \r
43     private static final String TAG = EasySetupService.class.getName();\r
44 \r
45     private static EasySetupService sInstance;\r
46 \r
47     private final EasySetupStatus mCallback;\r
48 \r
49     private ArrayList<EnrolleeDevice> mEnrolleeDeviceList;\r
50 \r
51     private final ProvisioningCallback mProvisioningCallback;\r
52 \r
53     private static Context mContext;\r
54 \r
55 \r
56     ProvisionEnrollee mProvisionEnrolleeInstance;\r
57 \r
58     private EasySetupService(EasySetupStatus callback) {\r
59         mCallback = callback;\r
60         mProvisioningCallback = new ProvisioningCallbackImpl(mCallback);\r
61         mEnrolleeDeviceList = new ArrayList<EnrolleeDevice>();\r
62         mContext = null;\r
63 \r
64     }\r
65 \r
66     /**\r
67      * Gives a singleton instance of Easy setup service and initialize the service\r
68      *\r
69      * @param callback Application needs to provide this callback to receive the status of easy\r
70      *                 setup process.\r
71      */\r
72 \r
73     public synchronized static EasySetupService getInstance(Context context, EasySetupStatus\r
74             callback) {\r
75         if (sInstance == null) {\r
76             sInstance = new EasySetupService(callback);\r
77             mContext = context;\r
78         }\r
79         return sInstance;\r
80     }\r
81 \r
82     /**\r
83      * Reset the Easy setup Service\r
84      */\r
85 \r
86     public void finish() {\r
87 \r
88         //Native Api call to reset OIC stack\r
89         if (mProvisionEnrolleeInstance != null) {\r
90             mProvisionEnrolleeInstance.stopEnrolleeProvisioning(0);\r
91         }\r
92     }\r
93 \r
94     /**\r
95      * Starts Easy setup process for the enrolling device.\r
96      *\r
97      * @param enrolledevice Device to be enrolled in network\r
98      * @throws IOException Throws exception in case of any connection error.\r
99      */\r
100 \r
101     public synchronized void startSetup(final EnrolleeDevice enrolledevice) throws IOException {\r
102 \r
103         mEnrolleeDeviceList.add(enrolledevice);\r
104 \r
105         // Starts the provisioning directly if the device is already on boarded on the network.\r
106         if (enrolledevice.onBoarded()) {\r
107             enrolledevice.startProvisioning(mProvisioningCallback);\r
108             return;\r
109         }\r
110         enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDING_STATE;\r
111         mCallback.onProgress(enrolledevice);\r
112         enrolledevice.startOnBoarding(new OnBoardingCallback() {\r
113 \r
114             @Override\r
115             public void onFinished(OnBoardingConnection connection) {\r
116                 if (connection.isConnected()) {\r
117                     Log.i(TAG, "On boarding is successful ");\r
118                     // Start provisioning here\r
119                     enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDED_STATE;\r
120                     mCallback.onProgress(enrolledevice);\r
121                     enrolledevice.setConnection(connection);\r
122 \r
123                     /* Delay is set according to Soft AP host and Mediator platform;\r
124                     *  For Android with Soft AP it is 2000 ms\r
125                     */\r
126                     delayProvisioning(connection);\r
127                     enrolledevice.startProvisioning(mProvisioningCallback);\r
128                 } else {\r
129                     enrolledevice.mState = EnrolleeState.DEVICE_INIT_STATE;\r
130                     mProvisioningCallback.onFinished(enrolledevice);\r
131                 }\r
132 \r
133             }\r
134 \r
135         });\r
136 \r
137     }\r
138 \r
139     /**\r
140      * Stops on-going Easy setup process for enrolling device.\r
141      *\r
142      * @param enrolleedevice Device to be enrolled in network\r
143      */\r
144     public synchronized void stopSetup(EnrolleeDevice enrolleedevice) {\r
145         if (mEnrolleeDeviceList.contains(enrolleedevice)) {\r
146             enrolleedevice.mState = EnrolleeState.DEVICE_INIT_STATE;\r
147             mCallback.onProgress(enrolleedevice);\r
148             if (enrolleedevice.mState == EnrolleeState.DEVICE_ON_BOARDING_STATE) {\r
149                 Log.i(TAG, "stopOnBoardingProcess for enrolleedevice");\r
150                 enrolleedevice.stopOnBoardingProcess();\r
151                 mEnrolleeDeviceList.remove(enrolleedevice);\r
152             } else if (enrolleedevice.mState == EnrolleeState.DEVICE_PROVISIONING_STATE) {\r
153                 Log.i(TAG, "stopOnBoardingProcess for enrolleedevice");\r
154                 enrolleedevice.stopOnBoardingProcess();\r
155                 Log.i(TAG, "stopEnrolleeProvisioning for enrolleedevice");\r
156                 //Native Api call to stop on-going enrolling process for the enrolling device\r
157                 EasySetupManager.getInstance().stopEnrolleeProvisioning(enrolleedevice\r
158                         .mOnBoardingConfig.getConnType().getValue());\r
159                 mEnrolleeDeviceList.remove(enrolleedevice);\r
160 \r
161             }\r
162         }\r
163     }\r
164 \r
165     class ProvisioningCallbackImpl extends ProvisioningCallback {\r
166 \r
167         private final EasySetupStatus mCallback;\r
168 \r
169         ProvisioningCallbackImpl(EasySetupStatus callback) {\r
170             mCallback = callback;\r
171         }\r
172 \r
173         @Override\r
174         public void onFinished(EnrolleeDevice enrolledevice) {\r
175             synchronized (EasySetupService.this) {\r
176                 if (mEnrolleeDeviceList.contains(enrolledevice)) {\r
177                     Log.i(TAG, "onFinished() is received " + enrolledevice.isSetupSuccessful());\r
178                     mCallback.onFinished(enrolledevice);\r
179                     mEnrolleeDeviceList.remove(enrolledevice);\r
180                 }\r
181             }\r
182         }\r
183 \r
184         @Override\r
185         public void onProgress(EnrolleeDevice enrolledevice) {\r
186             mCallback.onProgress(enrolledevice);\r
187         }\r
188 \r
189 \r
190     }\r
191 \r
192     private void delayProvisioning(OnBoardingConnection conn) {\r
193         if (((IpOnBoardingConnection)conn).getThrottlingDelay()>0) {\r
194             try {\r
195                 Log.i(TAG, "waiting for 20 seconds to start provisioning");\r
196                 Thread.sleep(20000);//Sleep for allowing thin device to start the services\r
197             } catch (InterruptedException e) {\r
198                 e.printStackTrace();\r
199             }\r
200         }\r
201     }\r
202 }