瀏覽代碼

Option menu related to vod reset, vod add, vod remove, bridged client start/stop was added or modified. And ocfbridge branch 2020.09.29 was merged.

Trishia 4 年之前
父節點
當前提交
3f3d32c14e

二進制
app/libs/iotivity-lite.jar


+ 107 - 66
app/src/main/java/org/iotivity/bridge/homeserver/BridgeServer.java

@@ -35,6 +35,7 @@ import org.iotivity.oc.OcUtils;
 import org.iotivity.OCUuidUtil;
 import org.iotivity.OCUuid;
 import org.iotivity.OCVirtualDevice;
+import org.iotivity.oc.OcVirtualDevice;
 import org.json.JSONObject;
 
 import java.io.ByteArrayOutputStream;
@@ -83,7 +84,7 @@ public class BridgeServer {
 
     public void initBridgeServer() {
 
-        this.addLightVirtualOCFServer(LIGHT_UUID, "Light Switch", "ocf");
+        //this.addLightVirtualOCFServer(LIGHT_UUID, "Light Switch", "ocf");
         //this.addVirtualOCFClient(CLIENT_UUID, "Virtual OCF Client", "ocf");
 
         this.loadPairwisedDeviceUUIDs();
@@ -112,55 +113,73 @@ public class BridgeServer {
         for (int index = 1; index <= vod_count; index++) {
             OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(index);
             if (vod != null) {
-                OCBridge.removeVirtualDevice(vod.getIndex());
-                OCBridge.deleteVirtualDevice(vod.getIndex()); //  Note :This includes OCMain.resetDevice(index);
+                OCBridge.removeVirtualDevice(vod.getIndex());  // Note : This removes vod in vods_list and shutdown connectivity
+                OCBridge.deleteVirtualDevice(vod.getIndex()); //  Note : This removes piid, core device, vod map at index and OCMain.resetDevice(index);
                 Log.d(TAG, "Virtual OCF Device [" + vod.getIndex() + "] was reset!");
             }
         }
         //TODO : need to check Memory data
         bridge.clearVirtualOCFDeviceList();
-  }
+    }
+
+    public void deleteVirtualOCFDevice(String device_sn) {
+        int vod_count = OCBridge.getVirtualDeviceCount();
+        Log.d(TAG, "Virtual OCF Device Count = [" + vod_count + "], Core Device Nums = ["+OCCoreRes.getNumDevices()+"] ");
+        for (int index = 1; index <= vod_count; index++) {
+            OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(index);
+            if (vod != null && OCUuidUtil.bytesToString(vod.getId()).equalsIgnoreCase(device_sn)) {
+                this.deleteVirtualOCFDevice((int)vod.getIndex());
+                Log.d(TAG, "Virtual OCF Device [" + vod.getIndex() + "] was deleted!");
+            }
+        }
+    }
 
     public void deleteVirtualOCFDevice(int vod_index) {
-        OCBridge.removeVirtualDevice(vod_index);
-        OCBridge.deleteVirtualDevice(vod_index); // Note : This includes OCMain.resetDevice(index);
+        OCBridge.removeVirtualDevice(vod_index);  // Note : This removes vod in vods_list and shutdown connectivity
+        OCBridge.deleteVirtualDevice(vod_index); //  Note : This removes piid, core device, vod map at index and OCMain.resetDevice(index);
 
         //TODO : need to check Memory data
         bridge.removeVirtualOCFDevice(vod_index);
     }
 
-    public void resetDevice(int device_index) {
+    public void removeVirtualOCFDevices() {
 
-        if(device_index < 0) return ;
+        ArrayList<VirtualOCFDevice> vods = (ArrayList<VirtualOCFDevice>)bridge.getVirtualOCFDeviceList().clone();
+        for(VirtualOCFDevice vod : vods) {
+            this.removeVirtualOCFDevice(vod.getVODIndex());
+        }
+    }
 
-        OCDeviceInfo info = OCCoreRes.getDeviceInfo(device_index);
-        if(info == null) return ;
-        if(device_index == Bridge.BRIDGE_INDEX) {
-            if (info != null) {
-                Log.d(TAG, "Bridge Server[" + Bridge.BRIDGE_INDEX + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
-                        + " will reset");
-            }
-            this.resetBridgeServer();
+    public void removeVirtualOCFDevice(int vod_index) {
 
-        } else if(device_index > 0) {
-            OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(device_index);
-            if (info != null) {
-                Log.d(TAG, "Virtual OCF Server/Client[" + vod.getIndex() + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
-                        + ", echoname = " + vod.getEconame() + " will reset");
+        OCVirtualDevice vod_light = OCBridge.getVirtualDeviceInfo(vod_index);
+        if(vod_light != null) {
+            Log.d(TAG, "Virtual Server[" + vod_light.getIndex() + "] "
+                    + ", DeviceId = " + OCUuidUtil.bytesToString(vod_light.getId())
+                    + ", Econame = " + vod_light.getEconame() + ", Name = " + vod_light.getEconame()
+                    + " will be removed");
+
+            int ret = OCBridge.removeVirtualDevice(vod_index);
+            if (ret >=0) {
+                bridge.removeVirtualOCFDevice(vod_index);
             }
-            //this.resetVirtualOCFDevice(device_index);
-            OCMain.resetDevice(device_index);
         }
     }
 
     public void resetVirtualOCFDevices() {
-        int dev_count = (int)OCCoreRes.getNumDevices();
-        Log.d(TAG, "Core Device Nums = ["+dev_count+"] ");
-        for (int index = 1; index < dev_count; index++) {
-            OCDeviceInfo dev = OCCoreRes.getDeviceInfo(index);
-            if (dev != null) {
-                this.resetDevice(index);
-                Log.d(TAG, "Core OCF Device [" + index + "] "+dev.getName()+" was reset!");
+
+        int dev_count = OCBridge.getVirtualDeviceCount();
+        Log.d(TAG, "VOD Nums = ["+dev_count+"], Core Res Nums = ["+OCCoreRes.getNumDevices()+"]");
+        for (int index = 1 ; index <= dev_count; index++) {
+            OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(index);
+            Log.d(TAG, "VODs Device [" + index + ", "+vod.getIndex()+", vod_id="+OCUuidUtil.bytesToString(vod.getId())+ "]");
+            OCDeviceInfo info = OCCoreRes.getDeviceInfo(index);
+            if(vod != null && info != null) {
+                Log.d(TAG, "Core Device [" + index + ", "+vod.getIndex()+" piid="+OCUuidUtil.uuidToString(info.getPiid())+ "]");
+                if(info.getName() != null) {
+                    Log.d(TAG, "VODs Device [" + index + ", " + vod.getIndex() + "], " + vod.getEconame() + ", " + info.getName() + " will be reset!");
+                    this.resetDevice(index);
+                }
             }
         }
     }
@@ -201,15 +220,25 @@ public class BridgeServer {
         }
     }
 
-    public void deleteVirtualOCFDevice(String device_sn) {
-        int vod_count = OCBridge.getVirtualDeviceCount();
-        Log.d(TAG, "Virtual OCF Device Count = [" + vod_count + "], Core Device Nums = ["+OCCoreRes.getNumDevices()+"] ");
-        for (int index = 1; index <= vod_count; index++) {
-            OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(index);
-            if (vod != null && OCUuidUtil.bytesToString(vod.getId()).equalsIgnoreCase(device_sn)) {
-                this.deleteVirtualOCFDevice((int)vod.getIndex());
-                Log.d(TAG, "Virtual OCF Device [" + vod.getIndex() + "] was deleted!");
+    public void resetDevice(int device_index) {
+
+        if(device_index < 0) return ;
+
+        OCDeviceInfo info = OCCoreRes.getDeviceInfo(device_index);
+        if(info == null) return ;
+        if(device_index == Bridge.BRIDGE_INDEX) {
+            Log.d(TAG, "Bridge Server[" + Bridge.BRIDGE_INDEX + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
+                    + " will reset");
+            this.resetBridgeServer();
+
+        } else if(device_index > 0) {
+            OCVirtualDevice vod = OCBridge.getVirtualDeviceInfo(device_index);
+            if (vod != null) {
+                Log.d(TAG, "Virtual OCF Server/Client[" + vod.getIndex() + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
+                        + ", echoname = " + vod.getEconame() + ", name = "+info.getName()+" will be reset");
             }
+            //this.resetVirtualOCFDevice(device_index);
+            OCMain.resetDevice(device_index);
         }
     }
 
@@ -257,8 +286,8 @@ public class BridgeServer {
             OCVirtualDevice vod_info = OCBridge.getVirtualDeviceInfo(vod_index);
             Log.d(TAG, "VOD Info = " + vod_info);
             if (vod_info != null) {
-                Log.d(TAG, "Virtual Server[" + vod_info.getIndex() + "] "
-                        + " DeviceId = " + OCUuidUtil.bytesToString(vod_info.getId())
+                Log.d(TAG, "Virtual Server [" + vod_info.getIndex() + "] "
+                        + " Virtual Device Id = " + OCUuidUtil.bytesToString(vod_info.getId())
                         + ", Econame = " + vod_info.getEconame() + ", Name = " + dev_info.getName()
                         + " was added");
 
@@ -273,7 +302,7 @@ public class BridgeServer {
                 // set immutable device id for Platform Independent Identifier (piid)
                 OCMain.setImmutableDeviceIdentifier(vod_index, OCUuidUtil.stringToUuid(virtual_di));
                 Log.d(TAG, "Virtual Server [" + vod_info.getIndex() + "] "
-                        + ", Virtual Device Id = " + virtual_di
+                        + " Virtual Device Id = " + virtual_di
                         + ", Device Id = " + OCUuidUtil.uuidToString(dev_info.getDi())
                         + ", Device Piid = " + OCUuidUtil.uuidToString(dev_info.getPiid()));
 
@@ -323,8 +352,8 @@ public class BridgeServer {
             OCVirtualDevice vod_info = OCBridge.getVirtualDeviceInfo(vod_index);
             Log.d(TAG, "VOD Info = "+ vod_info);
             if(vod_info != null) {
-                Log.d(TAG, "Virtual Server[" + vod_info.getIndex() + "] "
-                        + " DeviceId = " + OCUuidUtil.bytesToString(vod_info.getId())
+                Log.d(TAG, "Virtual Server [" + vod_info.getIndex() + "] "
+                        + " Virtual Device Id = " + OCUuidUtil.bytesToString(vod_info.getId())
                         + ", Econame = " + vod_info.getEconame() + ", Name = " + dev_info.getName()
                         + " was added");
 
@@ -366,30 +395,14 @@ public class BridgeServer {
 
                 // set immutable device id for Platform Independent Identifier (piid)
                 OCMain.setImmutableDeviceIdentifier(vod_index, OCUuidUtil.stringToUuid(virtual_di));
-                Log.d(TAG, "Virtual Server [" + vod_info.getIndex() + "] "
-                        + ", Virtual Device Id = " + virtual_di
+                Log.d(TAG, "Virtual Device [" + vod_info.getIndex() + "] "
+                        + " Virtual Device Id = " + virtual_di
                         + ", Device Id = " + OCUuidUtil.uuidToString(dev_info.getDi())
                         + ", Device Piid = " + OCUuidUtil.uuidToString(dev_info.getPiid()));
 
                 // Add Light OCF Device IDD
-                byte[] idd_bytes = getFileBytes("idds/virtual_ocf_device_light_IDD.cbor"); // example : "virtual_ocf_device_light_IDD.cbor"
-                OCIntrospection.setIntrospectionData(vod_index, idd_bytes);
-            }
-        }
-    }
-
-    public void removeLightVirtualOCFDevice(int vod_index) {
-
-        OCVirtualDevice vod_light = OCBridge.getVirtualDeviceInfo(vod_index);
-        if(vod_light != null) {
-            Log.d(TAG, "Virtual Server[" + vod_light.getIndex() + "] "
-                    + ", DeviceId = " + OCUuidUtil.bytesToString(vod_light.getId())
-                    + ", Econame = " + vod_light.getEconame() + ", Name = " + vod_light.getEconame()
-                    + " will be removed");
-
-            int ret = OCBridge.removeVirtualDevice(vod_index);
-            if (ret >=0) {
-                bridge.removeVirtualOCFDevice(vod_index);
+                //byte[] idd_bytes = getFileBytes("idds/virtual_ocf_device_light_IDD.cbor"); // example : "virtual_ocf_device_light_IDD.cbor"
+                //OCIntrospection.setIntrospectionData(vod_index, idd_bytes);
             }
         }
     }
@@ -406,8 +419,8 @@ public class BridgeServer {
             OCDeviceInfo dev_info = OCCoreRes.getDeviceInfo(vod_index);
             OCVirtualDevice vod_client = OCBridge.getVirtualDeviceInfo(vod_index);
             if(vod_client != null){
-                Log.d(TAG, "Virtual Client[" + vod_client.getIndex() + "] "
-                        + " DeviceId = " + OCUuidUtil.bytesToString(vod_client.getId())
+                Log.d(TAG, "Virtual Client [" + vod_client.getIndex() + "] "
+                        + " Virtual Device Id = " + OCUuidUtil.bytesToString(vod_client.getId())
                         + ", Econame = " + vod_client.getEconame() + ", Name = " + dev_info.getName()
                         + " was added");
 
@@ -417,6 +430,14 @@ public class BridgeServer {
                 vod.setDiscovered(true);
                 vod.setAddedToBridge(true);
                 bridge.addOrReplaceVirtualOCFDevice(vod);
+
+                // set immutable device id for Platform Independent Identifier (piid)
+                OCMain.setImmutableDeviceIdentifier(vod_index, uuid);
+                Log.d(TAG, "Virtual Device [" + vod_client.getIndex() + "] "
+                        + " Virtual Device Id = " + device_uuid
+                        + ", Device Id = " + OCUuidUtil.uuidToString(dev_info.getDi())
+                        + ", Device Piid = " + OCUuidUtil.uuidToString(dev_info.getPiid()));
+
             }
         }
 
@@ -473,7 +494,7 @@ public class BridgeServer {
 
             OCDeviceInfo info = OCCoreRes.getDeviceInfo(vod_index);
             if(OCBridge.removeVirtualDevice(vod_index) == 0) {
-                Log.d(TAG, "Virtual OCF Server/Client[" + vod.getVODIndex() + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
+                Log.d(TAG, "Virtual OCF Server/Client [" + vod.getVODIndex() + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
                         + ", echoname = " + vod.getEcoName() + " was removed from the bridge");
             } else {
                 Log.d(TAG, "Failed to remove Virtual OCF Server/Client["+vod_index+"] "+info.getName()+" from the bridge");
@@ -481,6 +502,26 @@ public class BridgeServer {
         }
     }
 
+    public void disconnectAllVirtualDevices() {
+
+        for (VirtualOCFDevice vod : bridge.getVirtualOCFDeviceList()) {
+            Log.d(TAG, "disconnect All Virtual Devices.");
+            if (vod != null) {
+
+                vod.setDiscovered(false);
+                vod.setAddedToBridge(false);
+
+                OCDeviceInfo info = OCCoreRes.getDeviceInfo(vod.getVODIndex());
+                if (OCBridge.removeVirtualDevice(vod.getVODIndex()) == 0) {
+                    Log.d(TAG, "Virtual OCF Server/Client [" + vod.getVODIndex() + "] DeviceId = " + OCUuidUtil.uuidToString(info.getDi())
+                            + ", echoname = " + vod.getEcoName() + " was removed from the bridge");
+                } else {
+                    Log.d(TAG, "Failed to remove Virtual OCF Server/Client[" + vod.getVODIndex() + "] " + info.getName() + " from the bridge");
+                }
+            }
+        }
+    }
+
     /* These APIs are related to online pairwised devices */
     public ArrayList<OcRemoteDevice> getPairwisedDevices() {
         return pairwised_devices;

+ 187 - 7
app/src/main/java/org/iotivity/bridge/homeserver/BridgeServerActivity.java

@@ -48,6 +48,7 @@ import org.iotivity.bridge.homeserver.handler.client.PostLightResponseHandler;
 import org.iotivity.bridge.homeserver.handler.client.ResourceDetailsHelper;
 import org.iotivity.bridge.homeserver.model.Bridge;
 import org.iotivity.bridge.homeserver.model.Light;
+import org.iotivity.bridge.homeserver.model.VirtualOCFDevice;
 import org.iotivity.bridge.homeserver.utils.Utils;
 import org.iotivity.oc.OcCborEncoder;
 import org.iotivity.oc.OcDevice;
@@ -99,8 +100,6 @@ public class BridgeServerActivity extends AppCompatActivity {
         createContent();
 
         if (savedInstanceState == null) {
-            // start first time only
-            //bridgeServer = new BridgeServer(this);
 
             // start Service
             Intent intent = new Intent( BridgeServerActivity.this, BridgeService.class );
@@ -352,16 +351,18 @@ public class BridgeServerActivity extends AppCompatActivity {
             }
 
             case R.id.action_vods_reset:
-                // TODO : do some action like start Activity or show Dialog
                 {
                     AlertDialog.Builder resetVodsDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
-                    resetVodsDialogBuilder.setTitle(getString(R.string.resetVods));
-                    resetVodsDialogBuilder.setMessage(getString(R.string.resetVodsMessage));
+                    resetVodsDialogBuilder.setTitle(getString(R.string.resetVODs));
+                    resetVodsDialogBuilder.setMessage(getString(R.string.resetVODsMessage));
 
                     resetVodsDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog, int which) {
                             if(bridgeServer!=null) bridgeServer.resetVirtualOCFDevices();
+                            Toast.makeText(BridgeServerActivity.this,
+                                    getString(R.string.resetVODsOkMessage)
+                                    , Toast.LENGTH_LONG).show();
                         }
                     });
 
@@ -376,7 +377,6 @@ public class BridgeServerActivity extends AppCompatActivity {
                     return true;
             }
             case R.id.action_vod_reset:
-                // TODO : do some action like start Activity or show Dialog
             {
                 AlertDialog.Builder resetListDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
                 resetListDialogBuilder.setTitle(getString(R.string.selectDevice));
@@ -450,8 +450,32 @@ public class BridgeServerActivity extends AppCompatActivity {
                 resetDialog.show();
                 return true;
             }
+            case R.id.action_add_vos:
+            {
+                AlertDialog.Builder confirmBridgeDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                confirmBridgeDialogBuilder.setTitle(getString(R.string.addVOS));
+                confirmBridgeDialogBuilder.setMessage(getString(R.string.addVOSMessage));
+
+                confirmBridgeDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        if(bridgeServer!=null) {
+                            bridgeServer.addLightVirtualOCFServer(BridgeServer.LIGHT_UUID, "Light Switch", "ocf");
+                        }
+                    }
+                });
+
+                confirmBridgeDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                    }
+                });
+
+                Dialog confirmDialog = confirmBridgeDialogBuilder.create();
+                confirmDialog.show();
+                return true;
+            }
             case R.id.action_add_voc:
-                // TODO : do some action like start Activity or show Dialog
             {
                 AlertDialog.Builder confirmBridgeDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
                 confirmBridgeDialogBuilder.setTitle(getString(R.string.addVOC));
@@ -476,6 +500,162 @@ public class BridgeServerActivity extends AppCompatActivity {
                 confirmDialog.show();
                 return true;
             }
+            case R.id.action_vods_remove:
+            {
+                AlertDialog.Builder removeVodsDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                removeVodsDialogBuilder.setTitle(getString(R.string.removeVODs));
+                removeVodsDialogBuilder.setMessage(getString(R.string.removeVOSsMessage));
+
+                removeVodsDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        if(bridgeServer!=null) bridgeServer.deleteVirtualOCFDevices();
+                        Toast.makeText(BridgeServerActivity.this,
+                                getString(R.string.removeVODsOkMessage)
+                                , Toast.LENGTH_LONG).show();
+                    }
+                });
+
+                removeVodsDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                    }
+                });
+
+                Dialog removeVodsDialog = removeVodsDialogBuilder.create();
+                removeVodsDialog.show();
+                return true;
+            }
+            case R.id.action_vod_remove:
+            {
+                AlertDialog.Builder removeListDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                removeListDialogBuilder.setTitle(getString(R.string.selectDevice));
+                //resetListDialogBuilder.setMessage(getString(R.string.resetDeviceMessage));
+
+                final ArrayList<VirtualOCFDevice> vodlist = (ArrayList<VirtualOCFDevice>)bridgeServer.getVirtualOCFDeviceList().clone();
+
+                ListView deviceRemoveListView = new ListView(BridgeServerActivity.this);
+                final ArrayAdapter deviceArrayAdapter = new ArrayAdapter(BridgeServerActivity.this,
+                        android.R.layout.simple_list_item_1, android.R.id.text1, vodlist) {
+                    @Override
+                    public View getView(int position, View convertView, ViewGroup parent) {
+                        View view = super.getView(position, convertView, parent);
+                        TextView text1 = (TextView) view.findViewById(android.R.id.text1);
+
+                        VirtualOCFDevice device = (VirtualOCFDevice) this.getItem(position);
+                        if (device != null) {
+                            OCDeviceInfo info = OCCoreRes.getDeviceInfo(device.getVODIndex());
+                            if(info !=null) text1.setText(info.getName());
+                        }
+                        return view;
+                    }
+                };
+                deviceRemoveListView.setAdapter(deviceArrayAdapter);
+                deviceRemoveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+                    @Override
+                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                        // TODO :
+                        Log.d(TAG, "deviceResetListView position["+position+"] clicked!!");
+                        final VirtualOCFDevice device = (VirtualOCFDevice) deviceArrayAdapter.getItem(position);
+                        if (device == null) return ;
+                        final OCDeviceInfo info = OCCoreRes.getDeviceInfo(device.getVODIndex());
+                        if (info == null) return ;
+
+                        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                        dialogBuilder.setTitle(getString(R.string.removeVOD));
+                        dialogBuilder.setMessage(getString(R.string.removeVODMessage).replace("?", info.getName()));
+
+                        dialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+
+                                bridgeServer.deleteVirtualOCFDevice(device.getVODIndex());
+                                Toast.makeText(BridgeServerActivity.this,
+                                        getString(R.string.removeVODOkMessage).replace("?", info.getName())
+                                        , Toast.LENGTH_LONG).show();
+                            }
+                        });
+
+                        dialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog, int which) {
+                            }
+                        });
+
+                        Dialog dialog = dialogBuilder.create();
+                        dialog.show();
+
+                    }
+                });
+                removeListDialogBuilder.setView(deviceRemoveListView);
+                removeListDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        dialog.dismiss();
+                    }
+                });
+
+                final Dialog removeDialog = removeListDialogBuilder.create();
+                removeDialog.show();
+                return true;
+            }
+            case R.id.action_start_bridged_client:
+            {
+                AlertDialog.Builder confirmBridgeDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                confirmBridgeDialogBuilder.setTitle(getString(R.string.startBridgedClient));
+                confirmBridgeDialogBuilder.setMessage(getString(R.string.startBridgedClientMessage));
+
+                confirmBridgeDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        if(bridgeService!=null) {
+                            bridgeService.bindLightControlService();
+                            bridgeService.startScheduledTaskForLightControl();
+                        }
+                    }
+                });
+
+                confirmBridgeDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                    }
+                });
+
+                Dialog confirmDialog = confirmBridgeDialogBuilder.create();
+                confirmDialog.show();
+                return true;
+            }
+            case R.id.action_stop_bridged_client:
+            {
+                AlertDialog.Builder confirmBridgeDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);
+                confirmBridgeDialogBuilder.setTitle(getString(R.string.stopBridgedClient));
+                confirmBridgeDialogBuilder.setMessage(getString(R.string.stopBridgedClientMessage));
+
+                confirmBridgeDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        if(bridgeService != null && bridgeServer != null) {
+                            bridgeService.stopScheduledTaskForLightControl();
+                            bridgeService.unbindLightControlService();
+                            for(VirtualOCFDevice vod : bridgeServer.getVirtualOCFDeviceList()) {
+                                if(vod.getEcoName().equalsIgnoreCase(BridgeService.LightControlServiceConnection.ECO_NAME)) {
+                                    bridgeServer.removeVirtualOCFDevice(vod.getVODIndex());
+                                }
+                            }
+                        }
+                    }
+                });
+
+                confirmBridgeDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                    }
+                });
+
+                Dialog confirmDialog = confirmBridgeDialogBuilder.create();
+                confirmDialog.show();
+                return true;
+            }
             case R.id.action_bridgeservice_stop : {
 
                 AlertDialog.Builder stopServiceDialogBuilder = new AlertDialog.Builder(BridgeServerActivity.this);

+ 63 - 15
app/src/main/java/org/iotivity/bridge/homeserver/BridgeService.java

@@ -71,8 +71,6 @@ public class BridgeService extends IntentService {
     private final IBinder lBinder = new LocalServiceBinder();
     private BridgeServer bridgeServer = null ;
 
-    private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-
     // Message Handler MSG TYPEs
     public static final int MSG_RESULT = 1 ;
     public static final int MSG_STRING = 2;
@@ -99,8 +97,7 @@ public class BridgeService extends IntentService {
     public BridgeService() {
         super(BridgeService.class.getName());
     }
-
-    private BridgeService getService() {
+    public BridgeService getService() {
         return this ;
     }
     public BridgeServer getBridgeServer() {
@@ -115,10 +112,12 @@ public class BridgeService extends IntentService {
         // start first time only
         bridgeServer = new BridgeServer(this);
 
-        scheduledTaskInit();
+        // start Light Control Service Client // TODO : should change this function with real Light Control Service of Wallpad
+        //bindLightControlService();
 
-        // TODO : should remove this test function after connected to Light Control Service of Wallpad
-        bindLightServiceForTest();
+        // start Periodic Tasks
+        startScheduledTaskForPairwised();
+        //startScheduledTaskForLightControl();
     }
 
     /*
@@ -301,16 +300,33 @@ public class BridgeService extends IntentService {
         }
     };
 
-    private ILightControlService lightControlBinder = null ;        // Light Control Service Binder for test
-    private void bindLightServiceForTest() {
+    private ILightControlService lightControlBinder = null ;        // Light Control Service Binder
+    private LightControlServiceConnection lightConn = new LightControlServiceConnection();
+    public void bindLightControlService() {
 
         // Light Control Service Remote Bind
-        LightControlServiceConnection lightConn = new LightControlServiceConnection();
         Intent lIntent = new Intent();
         lIntent.setClassName("org.iotivity.bridge.homeserver", "org.iotivity.bridge.homeserver.BridgeService");
-        //lIntent.setClassName("com.icontrols.service.control", "com.iconstrols.service.control.LightControlService"); // TODO : need to check
+        //lIntent.setClassName("com.icontrols.service.control", "com.iconstrols.service.control.LightControlService"); // TODO : need to modify with real
         lIntent.setAction(ILightControlService.class.getName());
         bindService(lIntent, lightConn, Context.BIND_AUTO_CREATE);
+        Log.d(TAG, "bind Light Control Service with Remote Connection");
+    }
+
+    public void unbindLightControlService() {
+        // Light Control Service Remote Unbind
+        if (lightControlBinder != null) {
+            try {
+                lightControlBinder.unregisterLightControlServiceCallback(lightCallback);
+                Log.d(TAG, "unregister Light Control Service with Remote Client Callback");
+                unbindService(lightConn);
+                Log.d(TAG, "unbind Light Control Service with Remote Connection");
+            } catch (RemoteException ex) {
+                Log.e(TAG, "unregister Callback", ex);
+                // There is nothing special we need to do if the service
+                // has crashed.
+            }
+        }
     }
 
     class LightControlServiceConnection implements ServiceConnection {
@@ -393,7 +409,7 @@ public class BridgeService extends IntentService {
     };
 
     /**
-     * The IBridgeService is defined through IDL
+     * The ILightControlService is defined through IDL
      */
     private final ILightControlServiceImpl lightBinder = new ILightControlServiceImpl() ;
     class ILightControlServiceImpl extends ILightControlService.Stub {
@@ -563,9 +579,15 @@ public class BridgeService extends IntentService {
                         if(LightControlServiceConnection.OFFLINE.equalsIgnoreCase(state)) {
                             device = bridgeServer.getVirtualOCFDevice(sn);
                             bridgeServer.disconnectVirtualDevice(device.getVODIndex()); // TODO : neet do check this logic properly
+                            Log.d(TAG, "Light Device ("+n+") : state was changed to " + state + ", so existing VOD was diconnected.");
                         }
                     } else {
 
+                        if(LightControlServiceConnection.OFFLINE.equalsIgnoreCase(state)) {
+                            Log.d(TAG, "Light Device ("+n+") : state is " + state + ", so VOD will not be added.");
+                            continue;
+                        }
+
                         // add device on ocf platform
                         device = bridgeServer.addVirtualOCFDevice(n, sn, rt, LightControlServiceConnection.ECO_NAME);
                         if(device==null) continue;
@@ -809,13 +831,18 @@ public class BridgeService extends IntentService {
         alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
     }
 
-    public void scheduledTaskInit () {
+
+    private ScheduledExecutorService executorPairwised = null ;
+    private ScheduledExecutorService executorLightControl = null;
+    public void startScheduledTaskForPairwised () {
 
         /* How to use ExecuterService like followings
          * executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);                 // once after a delay
          * executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);   // at fixed time interval
          */
-        executorService.scheduleAtFixedRate(new Runnable() {
+        if(executorPairwised != null && executorPairwised.isShutdown() == false ) { executorPairwised.shutdown();}
+        executorPairwised = Executors.newSingleThreadScheduledExecutor();
+        executorPairwised.scheduleAtFixedRate(new Runnable() {
             @Override
             public void run() {
                 // load pair-wised device UUIDs from Bridge Credentials
@@ -835,11 +862,28 @@ public class BridgeService extends IntentService {
             }
         }, 10, 90, TimeUnit.SECONDS); //90 sec interval after 10sec delay
 
-        executorService.scheduleAtFixedRate(new Runnable() {
+    }
+
+    public void stopScheduledTaskForPairwised() {
+        if(executorPairwised!=null ) { executorPairwised.shutdown(); }
+    }
+
+    public void startScheduledTaskForLightControl () {
+
+        /* How to use ExecuterService like followings
+         * executorService.schedule(Classname::someTask, delayInSeconds, TimeUnit.SECONDS);                 // once after a delay
+         * executorService.scheduleAtFixedRate(Classname::someTask, 0, delayInSeconds, TimeUnit.SECONDS);   // at fixed time interval
+         */
+        if(executorLightControl != null && executorLightControl.isShutdown() == false ) { executorLightControl.shutdown();}
+        executorLightControl = Executors.newSingleThreadScheduledExecutor();
+        executorLightControl.scheduleAtFixedRate(new Runnable() {
             @Override
             public void run() {
                 // Getting Properites of Light Control Service for resource monitoring
                 Log.d(TAG, "LightControl ScheduledTask per 180sec was called.");
+                if(lightControlBinder==null) {
+                    bindLightControlService();
+                }
                 discoverAllLightControlDevices();
                 doGetLightControlResources();
             }
@@ -847,6 +891,10 @@ public class BridgeService extends IntentService {
 
     }
 
+    public void stopScheduledTaskForLightControl() {
+        if(executorLightControl !=null) { executorLightControl.shutdown(); }
+    }
+
     public void loadPairwisedDeviceUUIDs() {
         if(bridgeServer!=null) {
             bridgeServer.loadPairwisedDeviceUUIDs();

二進制
app/src/main/jniLibs/arm64-v8a/libiotivity-lite-jni.so


二進制
app/src/main/jniLibs/armeabi-v7a/libiotivity-lite-jni.so


二進制
app/src/main/jniLibs/x86/libiotivity-lite-jni.so


二進制
app/src/main/jniLibs/x86_64/libiotivity-lite-jni.so


+ 26 - 2
app/src/main/res/menu/actionbar_actions.xml

@@ -10,11 +10,16 @@
 
         <item
             android:id="@+id/action_vods_reset"
-            android:title="@string/resetVods"
+            android:title="@string/resetVODs"
             app:showAsAction="never"/>
         <item
             android:id="@+id/action_vod_reset"
-            android:title="@string/resetVod"
+            android:title="@string/resetVOD"
+            app:showAsAction="never"/>
+
+        <item
+            android:id="@+id/action_add_vos"
+            android:title="@string/addVOS"
             app:showAsAction="never"/>
 
         <item
@@ -22,6 +27,25 @@
             android:title="@string/addVOC"
             app:showAsAction="never"/>
 
+        <item
+            android:id="@+id/action_vods_remove"
+            android:title="@string/removeVODs"
+            app:showAsAction="never"/>
+        <item
+            android:id="@+id/action_vod_remove"
+            android:title="@string/removeVOD"
+            app:showAsAction="never"/>
+
+        <item
+            android:id="@+id/action_start_bridged_client"
+            android:title="@string/startBridgedClient"
+            app:showAsAction="never"/>
+
+        <item
+            android:id="@+id/action_stop_bridged_client"
+            android:title="@string/stopBridgedClient"
+            app:showAsAction="never"/>
+
         <item
             android:id="@+id/action_bridgeservice_stop"
             android:title="@string/stopBridgeService"

+ 30 - 11
app/src/main/res/values/strings.xml

@@ -6,23 +6,42 @@
     <string name="discoverDevices">Discover Devices</string>
     <string name="discoveredResources">Discovered Resources</string>
     <string name="resetBridge">Reset Bridge</string>
-    <string name="resetBridgeMessage">Note: This Bridge including SVRs will be reset.</string>
+    <string name="resetBridgeMessage">Note: This Bridge will be reset so that device id will be changed to new one.</string>
     <!--<string name="resetBridge">Reset </string>
     <string name="resetBridgeMessage">Note: This Client including SVRs will be reset.</string>-->
-    <string name="resetVods">Reset VODs</string>
-    <string name="resetVodsMessage">Note: All virtual OCF devices will be reset and clear VOD List So you should kill and restart Bridge Service.</string>
-    <string name="stopBridgeService">Stop Bridge Service</string>
-    <string name="stopBridgeMessage">Note: Service Client Callbacks will be unbind and stop but Bridge Service will not be destroyed.</string>
-    <string name="killBridgeService">Kill Bridge Service</string>
-    <string name="killBridgeMessage">Note: Foregrounding Bridge Service and BridgeServer Activity will be killed.</string>
+    <string name="resetVODs">Reset VODs</string>
+    <string name="resetVODsMessage">Note: All Virtual OCF devices will be reset so that their device id will be changed to new one.</string>
+    <string name="resetVODsOkMessage">All Virtual OCF Devices was reset successfully.</string>
 
-    <string name="resetVod">Reset Each VOD</string>
+    <string name="resetVOD">Reset Each VOD</string>
     <string name="selectDevice">Select Device</string>
     <string name="resetDevice">Reset Selected Device</string>
-    <string name="resetDeviceMessage">Note: Selected device ? will no longer be viable.</string>
-    <string name="resetDeviceOkMessage">Selected device ? was reset successfully.</string>
+    <string name="resetDeviceMessage">Note: Selected device - ? will be reset and their device id will be changed to new one.</string>
+    <string name="resetDeviceOkMessage">Selected device - ? was reset successfully.</string>
+
+    <string name="addVOS">Add Virtual OCF Server</string>
+    <string name="addVOSMessage">Note: Virtual OCF Server(Light Switch) will be added to operate CTT as a first VOD.</string>
 
     <string name="addVOC">Add Virtual OCF Client</string>
-    <string name="addVOCMessage">Note: Virtual OCF Client will be add to test CTT as a second VOD.</string>
+    <string name="addVOCMessage">Note: Virtual OCF Client will be added to operate CTT as a second VOD.</string>
+
+    <string name="removeVOD">Remove Each VOD</string>
+    <string name="removeVODMessage">Note: Selected VOD - ? will be deleted so this device will no longer be visible.</string>
+    <string name="removeVODOkMessage">Selected VOD - ? was deleted successfully.</string>
+    <string name="removeVODs">Remove VODs</string>
+    <string name="removeVOSsMessage">Note: All Virtual OCF Device will be deleted and no longer be visible.</string>
+    <string name="removeVODsOkMessage">All Virtual OCF Devices was deleted successfully.</string>
+
+    <string name="startBridgedClient">Connect Light Control</string>
+    <string name="startBridgedClientMessage">Note: Bridge Client will be connected to Light Control Service and then Virtual OCF Servers will be registered.</string>
+
+    <string name="stopBridgedClient">Disconnect Light Control</string>
+    <string name="stopBridgedClientMessage">Note: Bridge Client will be disconnected to Light Control Service and Virtual OCF Servers will be removed. </string>
+
+    <string name="stopBridgeService">Stop Bridge Service</string>
+    <string name="stopBridgeMessage">Note: All Service Client Callbacks will be unbind and stop but Bridge Service may not be destroyed.</string>
+
+    <string name="killBridgeService">Kill Bridge Service</string>
+    <string name="killBridgeMessage">Note: Bridge Service and Activity will be killed completely.</string>
 
 </resources>