We currently only have module_exists. If there were respective functions for themes and layouts, then code like this:

function _installer_browser_is_project_enabled($type, $name) {
  switch ($type) {
    case 'module':
      return module_exists($name);
      break;
    case 'theme':
      $themes = list_themes();
      return isset($themes[$name]);
      break;
    case 'layout':
      $layout = layout_load($name);
      return !empty($layout);
      break;
  }
  return FALSE;
}

...which is actually not working to effectively determine whether a layout is enabled or not (#2336) and the best that I could come up with to correct it is this:

function _installer_browser_is_project_enabled($type, $name) {
  switch ($type) {
    case 'module':
      return module_exists($name);
      break;
    case 'theme':
      $themes = list_themes();
      return isset($themes[$name]);
      break;
    case 'layout':
       $excluded_templates = config_get('layout.settings', 'excluded_templates');
       return (!empty(layout_get_layout_info($name)) && !in_array($name, $excluded_templates));
       break;
  }
  return FALSE;
}

...would be much simpler:

function _installer_browser_is_project_enabled($type, $name) {
  switch ($type) {
    case 'module':
      return module_exists($name);
      break;
    case 'theme':
      return theme_exists($name);
      break;
    case 'layout':
      return layout_exists($name);
      break;
  }
  return FALSE;
}

And if there was a generic project_exists function, then we wouldn't need _installer_browser_is_project_enabled() in the first place.

In fact, I don't think that *_exists as function names are precise. We should consider separate *_exists and *_enabled functions. Especially now that we have Project Installer where we need to distinguish between downloaded vs installed/enabled projects.

PS: this is a sibling issue to #332

GitHub Issue #: 
2337