public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $applications = PhabricatorApplication::getAllInstalledApplications();
     foreach ($applications as $key => $application) {
         if (!$application->shouldAppearInLaunchView()) {
             unset($applications[$key]);
         }
     }
     $groups = PhabricatorApplication::getApplicationGroups();
     $applications = msort($applications, 'getApplicationOrder');
     $applications = mgroup($applications, 'getApplicationGroup');
     $applications = array_select_keys($applications, array_keys($groups));
     $view = array();
     foreach ($applications as $group => $application_list) {
         $status = array();
         foreach ($application_list as $key => $application) {
             $status[$key] = $application->loadStatus($user);
         }
         $views = array();
         foreach ($application_list as $key => $application) {
             $views[] = id(new PhabricatorApplicationLaunchView())->setApplication($application)->setApplicationStatus(idx($status, $key, array()))->setUser($user);
         }
         $view[] = id(new PhabricatorHeaderView())->setHeader($groups[$group]);
         $view[] = phutil_render_tag('div', array('class' => 'phabricator-application-list'), id(new AphrontNullView())->appendChild($views)->render());
     }
     return $this->buildApplicationPage($view, array('title' => 'Applications', 'device' => true));
 }
 protected function renderResultList(array $all_applications, PhabricatorSavedQuery $query, array $handle)
 {
     assert_instances_of($all_applications, 'PhabricatorApplication');
     $all_applications = msort($all_applications, 'getName');
     if ($query->getQueryKey() == 'launcher') {
         $groups = mgroup($all_applications, 'getApplicationGroup');
     } else {
         $groups = array($all_applications);
     }
     $group_names = PhabricatorApplication::getApplicationGroups();
     $groups = array_select_keys($groups, array_keys($group_names)) + $groups;
     $results = array();
     foreach ($groups as $group => $applications) {
         if (count($groups) > 1) {
             $results[] = phutil_tag('h1', array('class' => 'launcher-header'), idx($group_names, $group, $group));
         }
         $list = new PHUIObjectItemListView();
         $list->addClass('phui-object-item-launcher-list');
         foreach ($applications as $application) {
             $icon = $application->getIconName();
             if (!$icon) {
                 $icon = 'application';
             }
             // TODO: This sheet doesn't work the same way other sheets do so it
             // ends up with the wrong classes if we try to use PHUIIconView. This
             // is probably all changing in the redesign anyway.
             $icon_view = javelin_tag('span', array('class' => 'phui-icon-view ' . 'sprite-apps-large apps-' . $icon . '-dark-large', 'aural' => false), '');
             $description = phutil_tag('div', array('style' => 'white-space: nowrap; ' . 'overflow: hidden; ' . 'text-overflow: ellipsis;'), $application->getShortDescription());
             $item = id(new PHUIObjectItemView())->setHeader($application->getName())->setImageIcon($icon_view)->addAttribute($description)->addAction(id(new PHUIListItemView())->setName(pht('Help/Options'))->setIcon('fa-cog')->setHref('/applications/view/' . get_class($application) . '/'));
             if ($application->getBaseURI()) {
                 $item->setHref($application->getBaseURI());
             }
             if (!$application->isInstalled()) {
                 $item->addIcon('fa-times', pht('Uninstalled'));
             }
             if ($application->isBeta()) {
                 $item->addIcon('fa-star-half-o grey', pht('Beta'));
             }
             if (!$application->isFirstParty()) {
                 $item->addIcon('fa-puzzle-piece', pht('Extension'));
             }
             $list->addItem($item);
         }
         $results[] = $list;
     }
     return $results;
 }
 protected function renderResultList(array $all_applications, PhabricatorSavedQuery $query, array $handle)
 {
     assert_instances_of($all_applications, 'PhabricatorApplication');
     $all_applications = msort($all_applications, 'getName');
     if ($query->getQueryKey() == 'launcher') {
         $groups = mgroup($all_applications, 'getApplicationGroup');
     } else {
         $groups = array($all_applications);
     }
     $group_names = PhabricatorApplication::getApplicationGroups();
     $groups = array_select_keys($groups, array_keys($group_names)) + $groups;
     $results = array();
     foreach ($groups as $group => $applications) {
         if (count($groups) > 1) {
             $results[] = phutil_tag('h1', array('class' => 'phui-object-item-list-header'), idx($group_names, $group, $group));
         }
         $list = new PHUIObjectItemListView();
         foreach ($applications as $application) {
             $icon = $application->getFontIcon();
             if (!$icon) {
                 $icon = 'application';
             }
             // TODO: This sheet doesn't work the same way other sheets do so it
             // ends up with the wrong classes if we try to use PHUIIconView. This
             // is probably all changing in the redesign anyway.
             $icon_view = javelin_tag('span', array('class' => 'phui-icon-view phui-font-fa ' . $icon, 'aural' => false), '');
             $description = $application->getShortDescription();
             $configure = id(new PHUIButtonView())->setTag('a')->setHref('/applications/view/' . get_class($application) . '/')->setText(pht('Configure'))->setColor(PHUIButtonView::GREY);
             $name = $application->getName();
             if ($application->isPrototype()) {
                 $name = $name . ' ' . pht('(Prototype)');
             }
             $item = id(new PHUIObjectItemView())->setHeader($name)->setImageIcon($icon_view)->setSubhead($description)->setLaunchButton($configure);
             if ($application->getBaseURI() && $application->isInstalled()) {
                 $item->setHref($application->getBaseURI());
             }
             if (!$application->isInstalled()) {
                 $item->addAttribute(pht('Uninstalled'));
                 $item->setDisabled(true);
             }
             if (!$application->isFirstParty()) {
                 $item->addAttribute(pht('Extension'));
             }
             $list->addItem($item);
         }
         $results[] = $list;
     }
     $result = new PhabricatorApplicationSearchResultView();
     $result->setContent($results);
     return $result;
 }
 protected function renderResultList(array $all_applications, PhabricatorSavedQuery $query, array $handle)
 {
     assert_instances_of($all_applications, 'PhabricatorApplication');
     $all_applications = msort($all_applications, 'getName');
     if ($query->getQueryKey() == 'launcher') {
         $groups = mgroup($all_applications, 'getApplicationGroup');
     } else {
         $groups = array($all_applications);
     }
     $group_names = PhabricatorApplication::getApplicationGroups();
     $groups = array_select_keys($groups, array_keys($group_names)) + $groups;
     $results = array();
     foreach ($groups as $group => $applications) {
         if (count($groups) > 1) {
             $results[] = phutil_tag('h1', array('class' => 'phui-object-item-list-header'), idx($group_names, $group, $group));
         }
         $list = new PHUIObjectItemListView();
         foreach ($applications as $application) {
             $icon = $application->getIcon();
             if (!$icon) {
                 $icon = 'application';
             }
             $description = $application->getShortDescription();
             $configure = id(new PHUIButtonView())->setTag('a')->setHref('/applications/view/' . get_class($application) . '/')->setText(pht('Configure'))->setColor(PHUIButtonView::GREY);
             $name = $application->getName();
             if ($application->isPrototype()) {
                 $name = $name . ' ' . pht('(Prototype)');
             }
             $item = id(new PHUIObjectItemView())->setHeader($name)->setImageIcon($icon)->setSubhead($description)->setLaunchButton($configure);
             if ($application->getBaseURI() && $application->isInstalled()) {
                 $item->setHref($application->getBaseURI());
             }
             if (!$application->isInstalled()) {
                 $item->addAttribute(pht('Uninstalled'));
                 $item->setDisabled(true);
             }
             if (!$application->isFirstParty()) {
                 $item->addAttribute(pht('Extension'));
             }
             $list->addItem($item);
         }
         $results[] = $list;
     }
     $result = new PhabricatorApplicationSearchResultView();
     $result->setContent($results);
     return $result;
 }