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