diff --git a/lib/app.php b/lib/app.php
index 28f1f16ebaf..328095a90d2 100755
--- a/lib/app.php
+++ b/lib/app.php
@@ -397,10 +397,11 @@ class OC_App{
}
/**
- * @brief Read app metadata from the info.xml file
+ * @brief Read all app metadata from the info.xml file
* @param string $appid id of the app or the path of the info.xml file
* @param boolean path (optional)
* @returns array
+ * @note all data is read from info.xml, not just pre-defined fields
*/
public static function getAppInfo($appid,$path=false) {
if($path) {
@@ -442,6 +443,7 @@ class OC_App{
}
}
self::$appInfo[$appid]=$data;
+
return $data;
}
@@ -521,20 +523,74 @@ class OC_App{
}
/**
- * get a list of all apps in the apps folder
+ * @brief: get a list of all apps in the apps folder
+ * @return array or app names (string IDs)
+ * @todo: change the name of this method to getInstalledApps, which is more accurate
*/
public static function getAllApps() {
+
$apps=array();
- foreach(OC::$APPSROOTS as $apps_dir) {
- $dh=opendir($apps_dir['path']);
- while($file=readdir($dh)) {
- if($file[0]!='.' and is_file($apps_dir['path'].'/'.$file.'/appinfo/app.php')) {
- $apps[]=$file;
+
+ foreach ( OC::$APPSROOTS as $apps_dir ) {
+
+ $dh = opendir( $apps_dir['path'] );
+
+ while( $file = readdir( $dh ) ) {
+
+ if (
+ $file[0] != '.'
+ and is_file($apps_dir['path'].'/'.$file.'/appinfo/app.php' )
+ ) {
+
+ $apps[] = $file;
+
}
+
}
+
}
+
return $apps;
}
+
+ /**
+ * @brief: get a list of all apps on apps.owncloud.com
+ * @return multi-dimensional array of apps. Keys: id, name, type, typename, personid, license, detailpage, preview, changed, description
+ */
+ public static function getAppstoreApps( $filter = 'approved' ) {
+
+ $catagoryNames = OC_OCSClient::getCategories();
+
+ if ( is_array( $catagoryNames ) ) {
+
+ $categories = array_keys( $catagoryNames );
+
+ $page = 0;
+
+ $remoteApps = OC_OCSClient::getApplications( $categories, $page, $filter );
+
+ $app1 = array();
+
+ $i = 0;
+
+ foreach ( $remoteApps as $app ) {
+
+ $app1[$i] = $app;
+
+ $app1[$i]['author'] = $app['personid'];
+
+ $app1[$i]['ocs_id'] = $app['id'];
+
+ $app1[$i]['internal'] = $app1[$i]['active'] = 0;
+
+ $i++;
+
+ }
+
+ }
+
+ return $app1;
+ }
/**
* check if the app need updating and update when needed
@@ -640,7 +696,7 @@ class OC_App{
}
}else{
OC_Log::write('core', 'Can\'t get app storage, app '.$appid.' not enabled', OC_Log::ERROR);
- false;
+ return false;
}
}
}
diff --git a/settings/ajax/apps/ocs.php b/settings/ajax/apps/ocs.php
index 71cb046fc8d..a15b21e1744 100644
--- a/settings/ajax/apps/ocs.php
+++ b/settings/ajax/apps/ocs.php
@@ -11,7 +11,7 @@ require_once '../../../lib/base.php';
OC_JSON::checkAdminUser();
-$l = OC_L10N::get('core');
+$l = OC_L10N::get('settings');
if(OC_Config::getValue('appstoreenabled', true)==false) {
OCP\JSON::success(array('type' => 'external', 'data' => array()));
@@ -62,5 +62,4 @@ if(is_array($catagoryNames)) {
}
}
-OCP\JSON::success(array('type' => 'external', 'data' => $apps));
-
+OCP\JSON::success(array('type' => 'external', 'data' => $apps));
\ No newline at end of file
diff --git a/settings/apps.php b/settings/apps.php
index e613814fe94..1481f6fc4ad 100644
--- a/settings/apps.php
+++ b/settings/apps.php
@@ -29,45 +29,110 @@ OC_Util::addStyle( "settings", "settings" );
OC_Util::addScript( "settings", "apps" );
OC_App::setActiveNavigationEntry( "core_apps" );
-$registeredApps=OC_App::getAllApps();
-$apps=array();
+$installedApps = OC_App::getAllApps();
-//TODO which apps do we want to blacklist and how do we integrate blacklisting with the multi apps folder feature
-$blacklist=array('files');//we dont want to show configuration for these
+$remoteApps = OC_App::getAppstoreApps();
-foreach($registeredApps as $app) {
- if(array_search($app, $blacklist)===false) {
+//$remoteApps = array();
+
+//TODO which apps do we want to blacklist and how do we integrate blacklisting with the multi apps folder feature?
+
+$blacklist = array('files');//we dont want to show configuration for these
+
+$appList = array();
+
+foreach ( $installedApps as $app ) {
+
+ if ( array_search( $app, $blacklist ) === false ) {
+
$info=OC_App::getAppInfo($app);
+
if (!isset($info['name'])) {
+
OC_Log::write('core', 'App id "'.$app.'" has no name in appinfo', OC_Log::ERROR);
+
continue;
+
}
- $active=(OC_Appconfig::getValue($app, 'enabled', 'no')=='yes')?true:false;
- $info['active']=$active;
+
+ if ( OC_Appconfig::getValue( $app, 'enabled', 'no') == 'yes' ) {
+
+ $active = true;
+
+ } else {
+
+ $active = false;
+
+ }
+
+ $info['active'] = $active;
+
if(isset($info['shipped']) and ($info['shipped']=='true')) {
+
$info['internal']=true;
+
$info['internallabel']='Internal App';
+
}else{
+
$info['internal']=false;
+
$info['internallabel']='3rd Party App';
+
}
- $info['preview']='trans.png';
- $info['version']=OC_App::getAppVersion($app);
- $apps[]=$info;
+
+ $info['preview'] = 'trans.png';
+
+ $info['version'] = OC_App::getAppVersion($app);
+
+ $appList[] = $info;
+
}
}
-function app_sort($a, $b) {
- if ($a['active'] != $b['active']) {
- return $b['active'] - $a['active'];
+// Remove duplicates
+foreach ( $appList as $app ) {
+
+ foreach ( $remoteApps AS $key => $remote ) {
+
+ if (
+ $app['name'] == $remote['name']
+ // To set duplicate detection to use OCS ID instead of string name,
+ // enable this code, remove the line of code above,
+ // and add