Commit ba1b5893 authored by Reka Norman's avatar Reka Norman Committed by Commit Bot

[App Management] GetApps returns array of initial apps.

This CL changes the GetApps function of the app management PageHandler
to return the initial apps directly rather than calling onAppsAdded,
which simplifies initialisation of the ApiListener. It also changes
the onAppsAdded function to onAppAdded.

Bug: 906508
Change-Id: I649530920dfcce9d3998d9b2eda0320244ced15c
Reviewed-on: https://chromium-review.googlesource.com/c/1393587
Commit-Queue: Reka Norman <rekanorman@google.com>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarcalamity <calamity@chromium.org>
Cr-Commit-Position: refs/heads/master@{#619894}
parent 2eb9fbc9
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
cr.define('app_management.actions', function() { cr.define('app_management.actions', function() {
/** /**
* @param {Array<App>} apps * @param {App} app
*/ */
function addApps(apps) { function addApp(app) {
return { return {
name: 'add-apps', name: 'add-app',
apps: apps, app: app,
}; };
} }
...@@ -56,7 +56,7 @@ cr.define('app_management.actions', function() { ...@@ -56,7 +56,7 @@ cr.define('app_management.actions', function() {
} }
return { return {
addApps: addApps, addApp: addApp,
changeApp: changeApp, changeApp: changeApp,
removeApp: removeApp, removeApp: removeApp,
changePage: changePage, changePage: changePage,
......
...@@ -4,37 +4,22 @@ ...@@ -4,37 +4,22 @@
cr.define('app_management.ApiListener', function() { cr.define('app_management.ApiListener', function() {
let initialized = false; let initialized = false;
let initialListenerId; async function init() {
function init() {
assert(!initialized); assert(!initialized);
const callbackRouter = const {apps: initialApps} =
app_management.BrowserProxy.getInstance().callbackRouter; await app_management.BrowserProxy.getInstance().handler.getApps();
const initialState = app_management.util.createInitialState(initialApps);
initialListenerId =
callbackRouter.onAppsAdded.addListener(initialOnAppsAdded);
app_management.BrowserProxy.getInstance().handler.getApps();
initialized = true;
}
/**
* @param {!Array<App>} apps
*/
function initialOnAppsAdded(apps) {
const initialState = app_management.util.createInitialState(apps);
app_management.Store.getInstance().init(initialState); app_management.Store.getInstance().init(initialState);
const callbackRouter = const callbackRouter =
app_management.BrowserProxy.getInstance().callbackRouter; app_management.BrowserProxy.getInstance().callbackRouter;
callbackRouter.onAppsAdded.addListener(onAppsAdded); callbackRouter.onAppAdded.addListener(onAppAdded);
callbackRouter.onAppChanged.addListener(onAppChanged); callbackRouter.onAppChanged.addListener(onAppChanged);
callbackRouter.onAppRemoved.addListener(onAppRemoved); callbackRouter.onAppRemoved.addListener(onAppRemoved);
callbackRouter.removeListener(initialListenerId); initialized = true;
} }
/** /**
...@@ -45,10 +30,10 @@ cr.define('app_management.ApiListener', function() { ...@@ -45,10 +30,10 @@ cr.define('app_management.ApiListener', function() {
} }
/** /**
* @param {Array<App>} apps * @param {App} app
*/ */
function onAppsAdded(apps) { function onAppAdded(app) {
dispatch(app_management.actions.addApps(apps)); dispatch(app_management.actions.addApp(app));
} }
/** /**
......
...@@ -58,7 +58,7 @@ cr.define('app_management', function() { ...@@ -58,7 +58,7 @@ cr.define('app_management', function() {
} }
getApps() { getApps() {
this.page.onAppsAdded.dispatch_(this.apps_); return Promise.resolve({apps: this.apps_});
} }
/** /**
......
...@@ -17,12 +17,10 @@ cr.define('app_management', function() { ...@@ -17,12 +17,10 @@ cr.define('app_management', function() {
* @param {Object} action * @param {Object} action
* @return {AppMap} * @return {AppMap}
*/ */
AppState.addApps = function(apps, action) { AppState.addApp = function(apps, action) {
const newAppEntries = {}; const newAppEntry = {};
for (const app of action.apps) { newAppEntry[action.app.id] = action.app;
newAppEntries[app.id] = app; return Object.assign({}, apps, newAppEntry);
}
return Object.assign({}, apps, newAppEntries);
}; };
/** /**
...@@ -57,8 +55,8 @@ cr.define('app_management', function() { ...@@ -57,8 +55,8 @@ cr.define('app_management', function() {
*/ */
AppState.updateApps = function(apps, action) { AppState.updateApps = function(apps, action) {
switch (action.name) { switch (action.name) {
case 'add-apps': case 'add-app':
return AppState.addApps(apps, action); return AppState.addApp(apps, action);
case 'change-app': case 'change-app':
return AppState.changeApp(apps, action); return AppState.changeApp(apps, action);
case 'remove-app': case 'remove-app':
......
...@@ -27,12 +27,12 @@ interface PageHandlerFactory { ...@@ -27,12 +27,12 @@ interface PageHandlerFactory {
// Browser interface. // Browser interface.
interface PageHandler { interface PageHandler {
GetApps(); GetApps() => (array<App> apps);
}; };
// Frontend interface. // Frontend interface.
interface Page { interface Page {
OnAppsAdded(array<App> apps); OnAppAdded(App app);
OnAppChanged(App update); OnAppChanged(App update);
OnAppRemoved(string app_id); OnAppRemoved(string app_id);
}; };
......
...@@ -12,6 +12,18 @@ ...@@ -12,6 +12,18 @@
#include "chrome/services/app_service/public/cpp/app_registry_cache.h" #include "chrome/services/app_service/public/cpp/app_registry_cache.h"
#include "chrome/services/app_service/public/mojom/types.mojom.h" #include "chrome/services/app_service/public/mojom/types.mojom.h"
namespace {
app_management::mojom::AppPtr CreateUIAppPtr(const apps::AppUpdate& update) {
return app_management::mojom::App::New(
update.AppId(), update.AppType(), update.Name(),
base::nullopt /*description*/,
apps::mojom::OptionalBool::kUnknown /*is_pinned*/,
base::nullopt /*version*/, base::nullopt /*size*/);
}
} // namespace
AppManagementPageHandler::AppManagementPageHandler( AppManagementPageHandler::AppManagementPageHandler(
app_management::mojom::PageHandlerRequest request, app_management::mojom::PageHandlerRequest request,
app_management::mojom::PagePtr page, app_management::mojom::PagePtr page,
...@@ -22,7 +34,7 @@ AppManagementPageHandler::AppManagementPageHandler( ...@@ -22,7 +34,7 @@ AppManagementPageHandler::AppManagementPageHandler(
AppManagementPageHandler::~AppManagementPageHandler() {} AppManagementPageHandler::~AppManagementPageHandler() {}
void AppManagementPageHandler::GetApps() { void AppManagementPageHandler::GetApps(GetAppsCallback callback) {
apps::AppServiceProxy* proxy = apps::AppServiceProxy::Get(profile_); apps::AppServiceProxy* proxy = apps::AppServiceProxy::Get(profile_);
// TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
...@@ -32,13 +44,12 @@ void AppManagementPageHandler::GetApps() { ...@@ -32,13 +44,12 @@ void AppManagementPageHandler::GetApps() {
std::vector<app_management::mojom::AppPtr> apps; std::vector<app_management::mojom::AppPtr> apps;
proxy->Cache().ForEachApp([&apps](const apps::AppUpdate& update) { proxy->Cache().ForEachApp([&apps](const apps::AppUpdate& update) {
apps.push_back(app_management::mojom::App::New( apps.push_back(CreateUIAppPtr(update));
update.AppId(), update.AppType(), update.Name(),
base::nullopt /*description*/,
apps::mojom::OptionalBool::kUnknown /*is_pinned*/,
base::nullopt /*version*/, base::nullopt /*size*/));
}); });
page_->OnAppsAdded(std::move(apps));
Observe(&proxy->Cache());
std::move(callback).Run(std::move(apps));
} }
void AppManagementPageHandler::OnAppUpdate(const apps::AppUpdate& update) { void AppManagementPageHandler::OnAppUpdate(const apps::AppUpdate& update) {
...@@ -48,9 +59,10 @@ void AppManagementPageHandler::OnAppUpdate(const apps::AppUpdate& update) { ...@@ -48,9 +59,10 @@ void AppManagementPageHandler::OnAppUpdate(const apps::AppUpdate& update) {
return; return;
} }
page_->OnAppChanged(app_management::mojom::App::New( if (update.ReadinessChanged() &&
update.AppId(), update.AppType(), update.Name(), update.Readiness() == apps::mojom::Readiness::kReady) {
base::nullopt /*description*/, page_->OnAppAdded(CreateUIAppPtr(update));
apps::mojom::OptionalBool::kUnknown /*is_pinned*/, } else {
base::nullopt /*version*/, base::nullopt /*size*/)); page_->OnAppChanged(CreateUIAppPtr(update));
}
} }
...@@ -25,7 +25,7 @@ class AppManagementPageHandler : public app_management::mojom::PageHandler, ...@@ -25,7 +25,7 @@ class AppManagementPageHandler : public app_management::mojom::PageHandler,
~AppManagementPageHandler() override; ~AppManagementPageHandler() override;
// app_management::mojom::PageHandler: // app_management::mojom::PageHandler:
void GetApps() override; void GetApps(GetAppsCallback callback) override;
private: private:
// apps::AppRegistryCache::Observer overrides: // apps::AppRegistryCache::Observer overrides:
......
...@@ -3,11 +3,9 @@ ...@@ -3,11 +3,9 @@
// found in the LICENSE file. // found in the LICENSE file.
suite('<app-management-app>', function() { suite('<app-management-app>', function() {
test('loads', function(done) { test('loads', async function() {
app_management.BrowserProxy.getInstance().handler.getApps(); // Check that the browser responds to the getApps() message.
const {apps: initialApps} =
let callbackRouter = await app_management.BrowserProxy.getInstance().handler.getApps();
app_management.BrowserProxy.getInstance().callbackRouter;
callbackRouter.onAppsAdded.addListener(() => done());
}); });
}); });
...@@ -41,9 +41,15 @@ suite('<app-management-main-view>', function() { ...@@ -41,9 +41,15 @@ suite('<app-management-main-view>', function() {
return apps; return apps;
} }
function addApps(apps) {
for (const app of apps) {
callbackRouterProxy.onAppAdded(app);
}
}
test('simple app addition', async function() { test('simple app addition', async function() {
let apps = createTestApps(1); let apps = createTestApps(1);
callbackRouterProxy.onAppsAdded(apps); addApps(apps);
await callbackRouterProxy.flushForTesting(); await callbackRouterProxy.flushForTesting();
let appItems = mainView.root.querySelectorAll('app-management-item'); let appItems = mainView.root.querySelectorAll('app-management-item');
expectEquals(1, appItems.length); expectEquals(1, appItems.length);
...@@ -58,14 +64,14 @@ suite('<app-management-main-view>', function() { ...@@ -58,14 +64,14 @@ suite('<app-management-main-view>', function() {
expectTrue(mainView.$['expander-row'].hidden); expectTrue(mainView.$['expander-row'].hidden);
// The more apps bar shouldn't appear when there are 4 apps. // The more apps bar shouldn't appear when there are 4 apps.
callbackRouterProxy.onAppsAdded(createTestApps(4)); addApps(createTestApps(4));
await callbackRouterProxy.flushForTesting(); await callbackRouterProxy.flushForTesting();
expectEquals( expectEquals(
4, mainView.root.querySelectorAll('app-management-item').length); 4, mainView.root.querySelectorAll('app-management-item').length);
expectTrue(mainView.$['expander-row'].hidden); expectTrue(mainView.$['expander-row'].hidden);
// The more apps bar appears when there are 5 apps. // The more apps bar appears when there are 5 apps.
callbackRouterProxy.onAppsAdded(createTestApps(1)); addApps(createTestApps(1));
await callbackRouterProxy.flushForTesting(); await callbackRouterProxy.flushForTesting();
expectEquals( expectEquals(
5, mainView.root.querySelectorAll('app-management-item').length); 5, mainView.root.querySelectorAll('app-management-item').length);
......
...@@ -25,20 +25,16 @@ suite('app state', function() { ...@@ -25,20 +25,16 @@ suite('app state', function() {
]); ]);
}); });
test('updates when apps are added', function() { test('updates when an app is added', function() {
appsToAdd = [ const newApp = createApp('3', {type: 1, title: 'a'});
createApp('3', {type: 1, title: 'a'}),
createApp('4'),
];
action = app_management.actions.addApps(appsToAdd); action = app_management.actions.addApp(newApp);
apps = app_management.AppState.updateApps(apps, action); apps = app_management.AppState.updateApps(apps, action);
// Check that apps contains a key for each app id. // Check that apps contains a key for each app id.
assertTrue(!!apps['1']); assertTrue(!!apps['1']);
assertTrue(!!apps['2']); assertTrue(!!apps['2']);
assertTrue(!!apps['3']); assertTrue(!!apps['3']);
assertTrue(!!apps['4']);
// Check that id corresponds to the right app. // Check that id corresponds to the right app.
const app = apps['3']; const app = apps['3'];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment