Fix crash in Android provisioning client App.
[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         try {
215             String setId = "adminDeviceUuid1";
216             OcPlatform.setDeviceId(setId.getBytes());
217             Log.d(TAG, "Set Device Id done");
218         }
219         catch (OcException e) {
220             Log.d(TAG, e.getMessage());
221         }
222
223         try {
224             /*
225              * Initialize DataBase
226              */
227             String sqlDbPath = getFilesDir().getAbsolutePath().replace("files", "databases") +
228                 File.separator;
229             File file = new File(sqlDbPath);
230             //check files directory exists
231             if (!(file.isDirectory())) {
232                 file.mkdirs();
233                 Log.d(TAG, "Sql db directory created at " + sqlDbPath);
234             }
235             Log.d(TAG, "Sql db directory exists at " + sqlDbPath);
236             OcProvisioning.provisionInit(sqlDbPath + StringConstants.OIC_SQL_DB_FILE);
237         } catch (OcException e) {
238             logMessage(TAG + "provisionInit error: " + e.getMessage());
239             Log.e(TAG, e.getMessage());
240         }
241         new DiscoveryOTTransferAsyncTask().execute();
242     }
243
244     @Override
245         synchronized public void doOwnershipTransferListener(List<ProvisionResult> ProvisionResultList,
246                 int hasError) {
247             ProvisionResult pResult = ProvisionResultList.get(0);
248             if (hasError == StringConstants.ERROR_CODE) {
249                 logMessage(TAG + "Ownership Transfer Failed for " + pResult.getDevId());
250             } else {
251                 logMessage(TAG + "Ownership Transfer Successful for "
252                         + pResult.getDevId());
253                 unownedDevCount--;
254             }
255             if (unownedDevCount == 0) { //When done with Ownership Transfer
256                 new OwnedDiscoveryAsyncTask().execute();
257             }
258         }
259
260
261     private void doDPProvisioning() {
262         try {
263             logMessage(TAG + "Provision direct pairing for " + ownedDeviceList.get(0).getDeviceID());
264             newSecureResource = ownedDeviceList.get(0);
265             String pin = "00000000";
266             List<OcPrmType> prmTypes = new ArrayList<OcPrmType>();
267             prmTypes.add(OcPrmType.DP_PRE_CONFIGURED);
268             boolean edp = true;
269             List<String> resources = new ArrayList<String>();
270             List<String> periods = new ArrayList<String>();
271             List<String> recurrences = new ArrayList<String>();
272             resources.add(StringConstants.DEFAULT_RESOURCES);
273             OicSecPdAcl pdAcl = new OicSecPdAcl(recurrences, periods,
274                     StringConstants.DEFAULT_PERMISSION, resources);
275             OicSecPdAcl[] oicSecPdAcls = new OicSecPdAcl[1];
276             oicSecPdAcls[0] = pdAcl;
277             newSecureResource.doProvisionDirectPairing(pin, oicSecPdAcls, prmTypes, edp,
278                     provisionDPListener);
279         } catch (Exception e) {
280             logMessage(TAG + "Direct Pairing Provisioning error: " + e.getMessage());
281             Log.e(TAG, e.getMessage());
282         }
283     }
284
285
286     private void doPairwiseProvisioning() {
287         try {
288             logMessage(TAG + "Pairwise Provisioning b/w " + ownedDeviceList.get(0).getDeviceID()
289                     + " and " + ownedDeviceList.get(1).getDeviceID());
290             newSecureResource = ownedDeviceList.get(0);
291
292             List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
293             List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
294             List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
295
296             List<String> types1 = new ArrayList<String>();
297             types1.add(StringConstants.RESOURCE_TYPE_1A);
298             types1.add(StringConstants.RESOURCE_TYPE_1B);
299             List<String> types2 = new ArrayList<String>();
300             types2.add(StringConstants.RESOURCE_TYPE_2A);
301             types2.add(StringConstants.RESOURCE_TYPE_2B);
302             List<String> interfaces = new ArrayList<String>();
303             interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
304             interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
305
306             OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
307             OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
308             resources1.add(oicSecResr1a);
309             resources1.add(oicSecResr1b);
310
311             OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
312             OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
313             resources2.add(oicSecResr2a);
314             resources2.add(oicSecResr2b);
315
316             List<String> recurrences = new ArrayList<String>();
317             recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
318             recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
319             OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
320                     recurrences, 2);
321             validities.add(oicSecValidity);
322
323             OicSecAce oicsecace1 = new OicSecAce(newSecureResource.getDeviceID(),
324                     StringConstants.DEFAULT_PERMISSION, resources1, validities);
325             OcSecureResource newSecureResource2 = ownedDeviceList.get(1);
326             OicSecAce oicsecace2 = new OicSecAce(newSecureResource2.getDeviceID(),
327                     StringConstants.DEFAULT_PERMISSION, resources2, validities);
328
329             List<OicSecAce> oicSecAces1=new ArrayList<OicSecAce>();
330             oicSecAces1.add(oicsecace1);
331             List<OicSecAce> oicSecAces2=new ArrayList<OicSecAce>();
332             oicSecAces2.add(oicsecace2);
333             OicSecAcl acl1 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces1);
334             OicSecAcl acl2 = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID,oicSecAces2);
335
336             newSecureResource.provisionPairwiseDevices(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
337                     KeySize.OWNER_PSK_LENGTH_128, acl1, newSecureResource2, acl2, this);
338         } catch (Exception e) {
339             logMessage(TAG + "Pairwise Provisioning  error: " + e.getMessage());
340             Log.e(TAG, e.getMessage());
341         }
342     }
343
344     @Override
345         public void provisionPairwiseDevicesListener(List<ProvisionResult> ProvisionResultList,
346                 int hasError) {
347             if (hasError == StringConstants.ERROR_CODE) {
348                 logMessage(TAG + "provisionPairwiseDevices Failed");
349             } else {
350                 for (int i = 0; i < ProvisionResultList.size(); i++) {
351                     ProvisionResult pResult = ProvisionResultList.get(i);
352                     logMessage(TAG + "provisionPairwiseDevices Result for "
353                             + pResult.getDevId() + "is " + pResult.getResult());
354                 }
355                 doDPProvisioning();
356             }
357         }
358     /**
359      * get cert from asset folder & save trusted cert chain
360      */
361     private void saveCertChain() {
362         InputStream inputStream = null;
363         try {
364
365             inputStream = getAssets().open(StringConstants.CRT_FILE);
366             byte[] fileBytes = new byte[inputStream.available()+1];
367             inputStream.read(fileBytes);
368             fileBytes[inputStream.available()]=0x00;
369             credId = OcProvisioning.saveTrustCertChain(fileBytes,
370                     EncodingType.OIC_ENCODING_PEM);
371             logMessage(TAG + "saveTrustCertChain return credId = " + credId);
372         } catch (IOException e) {
373             logMessage(TAG + "Cert file not exist in Assets" + e.getMessage());
374             Log.e(TAG, e.getMessage());
375         } catch (OcException e) {
376             logMessage(TAG + "saveTrustCertChain failed " + e.getMessage());
377             Log.e(TAG, e.getMessage());
378         } finally {
379             if (inputStream != null) {
380                 try {
381                     inputStream.close();
382                 } catch (IOException e) {
383                     Log.e(TAG, e.getMessage());
384                 }
385             }
386
387         }
388     }
389
390     /**
391      * Provision cert chain
392      */
393     private void provisionCertChain() {
394
395         if (ownedDeviceList.size() > 0) {
396             try {
397                 OcSecureResource ocSecureResource = ownedDeviceList.get(0);
398                 logMessage(TAG + "Initiate provision cert chain credId = "
399                         + credId);
400                 ocSecureResource.provisionTrustCertChain(
401                         EnumSet.of(CredType.SIGNED_ASYMMETRIC_KEY), credId,
402                         provisionTrustCertListener);
403             } catch (OcException e) {
404                 logMessage(TAG + "Provision cert chain error: "
405                         + e.getMessage());
406                 Log.e(TAG, e.getMessage());
407             }
408         }
409
410     }
411
412     /**
413      * Copy svr db CBOR dat file from assets folder to app data files dir
414      */
415     private void copyCborFromAsset() {
416         InputStream inputStream = null;
417         OutputStream outputStream = null;
418         int length;
419         byte[] buffer = new byte[BUFFER_SIZE];
420         try {
421             inputStream = getAssets().open(StringConstants.OIC_CLIENT_CBOR_DB_FILE);
422             File file = new File(filePath);
423             //check files directory exists
424             if (!(file.exists() && file.isDirectory())) {
425                 file.mkdirs();
426             }
427             outputStream = new FileOutputStream(filePath + StringConstants.OIC_CLIENT_CBOR_DB_FILE);
428             while ((length = inputStream.read(buffer)) != -1) {
429                 outputStream.write(buffer, 0, length);
430             }
431         } catch (NullPointerException e) {
432             logMessage(TAG + "Null pointer exception " + e.getMessage());
433             Log.e(TAG, e.getMessage());
434         } catch (FileNotFoundException e) {
435             logMessage(TAG + "CBOR svr db file not found " + e.getMessage());
436             Log.e(TAG, e.getMessage());
437         } catch (IOException e) {
438             logMessage(TAG + StringConstants.OIC_CLIENT_CBOR_DB_FILE + " file copy failed");
439             Log.e(TAG, e.getMessage());
440         } finally {
441             if (inputStream != null) {
442                 try {
443                     inputStream.close();
444                 } catch (IOException e) {
445                     Log.e(TAG, e.getMessage());
446                 }
447             }
448             if (outputStream != null) {
449                 try {
450                     outputStream.close();
451                 } catch (IOException e) {
452                     Log.e(TAG, e.getMessage());
453                 }
454             }
455         }
456     }
457
458     public void logMessage(String text) {
459         logMsg(text);
460     }
461
462     public void logMsg(final String text) {
463         runOnUiThread(new Runnable() {
464                 public void run() {
465                 Message msg = new Message();
466                 msg.obj = text;
467                 mEventsTextView.append(text);
468                 mEventsTextView.append("\n\n");
469                 }
470                 });
471         Log.i(TAG, text);
472         Intent intent = new Intent(getPackageName());
473         intent.putExtra(StringConstants.MESSAGE, text);
474         sendBroadcast(intent);
475     }
476
477     private class DiscoveryOTTransferAsyncTask extends AsyncTask<Void, String, String> {
478
479         @Override
480             protected void onPreExecute() {
481                 super.onPreExecute();
482             }
483
484         @Override
485             protected String doInBackground(Void... params) {
486                 try {
487                     /**
488                      * Discover Un-owned devices
489                      */
490                     publishProgress(TAG + "Discovering Unowned Devices");
491                     deviceList = new ArrayList<OcSecureResource>(OcProvisioning.discoverUnownedDevices
492                             (StringConstants.DISCOVERY_TIMEOUT_10));
493                     if (deviceList.size() > 0) {
494                         unownedDevCount = deviceList.size();
495                         for (int i = 0; i < deviceList.size(); i++) {
496                             publishProgress(TAG + "Un-owned Discovered Device " + (i + 1) + "= " +
497                                     deviceList.get(i).getDeviceID());
498                         }
499                         try {
500                             OcProvisioning.SetownershipTransferCBdata(OxmType.OIC_JUST_WORKS,
501                                     pinCallbackListener);
502                             for (int i = 0; i < deviceList.size(); i++) {
503                                 publishProgress(TAG + "Doing Ownership Transfer for " +
504                                         deviceList.get(i).getDeviceID());
505                                 deviceList.get(i).doOwnershipTransfer(ProvisioningClient.this);
506                             }
507                         } catch (OcException e) {
508                             publishProgress(TAG + "Ownership Transfer error: " + e.getMessage());
509                             return "Ownership Transfer error: " + e.getMessage();
510
511                         }
512                     } else {
513                         publishProgress(TAG + "No un-owned devices present");
514                         new OwnedDiscoveryAsyncTask().execute();
515                     }
516                 } catch (OcException e) {
517                     publishProgress(TAG + "Un-owned discovery error: " + e.getMessage());
518                     return "Un-owned discovery error:  " + e.getMessage();
519                 }
520                 return "success";
521             }
522
523         @Override
524             protected void onProgressUpdate(String... values) {
525                 logMessage(values[0]);
526             }
527
528         @Override
529             protected void onPostExecute(String s) {
530                 super.onPostExecute(s);
531             }
532     }
533
534     private class ProvisionACLAsyncTask extends AsyncTask<Void, String, Void> {
535
536         @Override
537             protected void onPreExecute() {
538                 super.onPreExecute();
539             }
540
541         @Override
542             protected Void doInBackground(Void... params) {
543                 try {
544                     if (ownedDeviceList.size() > 0) {
545                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
546
547                         publishProgress(TAG + "ACL Provision for " + ocSecureResource.getDeviceID());
548                         List<OicSecResr> resources1 = new ArrayList<OicSecResr>();
549                         List<OicSecResr> resources2 = new ArrayList<OicSecResr>();
550                         List<OicSecValidity> validities = new ArrayList<OicSecValidity>();
551
552                         List<String> types1 = new ArrayList<String>();
553                         types1.add(StringConstants.RESOURCE_TYPE_1A);
554                         types1.add(StringConstants.RESOURCE_TYPE_1B);
555                         List<String> types2 = new ArrayList<String>();
556                         types2.add(StringConstants.RESOURCE_TYPE_2A);
557                         types2.add(StringConstants.RESOURCE_TYPE_2B);
558                         List<String> interfaces = new ArrayList<String>();
559                         interfaces.add(StringConstants.RESOURCE_INTERFACE_1);
560                         interfaces.add(StringConstants.RESOURCE_INTERFACE_2);
561
562                         OicSecResr oicSecResr1a = new OicSecResr(StringConstants.HREF_RESOURCES_1A, "", types1, 2, interfaces, 2);
563                         OicSecResr oicSecResr1b = new OicSecResr(StringConstants.HREF_RESOURCES_1B, "", types1, 2, interfaces, 2);
564                         resources1.add(oicSecResr1a);
565                         resources1.add(oicSecResr1b);
566
567                         OicSecResr oicSecResr2a = new OicSecResr(StringConstants.HREF_RESOURCES_2A, "", types2, 2, interfaces, 2);
568                         OicSecResr oicSecResr2b = new OicSecResr(StringConstants.HREF_RESOURCES_2B, "", types2, 2, interfaces, 2);
569                         resources2.add(oicSecResr2a);
570                         resources2.add(oicSecResr2b);
571
572                         List<String> recurrences = new ArrayList<String>();
573                         recurrences.add(StringConstants.DEFAULT_RECURRENCES_1);
574                         recurrences.add(StringConstants.DEFAULT_RECURRENCES_2);
575                         OicSecValidity oicSecValidity = new OicSecValidity(StringConstants.DEFAULT_PERIOD,
576                                 recurrences, 2);
577                         validities.add(oicSecValidity);
578
579                         OicSecAce oicsecace1 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID1,
580                                 StringConstants.DEFAULT_PERMISSION, resources1, validities);
581
582                         OicSecAce oicsecace2 = new OicSecAce(StringConstants.DEFAULT_SUBJECT_ID2,
583                                 StringConstants.DEFAULT_PERMISSION, resources2, validities);
584
585                         List<OicSecAce> oicSecAces=new ArrayList<OicSecAce>();
586                         oicSecAces.add(oicsecace1);
587                         oicSecAces.add(oicsecace2);
588
589                         OicSecAcl aclObject = new OicSecAcl(StringConstants.DEFAULT_ROWNER_ID, oicSecAces);
590
591                         ocSecureResource.provisionACL(aclObject, provisionAclListener);
592                     } else {
593                         publishProgress(TAG + "No Owned devices present");
594                     }
595                 } catch (Exception e) {
596                     publishProgress(TAG + "ProvisionACL error: " + e.getMessage());
597                 }
598                 return null;
599             }
600
601         @Override
602             protected void onProgressUpdate(String... values) {
603                 logMessage(values[0]);
604             }
605     }
606
607     private class ProvisionCredentialAsyncTask extends AsyncTask<Void, String, Void> {
608
609         @Override
610             protected void onPreExecute() {
611                 super.onPreExecute();
612             }
613
614         @Override
615             protected Void doInBackground(Void... params) {
616                 try {
617                     if (ownedDeviceList.size() > 1) {
618                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
619                         OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
620                         publishProgress(TAG + "ProvisionCredential for " +
621                                 ocSecureResource.getDeviceID() + " with " +
622                                 ocSecureResourceDest.getDeviceID());
623                         ocSecureResource.provisionCredentials(EnumSet.of(CredType.SYMMETRIC_PAIR_WISE_KEY),
624                                 KeySize.OWNER_PSK_LENGTH_128,
625                                 ocSecureResourceDest, provisionCredentialsListener);
626                     } else {
627                         publishProgress(TAG + "Cannot perform credentials between devices");
628                     }
629                 } catch (Exception e) {
630                     publishProgress(TAG + "Provision credentials error: " + e.getMessage());
631                 }
632                 return null;
633             }
634
635         @Override
636             protected void onProgressUpdate(String... values) {
637                 logMessage(values[0]);
638             }
639     }
640
641     private class GetLinkedDevicesAsyncTask extends AsyncTask<Void, String, String> {
642
643         @Override
644             protected void onPreExecute() {
645                 super.onPreExecute();
646             }
647
648         @Override
649             protected String doInBackground(Void... params) {
650                 try {
651                     if (ownedDeviceList.size() > 1) {
652                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
653                         publishProgress(TAG + "Get linked devices of " + ocSecureResource.getDeviceID());
654                         List<String> linkedDevices = ocSecureResource.getLinkedDevices();
655                         if (linkedDevices.size() > 0) {
656                             for (int i = 0; i < linkedDevices.size(); i++) {
657                                 publishProgress(TAG + "Linked Devices " +
658                                         (i + 1) + "= " + linkedDevices.get(i));
659                             }
660                         } else {
661                             publishProgress(TAG + "No linked Devices found");
662                         }
663                     } else {
664                         publishProgress(TAG + "Cannot perform linked devices");
665                     }
666                 } catch (Exception e) {
667                     publishProgress(TAG + "getLinked device error: " + e.getMessage());
668                     return "failed";
669                 }
670                 return "success";
671             }
672
673         @Override
674             protected void onProgressUpdate(String... values) {
675                 logMessage(values[0]);
676             }
677
678         @Override
679             protected void onPostExecute(String s) {
680                 if ("success".equals(s)) {
681                     new ProvisionUnlinkAsyncTask().execute();
682                 }
683             }
684     }
685
686     private class ProvisionUnlinkAsyncTask extends AsyncTask<Void, String, Void> {
687
688         @Override
689             protected void onPreExecute() {
690                 super.onPreExecute();
691             }
692
693         @Override
694             protected Void doInBackground(Void... params) {
695                 try {
696                     if (ownedDeviceList.size() > 1) {
697                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
698                         OcSecureResource ocSecureResourceDest = ownedDeviceList.get(1);
699                         publishProgress(TAG + "Un linking  " + ocSecureResource.getDeviceID() +
700                                 " with " + ocSecureResourceDest.getDeviceID());
701                         ocSecureResource.unlinkDevices(ocSecureResourceDest, unlinkDevicesListener);
702                     } else {
703                         publishProgress(TAG + "Cannot perform unlink devices");
704                     }
705                 } catch (Exception e) {
706                     publishProgress(TAG + "Unlink error: " + e.getMessage());
707                 }
708                 return null;
709             }
710
711         @Override
712             protected void onProgressUpdate(String... values) {
713                 logMessage(values[0]);
714             }
715     }
716
717     private class DeviceRevocationAsyncTask extends AsyncTask<Void, String, Void> {
718
719         @Override
720             protected void onPreExecute() {
721                 super.onPreExecute();
722             }
723
724         @Override
725             protected Void doInBackground(Void... params) {
726                 try {
727                     if (ownedDeviceList.size() > 0) {
728                         OcSecureResource ocSecureResource = ownedDeviceList.get(0);
729                         publishProgress(TAG + "Removing " + ocSecureResource.getDeviceID());
730                         ocSecureResource.removeDevice(StringConstants.DISCOVERY_TIMEOUT_20,
731                                 removeDeviceListener);
732                     } else {
733                         publishProgress(TAG + "Cannot remove");
734                     }
735                 } catch (Exception e) {
736                     publishProgress(TAG + "Remove Device error: " + e.getMessage());
737                 }
738                 return null;
739             }
740
741         @Override
742             protected void onProgressUpdate(String... values) {
743                 logMessage(values[0]);
744             }
745     }
746
747     private class OwnedDiscoveryAsyncTask extends AsyncTask<Void, String, String> {
748
749         @Override
750             protected void onPreExecute() {
751                 super.onPreExecute();
752             }
753
754         @Override
755             protected String doInBackground(Void... params) {
756                 try {
757                     publishProgress(TAG + "Initiate Owned device Discovery");
758                     ownedDeviceList = OcProvisioning.discoverOwnedDevices
759                         (StringConstants.DISCOVERY_TIMEOUT_10);
760                     if (ownedDeviceList.size() > 0) {
761                         for (int i = 0; i < ownedDeviceList.size(); i++) {
762                             publishProgress(TAG + "Owned Discovered Device " + (i + 1) + "= " +
763                                     ownedDeviceList.get(i).getDeviceID()
764                                     + "\nIP Address= " + ownedDeviceList.get(i).getIpAddr()
765                                     + "\nOwned Status= " + ownedDeviceList.get(i).getOwnedStatus()
766                                     + "\nDevice Status= " + ((ownedDeviceList.get(i).
767                                             getDeviceStatus() == DeviceStatus.ON) ? "ON" : "OFF")
768                                     );
769                         }
770                     } else {
771                         publishProgress(TAG + "No Owned devices present");
772                     }
773                 } catch (OcException e) {
774                     publishProgress(TAG + "Owned device Discovery error: " + e.getMessage());
775                     return "Owned device Discovery error: " + e.getMessage();
776                 }
777                 return "success";
778             }
779
780         @Override
781             protected void onProgressUpdate(String... values) {
782                 logMessage(values[0]);
783             }
784
785         @Override
786             protected void onPostExecute(String s) {
787
788
789                 if (ownedDeviceList.size() == 1 && "success".equals(s)) {
790                     doDPProvisioning();
791                 }
792                 if (ownedDeviceList.size() > 1 && "success".equals(s)) {
793                     doPairwiseProvisioning();
794                 }
795
796             }
797     }
798
799     /**
800      * to display on Server Message on Client screen
801      */
802     public class MessageReceiver extends BroadcastReceiver {
803         @Override
804             public void onReceive(Context context, Intent intent) {
805                 final String message = intent.getStringExtra(StringConstants.MESSAGE);
806                 logMessage(message);
807             }
808     }
809 }