/**
   * Starts {@link ControlPanelService} which discovers controllable devices in its proximity. <br>
   * The ControlPanelService user is informed about the devices in proximity via the {@link
   * DeviceRegistry} interface. <br>
   * The discovery mechanism is implemented by receiving Announcement signals. <br>
   *
   * @param bus BusAttachment that the service should use
   * @param deviceRegistry Holds the information about the devices in proximity<br>
   *     {@link DefaultDeviceRegistry} may be passed in to receive information about the devices
   * @throws ControlPanelException if failed to initialize the control panel service
   */
  public void init(BusAttachment bus, DeviceRegistry deviceRegistry) throws ControlPanelException {
    if (deviceRegistry == null) {
      throw new ControlPanelException("deviceRegistry can't be NULL");
    }

    AboutService aboutService = AboutServiceImpl.getInstance();
    if (!aboutService.isClientRunning()) {
      throw new ControlPanelException(
          "The AboutService is not running, impossible to receive Announcement signals");
    }

    // Perform the basic service initialization
    init(bus);

    this.deviceRegistry = deviceRegistry;

    Log.d(TAG, "Start listening for Announcement signals");
    connMgr.registerEventListener(ConnManagerEventType.ANNOUNCEMENT_RECEIVED, this);

    // Add an announcement handler
    announcementReceiver = new AnnouncementReceiver();
    for (String iface : ANNOUNCEMENT_IFACES) {
      aboutService.addAnnouncementHandler(announcementReceiver, new String[] {iface});
    }
  } // init
  /** Shutdown the {@link ControlPanelService} */
  public void shutdown() {
    Log.d(TAG, "Shutdown ControlPanelService");

    if (announcementReceiver != null) {

      AboutService aboutService = AboutServiceImpl.getInstance();
      for (String iface : ANNOUNCEMENT_IFACES) {
        aboutService.removeAnnouncementHandler(announcementReceiver, new String[] {iface});
      }
    }

    if (deviceRegistry != null) {
      Log.d(TAG, "Clear devices registry");
      for (ControllableDevice device : deviceRegistry.getDevices().values()) {
        stopControllableDevice(device);
      }
      deviceRegistry = null;
    }

    TaskManager taskManager = TaskManager.getInstance();
    if (taskManager.isRunning()) {
      taskManager.shutdown();
    }

    connMgr.shutdown();
  } // shutdown