docs: public static boolean uninstallAddOnFiles(
              AddOn addOn,
              AddOnUninstallationProgressCallback callback,
              Set<AddOn> installedAddOns) {
          Validate.notNull(addOn, "Parameter addOn must not be null.");
          validateCallbackNotNull(callback);
  
          List<String> fileNames = getFilesSafeForUninstall(
                  addOn,
                  installedAddOns == null ? Collections.emptySet() : installedAddOns);
          if (fileNames.isEmpty()) {
              return true;
          }
  
          callback.filesWillBeRemoved(fileNames.size());
          boolean uninstalledWithoutErrors = true;
          for (String name : fileNames) {
              if (name == null) {
                  continue;
              }
              logger.debug("Uninstall file: " + name);
              File file = new File(Constant.getZapHome(), name);
              try {
                  File parent = file.getParentFile();
                  if (file.exists() && !file.delete()) {
                      logger.error("Failed to delete: " + file.getAbsolutePath());
                      uninstalledWithoutErrors = false;
                  }
                  callback.fileRemoved();
                  if (parent.isDirectory() && parent.list().length == 0) {
                      logger.debug("Deleting: " + parent.getAbsolutePath());
                      if (!parent.delete()) {
                          // Ignore - check for <= 2 as on *nix '.' and '..' are returned
                          logger.debug("Failed to delete: " + parent.getAbsolutePath());
                      }
                  }
                  deleteEmptyDirsCreatedForAddOnFiles(file);
              } catch (Exception e) {
                  logger.error("Failed to uninstall file " + file.getAbsolutePath(), e);
              }
          }
  
          Control.getSingleton().getExtensionLoader().addonFilesRemoved();
  
          return uninstalledWithoutErrors;
      }