b2e857cc205261d74b1f45cec7e18f4b28074b1f
[platform/upstream/iotivity.git] / android / examples / provisioningclient / src / main / java / org / iotivity / base / examples / provisioningclient / ProvisioningClient.java
1 package org.iotivity.base.examples.provisioningclient;
2
3 import android.app.Activity;
4 import android.content.BroadcastReceiver;
5 import android.content.Context;
6 import android.content.Intent;
7 import android.content.SharedPreferences;
8 import android.os.AsyncTask;
9 import android.os.Bundle;
10 import android.os.Message;
11 import android.preference.PreferenceManager;
12 import android.text.method.ScrollingMovementMethod;
13 import android.util.Log;
14 import android.view.Gravity;
15 import android.widget.LinearLayout;
16 import android.widget.TextView;
17
18 import org.iotivity.base.CredType;
19 import org.iotivity.base.EncodingType;
20 import org.iotivity.base.DeviceStatus;
21 import org.iotivity.base.KeySize;
22 import org.iotivity.base.ModeType;
23 import org.iotivity.base.OcException;
24 import org.iotivity.base.OcPlatform;
25 import org.iotivity.base.OcProvisioning;
26 import org.iotivity.base.OcSecureResource;
27 import org.iotivity.base.OicSecAcl;
28 import org.iotivity.base.OicSecAce;
29 import org.iotivity.base.OicSecResr;
30 import org.iotivity.base.OicSecValidity;
31 import org.iotivity.base.OicSecPdAcl;
32 import org.iotivity.base.OcPrmType;
33 import org.iotivity.base.OxmType;
34 import org.iotivity.base.PlatformConfig;
35 import org.iotivity.base.ProvisionResult;
36 import org.iotivity.base.QualityOfService;
37 import org.iotivity.base.ServiceType;
38
39 import java.io.File;
40 import java.io.FileNotFoundException;
41 import java.io.FileOutputStream;
42 import java.io.IOException;
43 import java.io.InputStream;
44 import java.io.OutputStream;
45 import java.util.ArrayList;
46 import java.util.EnumSet;
47 import java.util.List;
48
49 import org.iotivity.ca.OicCipher;
50 import org.iotivity.base.OcConnectivityType;
51 import org.iotivity.ca.CaInterface;
52
53
54 public class ProvisioningClient extends Activity implements
55 OcSecureResource.DoOwnershipTransferListener, OcSecureResource.ProvisionPairwiseDevicesListener {
56
57     private static final String TAG = "Provisioning Client: ";
58     private static final int BUFFER_SIZE = 1024;
59     private int credId=0;
60     int unownedDevCount = StringConstants.NUMBER_ZERO;
61     OcProvisioning.PinCallbackListener pinCallbackListener =
62         new OcProvisioning.PinCallbackListener() {
63             @Override
64                 public String pinCallbackListener() {
65                     Log.d(TAG, "Inside Pin Callback ");
66                     return "";
67                 }
68         };
69     private String filePath = "";
70     private OcSecureResource newSecureResource;
71     private List<OcSecureResource> deviceList;
72     private List<OcSecureResource> ownedDeviceList;
73     private TextView mEventsTextView;
74
75     OcSecureResource.ProvisionDirectPairingListener provisionDPListener =
76         new OcSecureResource.ProvisionDirectPairingListener() {
77             @Override
78                 public void provisionDirectPairingListener(List<ProvisionResult> provisionResults,
79                         int hasError) {
80                     Log.d(TAG, "Inside provisionDPListener");
81                     ProvisionResult pResult = provisionResults.get(0);
82                     if (hasError == StringConstants.ERROR_CODE) {
83                         logMessage(TAG + "Provision direct pairing Failed for " + pResult.getDevId());
84                     } else {
85                         logMessage(TAG + "Provision direct pairing Successful for " + pResult.getDevId());
86                         if (ownedDeviceList.size() == 1) {
87                             new ProvisionACLAsyncTask().execute();
88                         }
89                         if (ownedDeviceList.size() > 1) {
90                             new GetLinkedDevicesAsyncTask().execute();
91                         }
92                     }
93                 }
94         };
95
96     OcSecureResource.ProvisionAclListener provisionAclListener =
97         new OcSecureResource.ProvisionAclListener() {
98             @Override
99                 public void provisionAclListener(List<ProvisionResult> provisionResults,
100                         int hasError) {
101                     Log.d(TAG, "Inside ProvisionAclListener ");
102                     if (hasError == StringConstants.ERROR_CODE) {
103                         logMessage("Error: ACL Provision failed !!");
104                     } else {
105                         logMessage("ACL Provision Done !!");
106                         provisionCertChain();
107                     }
108                 }
109         };
110     OcSecureResource.ProvisionCredentialsListener provisionCredentialsListener =
111         new OcSecureResource.ProvisionCredentialsListener() {
112             @Override
113                 public void provisionCredentialsListener(List<ProvisionResult> provisionResults,
114                         int hasError) {
115                     Log.d(TAG, "Inside ProvisionCredentialsListener ");
116                     if (hasError == StringConstants.ERROR_CODE) {
117                         logMessage("Error: Provision Credentials failed !!");
118                     } else {
119                         logMessage("Provision Credentials Done !!");
120                         new ProvisionACLAsyncTask().execute();
121                     }
122                 }
123         };
124
125     OcSecureResource.ProvisionTrustCertChainListener provisionTrustCertListener =
126         new OcSecureResource.ProvisionTrustCertChainListener() {
127             @Override
128                 public void provisionTrustCertChainListener(List<ProvisionResult> provisionResults,
129                         int hasError) {
130                     Log.d(TAG, "Inside provisionTrustCertChainListener ");
131                     if (hasError == StringConstants.ERROR_CODE) {
132                         logMessage("Error: Provision TrustCertChain failed !!");
133                     } else {
134                         logMessage("Provision TrustCertChain Done !!");
135                         new DeviceRevocationAsyncTask().execute();
136                     }
137                 }
138         };
139
140     OcSecureResource.UnlinkDevicesListener unlinkDevicesListener =
141         new OcSecureResource.UnlinkDevicesListener() {
142             @Override
143                 public void unlinkDevicesListener(List<ProvisionResult> provisionResults,
144                         int hasError) {
145                     Log.d(TAG, "Inside unlinkDevicesListener ");
146                     if (hasError == StringConstants.ERROR_CODE) {
147                         logMessage("Error: UnLinking device !!");
148                     } else {
149                         logMessage("Unlink Done !!");
150                         new ProvisionCredentialAsyncTask().execute();
151                     }
152                 }
153         };
154     OcSecureResource.RemoveDeviceListener removeDeviceListener =
155         new OcSecureResource.RemoveDeviceListener() {
156             @Override
157                 public void removeDeviceListener(List<ProvisionResult> provisionResults,
158                         int hasError) {
159                     if (hasError == StringConstants.ERROR_CODE) {
160                         logMessage("Error: Remove Fail !!");
161                     } else {
162                         logMessage("Remove Device done !!");
163                     }
164                 }
165         };
166
167     @Override
168         protected void onCreate(Bundle savedInstanceState) {
169             super.onCreate(savedInstanceState);
170             setContentView(R.layout.activity_secure_provision_client);
171             mEventsTextView = new TextView(this);
172             mEventsTextView.setGravity(Gravity.BOTTOM);
173             mEventsTextView.setMovementMethod(new ScrollingMovementMethod());
174             LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout);
175             layout.addView(mEventsTextView, new LinearLayout.LayoutParams(
176                         LinearLayout.LayoutParams.MATCH_PARENT, 0, 1f)
177                     );
178             filePath = getFilesDir().getPath() + "/"; //  data/data/<package>/files/
179             //copy CBOR file when application runs first time
180             SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this);
181             boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
182             if (isFirstRun) {
183                 copyCborFromAsset();
184                 SharedPreferences.Editor editor = wmbPreference.edit();
185                 editor.putBoolean("FIRSTRUN", false);
186                 editor.commit();
187             }
188             initOICStack();
189             saveCertChain();
190             int ret = CaInterface.setCipherSuite(OicCipher.TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
191                                                     OcConnectivityType.CT_ADAPTER_IP);
192             Log.e(TAG,"CaInterface.setCipherSuite returned = "+ret);
193         }
194
195     /**
196      * configure OIC platform and call findResource
197      */
198     private void initOICStack() {
199         //create platform config
200         PlatformConfig cfg = new PlatformConfig(
201                 this,
202                 ServiceType.IN_PROC,
203                 ModeType.CLIENT_SERVER,
204                 "0.0.0.0", // bind to all available interfaces
205                 0,
206                 QualityOfService.LOW, filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE);
207         OcPlatform.Configure(cfg);
208
209         //Get deviceId
210         byte [] deviceIdBytes= OcPlatform.getDeviceId();
211         String devId = new String(deviceIdBytes);
212         Log.d(TAG, "Get Device Id "+devId);
213         //Set deviceId
214         String setId = "adminDeviceUuid1";
215         OcPlatform.setDeviceId(setId.getBytes());
216         Log.d(TAG, "Set Device Id done");
217
218         try {
219             /*
220              * Initialize DataBase
221              */
222             String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") +
223                 File.separator;
224             File file = new File(sqlDbPath);
225             //check files directory exists
226             if (!(file.isDirectory())) {
227                 file.mkdirs();
228                 Log.d(TAG, "Sql db directory created at " + sqlDbPath);
229             }
230             Log.d(TAG, "Sql db directory exists at " + sqlDbPath);
231             OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE);
232         } catch (OcException e) {
233             logMessage(TAG + "provisionInit error: " + e.getMessage());
234             Log.e(TAG, e.getMessage());
235         }
236         new DiscoveryOTTransferAsyncTask().execute();
237     }
238
239     @Override
240         synchronized public void doOwnershipTransferListener(List<ProvisionResult> ProvisionResultList,
241                 int hasError) {
242             ProvisionResult pResult = ProvisionResultList.get(0);
243             if (hasError == StringConstants.ERROR_CODE) {
244                 logMessage(TAG + "Ownership Transfer Failed for " + pResult.getDevId());
245             } else {
246                 logMessage(TAG + "Ownership Transfer Successful for "
247                         + pResult.getDevId());
248                 unownedDevCount--;
249             }
250             if (unownedDevCount == 0) { //When done with Ownership Transfer
251                 new OwnedDiscoveryAsyncTask().execute();
252             }
253         }
254
255
256     private void doDPProvisioning() {
257         try {
258             logMessage(TAG + "Provision direct pairing for " + ownedDeviceList.get(0).getDeviceID());
259             newSecureResource = ownedDeviceList.get(0);
260             String pin = "00000000";
261             List<OcPrmType> prmTypes = new ArrayList<OcPrmType>();
262             prmTypes.add(OcPrmType.DP_PRE_CONFIGURED);
263             boolean edp = true;
264             List<String> resources = new ArrayList<String>();
265             List<String> periods = new ArrayList<String>();
266             List<String> recurrences = new ArrayList<String>();
267             resources.add(StringConstants.DEFAULT_RESOURCES);
268             OicSecPdAcl pdAcl = new OicSecPdAcl(recurrences, periods,
269                     StringConstants.DEFAULT_PERMISSION, resources);
270             OicSecPdAcl[] oicSecPdAcls = new OicSecPdAcl[1];
271             oicSecPdAcls[0] = pdAcl;
272             newSecureResource.doProvisionDirectPairing(pin, oicSecPdAcls, prmTypes, edp,
273                     provisionDPListener);
274         } catch (Exception e) {
275             logMessage(TAG + "Direct Pairing Provisioning error: " + e.getMessage());
276             Log.e(TAG, e.getMessage());
277         }
278     }
279
280
281     private void doPairwiseProvisioning() {
282         try {
283             logMessage(TAG + "Pairwise Provisioning b/w " + ownedDeviceList.get(0).getDeviceID()
284                     + " and " + ownedDeviceList.get(1).getDeviceID());
285             newSecureResource = ownedDeviceList.get(0);
286
287             List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
288             List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
289             List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
290
291             List<String> types1 = new ArrayList<String>();
292             types1.add(StringConstants.RESOURCE_TYPE_1A);
293             types1.add(StringConstants.RESOURCE_TYPE_1B);
294             List<String> types2 = new ArrayList<String>();
295             types2.add(StringConstants.RESOURCE_TYPE_2A);
296             types2.add(StringConstants.RESOURCE_TYPE_2B);
297             List<String> interfaces = new ArrayList<String>();
298             interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
299             interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
300
301             OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
302             OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
303             resources1.add(oicSecResr1a);
304             resources1.add(oicSecResr1b);
305
306             OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
307             OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
308             resources2.add(oicSecResr2a);
309             resources2.add(oicSecResr2b);
310
311             List<String> recurrences = new ArrayList<String>();
312             recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
313             recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
314             OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
315                     recurrences, 2);
316             validities.add(oicSecValidity);
317
318             OicSecAce oicsecace1 = new OicSecAce(newSecureResource.getDeviceID(),
319                     StringConstants.DEFAULT_PERMISSION, resources1, validities);
320             OcSecureResource newSecureResource2 = ownedDeviceList.get(1);
321             OicSecAce oicsecace2 = new OicSecAce(newSecureResource2.getDeviceID(),
322                     StringConstants.DEFAULT_PERMISSION, resources2, validities);
323
324             List<OicSecAce> oicSecAces1=new ArrayList<OicSecAce>();
325             oicSecAces1.add(oicsecace1);
326             List<OicSecAce> oicSecAces2=new ArrayList<OicSecAce>();
327             oicSecAces2.add(oicsecace2);
328             OicSecAcl acl1 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces1);
329             OicSecAcl acl2 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces2);
330
331             newSecureResource.provisionPairwiseDevices(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
332                     KeySize.OWNER_PSK_LENGTH_128, acl1, newSecureResource2, acl2, this);
333         } catch (Exception e) {
334             logMessage(TAG + "Pairwise Provisioning  error: " + e.getMessage());
335             Log.e(TAG, e.getMessage());
336         }
337     }
338
339     @Override
340         public void provisionPairwiseDevicesListener(List<ProvisionResult> ProvisionResultList,
341                 int hasError) {
342             if (hasError == StringConstants.ERROR_CODE) {
343                 logMessage(TAG + "provisionPairwiseDevices Failed");
344             } else {
345                 for (int i = 0; i < ProvisionResultList.size(); i++) {
346                     ProvisionResult pResult = ProvisionResultList.get(i);
347                     logMessage(TAG + "provisionPairwiseDevices Result for "
348                             + pResult.getDevId() + "is " + pResult.getResult());
349                 }
350                 doDPProvisioning();
351             }
352         }
353     /**
354      * get cert from asset folder & save trusted cert chain
355      */
356     private void saveCertChain() {
357         InputStream inputStream = null;
358         try {
359
360             inputStream = getAssets().open(StringConstants.CRT_FILE);
361             byte[] fileBytes = new byte[inputStream.available()+1];
362             inputStream.read(fileBytes);
363             fileBytes[inputStream.available()]=0x00;
364             credId = OcProvisioning.saveTrustCertChain(fileBytes,
365                     EncodingType.OIC_ENCODING_PEM);
366             logMessage(TAG + "saveTrustCertChain return credId = " + credId);
367         } catch (IOException e) {
368             logMessage(TAG + "Cert file not exist in Assets" + e.getMessage());
369             Log.e(TAG, e.getMessage());
370         } catch (OcException e) {
371             logMessage(TAG + "saveTrustCertChain failed " + e.getMessage());
372             Log.e(TAG, e.getMessage());
373         } finally {
374             if (inputStream != null) {
375                 try {
376                     inputStream.close();
377                 } catch (IOException e) {
378                     Log.e(TAG, e.getMessage());
379                 }
380             }
381
382         }
383     }
384
385     /**
386      * Provision cert chain
387      */
388     private void provisionCertChain() {
389
390         if (ownedDeviceList.size() > 0) {
391             try {
392                 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
393                 logMessage(TAG + "Initiate provision cert chain credId = "
394                         + credId);
395                 ocSecureResource.provisionTrustCertChain(
396                         EnumSet.of(CredType.SIGNED_ASYMMETRIC_KEY), credId,
397                         provisionTrustCertListener);
398             } catch (OcException e) {
399                 logMessage(TAG + "Provision cert chain error: "
400                         + e.getMessage());
401                 Log.e(TAG, e.getMessage());
402             }
403         }
404
405     }
406
407     /**
408      * Copy svr db CBOR dat file from assets folder to app data files dir
409      */
410     private void copyCborFromAsset() {
411         InputStream inputStream = null;
412         OutputStream outputStream = null;
413         int length;
414         byte[] buffer = new byte[BUFFER_SIZE];
415         try {
416             inputStream = getAssets().open(StringConstants.OIC_CLIENT_CBOR_DB_FILE);
417             File file = new File(filePath);
418             //check files directory exists
419             if (!(file.exists() && file.isDirectory())) {
420                 file.mkdirs();
421             }
422             outputStream = new FileOutputStream(filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE);
423             while ((length = inputStream.read(buffer)) != -1) {
424                 outputStream.write(buffer, 0, length);
425             }
426         } catch (NullPointerException e) {
427             logMessage(TAG + "Null pointer exception " + e.getMessage());
428             Log.e(TAG, e.getMessage());
429         } catch (FileNotFoundException e) {
430             logMessage(TAG + "CBOR svr db file not found " + e.getMessage());
431             Log.e(TAG, e.getMessage());
432         } catch (IOException e) {
433             logMessage(TAG + StringConstants.OIC_CLIENT_CBOR_DB_FILE + " file copy failed");
434             Log.e(TAG, e.getMessage());
435         } finally {
436             if (inputStream != null) {
437                 try {
438                     inputStream.close();
439                 } catch (IOException e) {
440                     Log.e(TAG, e.getMessage());
441                 }
442             }
443             if (outputStream != null) {
444                 try {
445                     outputStream.close();
446                 } catch (IOException e) {
447                     Log.e(TAG, e.getMessage());
448                 }
449             }
450         }
451     }
452
453     public void logMessage(String text) {
454         logMsg(text);
455     }
456
457     public void logMsg(final String text) {
458         runOnUiThread(new Runnable() {
459                 public void run() {
460                 Message msg = new Message();
461                 msg.obj = text;
462                 mEventsTextView.append(text);
463                 mEventsTextView.append("\n\n");
464                 }
465                 });
466         Log.i(TAG, text);
467         Intent intent = new Intent(getPackageName());
468         intent.putExtra(StringConstants.MESSAGE, text);
469         sendBroadcast(intent);
470     }
471
472     private class DiscoveryOTTransferAsyncTask extends AsyncTask<Void, String, String> {
473
474         @Override
475             protected void onPreExecute() {
476                 super.onPreExecute();
477             }
478
479         @Override
480             protected String doInBackground(Void... params) {
481                 try {
482                     /**
483                      * Discover Un-owned devices
484                      */
485                     publishProgress(TAG + "Discovering Unowned Devices");
486                     deviceList = new ArrayList<OcSecureResource>(OcProvisioning.discoverUnownedDevices
487                             (StringConstants.DISCOVERY_TIMEOUT_10));
488                     if (deviceList.size() > 0) {
489                         unownedDevCount = deviceList.size();
490                         for (int i = 0; i < deviceList.size(); i++) {
491                             publishProgress(TAG + "Un-owned Discovered Device " + (i + 1) + "= " +
492                                     deviceList.get(i).getDeviceID());
493                         }
494                         try {
495                             OcProvisioning.SetownershipTransferCBdata(OxmType.OIC_JUST_WORKS,
496                                     pinCallbackListener);
497                             for (int i = 0; i < deviceList.size(); i++) {
498                                 publishProgress(TAG + "Doing Ownership Transfer for " +
499                                         deviceList.get(i).getDeviceID());
500                                 deviceList.get(i).doOwnershipTransfer(ProvisioningClient.this);
501                             }
502                         } catch (OcException e) {
503                             publishProgress(TAG + "Ownership Transfer error: " + e.getMessage());
504                             return "Ownership Transfer error: " + e.getMessage();
505
506                         }
507                     } else {
508                         publishProgress(TAG + "No un-owned devices present");
509                         new OwnedDiscoveryAsyncTask().execute();
510                     }
511                 } catch (OcException e) {
512                     publishProgress(TAG + "Un-owned discovery error: " + e.getMessage());
513                     return "Un-owned discovery error:  " + e.getMessage();
514                 }
515                 return "success";
516             }
517
518         @Override
519             protected void onProgressUpdate(String... values) {
520                 logMessage(values[0]);
521             }
522
523         @Override
524             protected void onPostExecute(String s) {
525                 super.onPostExecute(s);
526             }
527     }
528
529     private class ProvisionACLAsyncTask extends AsyncTask<Void, String, Void> {
530
531         @Override
532             protected void onPreExecute() {
533                 super.onPreExecute();
534             }
535
536         @Override
537             protected Void doInBackground(Void... params) {
538                 try {
539                     if (ownedDeviceList.size() > 0) {
540                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
541
542                         publishProgress(TAG + "ACL Provision for " + ocSecureResource.getDeviceID());
543                         List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
544                         List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
545                         List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
546
547                         List<String> types1 = new ArrayList<String>();
548                         types1.add(StringConstants.RESOURCE_TYPE_1A);
549                         types1.add(StringConstants.RESOURCE_TYPE_1B);
550                         List<String> types2 = new ArrayList<String>();
551                         types2.add(StringConstants.RESOURCE_TYPE_2A);
552                         types2.add(StringConstants.RESOURCE_TYPE_2B);
553                         List<String> interfaces = new ArrayList<String>();
554                         interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
555                         interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
556
557                         OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
558                         OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
559                         resources1.add(oicSecResr1a);
560                         resources1.add(oicSecResr1b);
561
562                         OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
563                         OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
564                         resources2.add(oicSecResr2a);
565                         resources2.add(oicSecResr2b);
566
567                         List<String> recurrences = new ArrayList<String>();
568                         recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
569                         recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
570                         OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
571                                 recurrences, 2);
572                         validities.add(oicSecValidity);
573
574                         OicSecAce oicsecace1 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID1,
575                                 StringConstants.DEFAULT_PERMISSION, resources1, validities);
576
577                         OicSecAce oicsecace2 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID2,
578                                 StringConstants.DEFAULT_PERMISSION, resources2, validities);
579
580                         List<OicSecAce> oicSecAces=new ArrayList<OicSecAce>();
581                         oicSecAces.add(oicsecace1);
582                         oicSecAces.add(oicsecace2);
583
584                         OicSecAcl aclObject = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID, oicSecAces);
585
586                         ocSecureResource.provisionACL(aclObject, provisionAclListener);
587                     } else {
588                         publishProgress(TAG + "No Owned devices present");
589                     }
590                 } catch (Exception e) {
591                     publishProgress(TAG + "ProvisionACL error: " + e.getMessage());
592                 }
593                 return null;
594             }
595
596         @Override
597             protected void onProgressUpdate(String... values) {
598                 logMessage(values[0]);
599             }
600     }
601
602     private class ProvisionCredentialAsyncTask extends AsyncTask<Void, String, Void> {
603
604         @Override
605             protected void onPreExecute() {
606                 super.onPreExecute();
607             }
608
609         @Override
610             protected Void doInBackground(Void... params) {
611                 try {
612                     if (ownedDeviceList.size() > 1) {
613                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
614                         OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
615                         publishProgress(TAG + "ProvisionCredential for " +
616                                 ocSecureResource.getDeviceID() + " with " +
617                                 ocSecureResourceDest.getDeviceID());
618                         ocSecureResource.provisionCredentials(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
619                                 KeySize.OWNER_PSK_LENGTH_128,
620                                 ocSecureResourceDest, provisionCredentialsListener);
621                     } else {
622                         publishProgress(TAG + "Cannot perform credentials between devices");
623                     }
624                 } catch (Exception e) {
625                     publishProgress(TAG + "Provision credentials error: " + e.getMessage());
626                 }
627                 return null;
628             }
629
630         @Override
631             protected void onProgressUpdate(String... values) {
632                 logMessage(values[0]);
633             }
634     }
635
636     private class GetLinkedDevicesAsyncTask extends AsyncTask<Void, String, String> {
637
638         @Override
639             protected void onPreExecute() {
640                 super.onPreExecute();
641             }
642
643         @Override
644             protected String doInBackground(Void... params) {
645                 try {
646                     if (ownedDeviceList.size() > 1) {
647                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
648                         publishProgress(TAG + "Get linked devices of " + ocSecureResource.getDeviceID());
649                         List<String> linkedDevices = ocSecureResource.getLinkedDevices();
650                         if (linkedDevices.size() > 0) {
651                             for (int i = 0; i < linkedDevices.size(); i++) {
652                                 publishProgress(TAG + "Linked Devices " +
653                                         (i + 1) + "= " + linkedDevices.get(i));
654                             }
655                         } else {
656                             publishProgress(TAG + "No linked Devices found");
657                         }
658                     } else {
659                         publishProgress(TAG + "Cannot perform linked devices");
660                     }
661                 } catch (Exception e) {
662                     publishProgress(TAG + "getLinked device error: " + e.getMessage());
663                     return "failed";
664                 }
665                 return "success";
666             }
667
668         @Override
669             protected void onProgressUpdate(String... values) {
670                 logMessage(values[0]);
671             }
672
673         @Override
674             protected void onPostExecute(String s) {
675                 if ("success".equals(s)) {
676                     new ProvisionUnlinkAsyncTask().execute();
677                 }
678             }
679     }
680
681     private class ProvisionUnlinkAsyncTask extends AsyncTask<Void, String, Void> {
682
683         @Override
684             protected void onPreExecute() {
685                 super.onPreExecute();
686             }
687
688         @Override
689             protected Void doInBackground(Void... params) {
690                 try {
691                     if (ownedDeviceList.size() > 1) {
692                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
693                         OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
694                         publishProgress(TAG + "Un linking  " + ocSecureResource.getDeviceID() +
695                                 " with " + ocSecureResourceDest.getDeviceID());
696                         ocSecureResource.unlinkDevices(ocSecureResourceDest, unlinkDevicesListener);
697                     } else {
698                         publishProgress(TAG + "Cannot perform unlink devices");
699                     }
700                 } catch (Exception e) {
701                     publishProgress(TAG + "Unlink error: " + e.getMessage());
702                 }
703                 return null;
704             }
705
706         @Override
707             protected void onProgressUpdate(String... values) {
708                 logMessage(values[0]);
709             }
710     }
711
712     private class DeviceRevocationAsyncTask extends AsyncTask<Void, String, Void> {
713
714         @Override
715             protected void onPreExecute() {
716                 super.onPreExecute();
717             }
718
719         @Override
720             protected Void doInBackground(Void... params) {
721                 try {
722                     if (ownedDeviceList.size() > 0) {
723                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
724                         publishProgress(TAG + "Removing " + ocSecureResource.getDeviceID());
725                         ocSecureResource.removeDevice(StringConstants.DISCOVERY_TIMEOUT_20,
726                                 removeDeviceListener);
727                     } else {
728                         publishProgress(TAG + "Cannot remove");
729                     }
730                 } catch (Exception e) {
731                     publishProgress(TAG + "Remove Device error: " + e.getMessage());
732                 }
733                 return null;
734             }
735
736         @Override
737             protected void onProgressUpdate(String... values) {
738                 logMessage(values[0]);
739             }
740     }
741
742     private class OwnedDiscoveryAsyncTask extends AsyncTask<Void, String, String> {
743
744         @Override
745             protected void onPreExecute() {
746                 super.onPreExecute();
747             }
748
749         @Override
750             protected String doInBackground(Void... params) {
751                 try {
752                     publishProgress(TAG + "Initiate Owned device Discovery");
753                     ownedDeviceList = OcProvisioning.discoverOwnedDevices
754                         (StringConstants.DISCOVERY_TIMEOUT_10);
755                     if (ownedDeviceList.size() > 0) {
756                         for (int i = 0; i < ownedDeviceList.size(); i++) {
757                             publishProgress(TAG + "Owned Discovered Device " + (i + 1) + "= " +
758                                     ownedDeviceList.get(i).getDeviceID()
759                                     + "\nIP Address= " + ownedDeviceList.get(i).getIpAddr()
760                                     + "\nOwned Status= " + ownedDeviceList.get(i).getOwnedStatus()
761                                     + "\nDevice Status= " + ((ownedDeviceList.get(i).
762                                             getDeviceStatus() == DeviceStatus.ON) ? "ON" : "OFF")
763                                     );
764                         }
765                     } else {
766                         publishProgress(TAG + "No Owned devices present");
767                     }
768                 } catch (OcException e) {
769                     publishProgress(TAG + "Owned device Discovery error: " + e.getMessage());
770                     return "Owned device Discovery error: " + e.getMessage();
771                 }
772                 return "success";
773             }
774
775         @Override
776             protected void onProgressUpdate(String... values) {
777                 logMessage(values[0]);
778             }
779
780         @Override
781             protected void onPostExecute(String s) {
782
783
784                 if (ownedDeviceList.size() == 1 && "success".equals(s)) {
785                     doDPProvisioning();
786                 }
787                 if (ownedDeviceList.size() > 1 && "success".equals(s)) {
788                     doPairwiseProvisioning();
789                 }
790
791             }
792     }
793
794     /**
795      * to display on Server Message on Client screen
796      */
797     public class MessageReceiver extends BroadcastReceiver {
798         @Override
799             public void onReceive(Context context, Intent intent) {
800                 final String message = intent.getStringExtra(StringConstants.MESSAGE);
801                 logMessage(message);
802             }
803     }
804 }