aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2017-04-03 18:04:14 +0200
committerChristoph Wurst <christoph@winzerhof-wurst.at>2017-04-25 20:47:17 +0200
commit36cee1f3867bdaf9fd792fe9c03fe4e4ef95ffcc (patch)
tree6d466d8c99b406f6ffb2037ef5b6afc46a136691
parent5762cd94369acde40cdc40834f5df5f85150e8a3 (diff)
downloadnextcloud-server-36cee1f3867bdaf9fd792fe9c03fe4e4ef95ffcc.tar.gz
nextcloud-server-36cee1f3867bdaf9fd792fe9c03fe4e4ef95ffcc.zip
Let apps register contact menu provider via info.xml
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
-rw-r--r--core/Controller/ContactsMenuController.php13
-rw-r--r--lib/private/Contacts/ContactsMenu/ActionProviderStore.php42
-rw-r--r--lib/private/Contacts/ContactsMenu/Manager.php17
-rw-r--r--tests/Core/Controller/ContactsMenuControllerTest.php16
-rw-r--r--tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php66
-rw-r--r--tests/lib/Contacts/ContactsMenu/ManagerTest.php4
6 files changed, 125 insertions, 33 deletions
diff --git a/core/Controller/ContactsMenuController.php b/core/Controller/ContactsMenuController.php
index edd2f2c8be8..b0e0e0c6a77 100644
--- a/core/Controller/ContactsMenuController.php
+++ b/core/Controller/ContactsMenuController.php
@@ -28,23 +28,24 @@ use OC\Contacts\ContactsMenu\Manager;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
+use OCP\IUserSession;
class ContactsMenuController extends Controller {
/** @var Manager */
private $manager;
- /** @var string */
- private $userId;
+ /** @var IUserSession */
+ private $userSession;
/**
* @param IRequest $request
- * @param string $UserId
+ * @param IUserSession $userSession
* @param Manager $manager
*/
- public function __construct(IRequest $request, $UserId, Manager $manager) {
+ public function __construct(IRequest $request, IUserSession $userSession, Manager $manager) {
parent::__construct('core', $request);
- $this->userId = $UserId;
+ $this->userSession = $userSession;
$this->manager = $manager;
}
@@ -55,7 +56,7 @@ class ContactsMenuController extends Controller {
* @return JSONResponse
*/
public function index($filter = null) {
- return $this->manager->getEntries($this->userId, $filter);
+ return $this->manager->getEntries($this->userSession->getUser(), $filter);
}
}
diff --git a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
index cc5996377dd..ae6436095d8 100644
--- a/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
+++ b/lib/private/Contacts/ContactsMenu/ActionProviderStore.php
@@ -24,38 +24,49 @@
namespace OC\Contacts\ContactsMenu;
+use Exception;
+use OC\App\AppManager;
use OC\Contacts\ContactsMenu\Providers\EMailProvider;
use OCP\AppFramework\QueryException;
use OCP\Contacts\ContactsMenu\IProvider;
use OCP\ILogger;
use OCP\IServerContainer;
+use OCP\IUser;
class ActionProviderStore {
/** @var IServerContainer */
private $serverContainer;
+ /** @var AppManager */
+ private $appManager;
+
/** @var ILogger */
private $logger;
/**
* @param IServerContainer $serverContainer
+ * @param AppManager $appManager
+ * @param ILogger $logger
*/
- public function __construct(IServerContainer $serverContainer, ILogger $logger) {
+ public function __construct(IServerContainer $serverContainer, AppManager $appManager, ILogger $logger) {
$this->serverContainer = $serverContainer;
+ $this->appManager = $appManager;
$this->logger = $logger;
}
/**
+ * @param IUser $user
* @return IProvider[]
* @throws Exception
*/
- public function getProviders() {
- // TODO: include apps
+ public function getProviders(IUser $user) {
+ $appClasses = $this->getAppProviderClasses($user);
$providerClasses = $this->getServerProviderClasses();
+ $allClasses = array_merge($providerClasses, $appClasses);
$providers = [];
- foreach ($providerClasses as $class) {
+ foreach ($allClasses as $class) {
try {
$providers[] = $this->serverContainer->query($class);
} catch (QueryException $ex) {
@@ -63,7 +74,7 @@ class ActionProviderStore {
'message' => "Could not load contacts menu action provider $class",
'app' => 'core',
]);
- throw new \Exception("Could not load contacts menu action provider");
+ throw new Exception("Could not load contacts menu action provider");
}
}
@@ -79,4 +90,25 @@ class ActionProviderStore {
];
}
+ /**
+ * @param IUser $user
+ * @return string[]
+ */
+ private function getAppProviderClasses(IUser $user) {
+ return array_reduce($this->appManager->getEnabledAppsForUser($user), function($all, $appId) {
+ $info = $this->appManager->getAppInfo($appId);
+
+ if (!isset($info['contactsmenu']) || !isset($info['contactsmenu'])) {
+ // Nothing to add
+ return $all;
+ }
+
+ $providers = array_reduce($info['contactsmenu'], function($all, $provider) {
+ return array_merge($all, [$provider]);
+ }, []);
+
+ return array_merge($all, $providers);
+ }, []);
+ }
+
}
diff --git a/lib/private/Contacts/ContactsMenu/Manager.php b/lib/private/Contacts/ContactsMenu/Manager.php
index c759c4469da..40ceac7d783 100644
--- a/lib/private/Contacts/ContactsMenu/Manager.php
+++ b/lib/private/Contacts/ContactsMenu/Manager.php
@@ -27,6 +27,7 @@ namespace OC\Contacts\ContactsMenu;
use OCP\App\IAppManager;
use OCP\Contacts\ContactsMenu\IEntry;
use OCP\IURLGenerator;
+use OCP\IUser;
class Manager {
@@ -39,9 +40,6 @@ class Manager {
/** @var IAppManager */
private $appManager;
- /** @var IURLGenerator */
- private $urlGenerator;
-
/**
* @param ContactsStore $store
* @param ActionProviderStore $actionProviderStore
@@ -54,18 +52,18 @@ class Manager {
}
/**
- * @param string $userId
+ * @param string $user
* @param string $filter
* @return array
*/
- public function getEntries($userId, $filter) {
+ public function getEntries(IUser $user, $filter) {
$entries = $this->store->getContacts($filter);
$sortedEntries = $this->sortEntries($entries);
$topEntries = array_slice($sortedEntries, 0, 25);
- $this->processEntries($topEntries);
+ $this->processEntries($topEntries, $user);
- $contactsEnabled = $this->appManager->isEnabledForUser('contacts', $userId);
+ $contactsEnabled = $this->appManager->isEnabledForUser('contacts', $user);
return [
'contacts' => $topEntries,
'contactsAppEnabled' => $contactsEnabled,
@@ -85,9 +83,10 @@ class Manager {
/**
* @param IEntry[] $entries
+ * @param IUser $user
*/
- private function processEntries(array $entries) {
- $providers = $this->actionProviderStore->getProviders();
+ private function processEntries(array $entries, IUser $user) {
+ $providers = $this->actionProviderStore->getProviders($user);
foreach ($entries as $entry) {
foreach ($providers as $provider) {
$provider->process($entry);
diff --git a/tests/Core/Controller/ContactsMenuControllerTest.php b/tests/Core/Controller/ContactsMenuControllerTest.php
index 2483d5e94c3..bf6188e9097 100644
--- a/tests/Core/Controller/ContactsMenuControllerTest.php
+++ b/tests/Core/Controller/ContactsMenuControllerTest.php
@@ -28,6 +28,8 @@ use OC\Contacts\ContactsMenu\Manager;
use OC\Core\Controller\ContactsMenuController;
use OCP\Contacts\ContactsMenu\IEntry;
use OCP\IRequest;
+use OCP\IUser;
+use OCP\IUserSession;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
@@ -36,8 +38,8 @@ class ContactsMenuControllerTest extends TestCase {
/** @var IRequest|PHPUnit_Framework_MockObject_MockObject */
private $request;
- /** @var string */
- private $userId;
+ /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */
+ private $userSession;
/** @var Manager|PHPUnit_Framework_MockObject_MockObject */
private $contactsManager;
@@ -49,20 +51,24 @@ class ContactsMenuControllerTest extends TestCase {
parent::setUp();
$this->request = $this->createMock(IRequest::class);
- $this->userId = 'user4563';
+ $this->userSession = $this->createMock(IUserSession::class);
$this->contactsManager = $this->createMock(Manager::class);
- $this->controller = new ContactsMenuController($this->request, $this->userId, $this->contactsManager);
+ $this->controller = new ContactsMenuController($this->request, $this->userSession, $this->contactsManager);
}
public function testIndex() {
+ $user = $this->createMock(IUser::class);
$entries = [
$this->createMock(IEntry::class),
$this->createMock(IEntry::class),
];
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->willReturn($user);
$this->contactsManager->expects($this->once())
->method('getEntries')
- ->with($this->equalTo($this->userId), $this->equalTo(null))
+ ->with($this->equalTo($user), $this->equalTo(null))
->willReturn($entries);
$response = $this->controller->index();
diff --git a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
index 208ce94c6b0..8738e19b513 100644
--- a/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
+++ b/tests/lib/Contacts/ContactsMenu/ActionProviderStoreTest.php
@@ -25,11 +25,15 @@
namespace Tests\Contacts\ContactsMenu;
use Exception;
+use OC\App\AppManager;
use OC\Contacts\ContactsMenu\ActionProviderStore;
use OC\Contacts\ContactsMenu\Providers\EMailProvider;
+use OCP\App\IAppManager;
use OCP\AppFramework\QueryException;
+use OCP\Contacts\ContactsMenu\IProvider;
use OCP\ILogger;
use OCP\IServerContainer;
+use OCP\IUser;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
@@ -38,6 +42,9 @@ class ActionProviderStoreTest extends TestCase {
/** @var IServerContainer|PHPUnit_Framework_MockObject_MockObject */
private $serverContainer;
+ /** @var IAppManager|PHPUnit_Framework_MockObject_MockObject */
+ private $appManager;
+
/** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
private $logger;
@@ -48,19 +55,61 @@ class ActionProviderStoreTest extends TestCase {
parent::setUp();
$this->serverContainer = $this->createMock(IServerContainer::class);
+ $this->appManager = $this->createMock(AppManager::class);
$this->logger = $this->createMock(ILogger::class);
- $this->actionProviderStore = new ActionProviderStore($this->serverContainer, $this->logger);
+
+ $this->actionProviderStore = new ActionProviderStore($this->serverContainer, $this->appManager, $this->logger);
}
public function testGetProviders() {
- $emailProvider = $this->createMock(EMailProvider::class);
+ $user = $this->createMock(IUser::class);
+ $provider1 = $this->createMock(EMailProvider::class);
+ $provider2 = $this->createMock(IProvider::class);
+
+ $this->appManager->expects($this->once())
+ ->method('getEnabledAppsForUser')
+ ->with($user)
+ ->willReturn(['contacts']);
+ $this->appManager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('contacts')
+ ->willReturn([
+ 'contactsmenu' => [
+ 'OCA\Contacts\Provider1',
+ ],
+ ]);
$this->serverContainer->expects($this->exactly(2))
->method('query')
->will($this->returnValueMap([
- [EMailProvider::class, $emailProvider],
+ [EMailProvider::class, $provider1],
+ ['OCA\Contacts\Provider1', $provider2]
+ ]));
+
+ $providers = $this->actionProviderStore->getProviders($user);
+
+ $this->assertCount(2, $providers);
+ $this->assertInstanceOf(EMailProvider::class, $providers[0]);
+ }
+
+ public function testGetProvidersOfAppWithIncompleInfo() {
+ $user = $this->createMock(IUser::class);
+ $provider1 = $this->createMock(EMailProvider::class);
+
+ $this->appManager->expects($this->once())
+ ->method('getEnabledAppsForUser')
+ ->with($user)
+ ->willReturn(['contacts']);
+ $this->appManager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('contacts')
+ ->willReturn([/* Empty info.xml */]);
+ $this->serverContainer->expects($this->once())
+ ->method('query')
+ ->will($this->returnValueMap([
+ [EMailProvider::class, $provider1],
]));
- $providers = $this->actionProviderStore->getProviders();
+ $providers = $this->actionProviderStore->getProviders($user);
$this->assertCount(1, $providers);
$this->assertInstanceOf(EMailProvider::class, $providers[0]);
@@ -70,13 +119,16 @@ class ActionProviderStoreTest extends TestCase {
* @expectedException Exception
*/
public function testGetProvidersWithQueryException() {
- $emailProvider = $this->createMock(EMailProvider::class);
- $detailsProvider = $this->createMock(DetailsProvider::class);
+ $user = $this->createMock(IUser::class);
+ $this->appManager->expects($this->once())
+ ->method('getEnabledAppsForUser')
+ ->with($user)
+ ->willReturn([]);
$this->serverContainer->expects($this->once())
->method('query')
->willThrowException(new QueryException());
- $providers = $this->actionProviderStore->getProviders();
+ $this->actionProviderStore->getProviders($user);
}
}
diff --git a/tests/lib/Contacts/ContactsMenu/ManagerTest.php b/tests/lib/Contacts/ContactsMenu/ManagerTest.php
index bcbcec96817..9b84bd76648 100644
--- a/tests/lib/Contacts/ContactsMenu/ManagerTest.php
+++ b/tests/lib/Contacts/ContactsMenu/ManagerTest.php
@@ -30,6 +30,7 @@ use OC\Contacts\ContactsMenu\Manager;
use OCP\App\IAppManager;
use OCP\Contacts\ContactsMenu\IEntry;
use OCP\Contacts\ContactsMenu\IProvider;
+use OCP\IUser;
use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
@@ -71,7 +72,7 @@ class ManagerTest extends TestCase {
public function testGetFilteredEntries() {
$filter = 'con';
- $user = 'user849';
+ $user = $this->createMock(IUser::class);
$entries = $this->generateTestEntries();
$provider = $this->createMock(IProvider::class);
$this->contactsStore->expects($this->once())
@@ -80,6 +81,7 @@ class ManagerTest extends TestCase {
->willReturn($entries);
$this->actionProviderStore->expects($this->once())
->method('getProviders')
+ ->with($user)
->willReturn([$provider]);
$provider->expects($this->exactly(25))
->method('process');