Imported Upstream version 1.0.1
[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 \r
106         // Starts the provisioning directly if the device is already on boarded on the network.\r
107         if (enrolledevice.onBoarded()) {\r
108             enrolledevice.startProvisioning(mProvisioningCallback);\r
109             return;\r
110         }\r
111         enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDING_STATE;\r
112 \r
113         mCallback.onProgress(enrolledevice);\r
114         enrolledevice.startOnBoarding(new OnBoardingCallback() {\r
115 \r
116             @Override\r
117             public void onFinished(OnBoardingConnection connection) {\r
118                 if (connection.isConnected()) {\r
119                     Log.i(TAG, "On boarding is successful ");\r
120                     // Start provisioning here\r
121                     enrolledevice.mState = EnrolleeState.DEVICE_ON_BOARDED_STATE;\r
122                     mCallback.onProgress(enrolledevice);\r
123                     enrolledevice.setConnection(connection);\r
124                     enrolledevice.startProvisioning(mProvisioningCallback);\r
125                 } else {\r
126                     enrolledevice.mState = EnrolleeState.DEVICE_INIT_STATE;\r
127                     mProvisioningCallback.onFinished(enrolledevice);\r
128                 }\r
129 \r
130             }\r
131 \r
132         });\r
133 \r
134     }\r
135 \r
136     /**\r
137      * Stops on-going Easy setup process for enrolling device.\r
138      *\r
139      * @param enrolleedevice Device to be enrolled in network\r
140      */\r
141     public synchronized void stopSetup(EnrolleeDevice enrolleedevice) {\r
142         if (mEnrolleeDeviceList.contains(enrolleedevice)) {\r
143             enrolleedevice.mState = EnrolleeState.DEVICE_INIT_STATE;\r
144             mCallback.onProgress(enrolleedevice);\r
145             if (enrolleedevice.mState == EnrolleeState.DEVICE_ON_BOARDING_STATE) {\r
146                 Log.i(TAG, "stopOnBoardingProcess for enrolleedevice");\r
147                 enrolleedevice.stopOnBoardingProcess();\r
148                 mEnrolleeDeviceList.remove(enrolleedevice);\r
149             } else if (enrolleedevice.mState == EnrolleeState.DEVICE_PROVISIONING_STATE) {\r
150                 Log.i(TAG, "stopOnBoardingProcess for enrolleedevice");\r
151                 enrolleedevice.stopOnBoardingProcess();\r
152                 Log.i(TAG, "stopEnrolleeProvisioning for enrolleedevice");\r
153                 //Native Api call to stop on-going enrolling process for the enrolling device\r
154                 EasySetupManager.getInstance().stopEnrolleeProvisioning(enrolleedevice\r
155                         .mOnBoardingConfig.getConnType().getValue());\r
156                 mEnrolleeDeviceList.remove(enrolleedevice);\r
157 \r
158             }\r
159         }\r
160     }\r
161 \r
162     class ProvisioningCallbackImpl extends ProvisioningCallback {\r
163 \r
164         private final EasySetupStatus mCallback;\r
165 \r
166         ProvisioningCallbackImpl(EasySetupStatus callback) {\r
167             mCallback = callback;\r
168         }\r
169 \r
170         @Override\r
171         public void onFinished(EnrolleeDevice enrolledevice) {\r
172             synchronized (EasySetupService.this) {\r
173                 if (mEnrolleeDeviceList.contains(enrolledevice)) {\r
174                     Log.i(TAG, "onFinished() is received " + enrolledevice.isSetupSuccessful());\r
175                     mCallback.onFinished(enrolledevice);\r
176                     mEnrolleeDeviceList.remove(enrolledevice);\r
177                 }\r
178             }\r
179         }\r
180 \r
181         @Override\r
182         public void onProgress(EnrolleeDevice enrolledevice) {\r
183             mCallback.onProgress(enrolledevice);\r
184         }\r
185 \r
186 \r
187     }\r
188 }