Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: chromeos/dbus/arc_bridge_client.cc

Issue 1413153007: arc-app-launcher: Minimal support for ARC app launcher. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/dbus/arc_bridge_client.cc
diff --git a/chromeos/dbus/arc_bridge_client.cc b/chromeos/dbus/arc_bridge_client.cc
index 584e10bc5e9557ba763b401deb6f66883739200a..b78c697cf9c3cf725f5b42d3a7f3bfed12f6f41b 100644
--- a/chromeos/dbus/arc_bridge_client.cc
+++ b/chromeos/dbus/arc_bridge_client.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "dbus/object_path.h"
@@ -22,6 +23,11 @@ const char kArcBridgeServiceName[] = "org.chromium.arc";
const char kArcBridgeServiceInterface[] = "org.chromium.arc";
const char kPingMethod[] = "Ping";
+const char kAppLauncherReadySignal[] = "AppLauncherReady";
+const char kAppReadySignal[] = "AppLauncherAppReady";
+const char kAppsRefreshedSignal[] = "AppLauncherAppsRefreshed";
+const char kRefreshAppsMethod[] = "RefreshApps";
+const char kLaunchAppMethod[] = "LaunchApp";
void OnVoidDBusMethod(const VoidDBusMethodCallback& callback,
dbus::Response* response) {
@@ -43,20 +49,125 @@ class ArcBridgeClientImpl : public ArcBridgeClient {
base::Bind(&OnVoidDBusMethod, callback));
}
+ void Refresh() override {
+ dbus::MethodCall method_call(kArcBridgeServiceInterface,
+ kRefreshAppsMethod);
+ DCHECK(proxy_);
+ proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ dbus::ObjectProxy::EmptyResponseCallback());
+ }
+
+ void LaunchApp(const std::string& package,
+ const std::string& activity) override {
+ dbus::MethodCall method_call(kArcBridgeServiceInterface, kLaunchAppMethod);
+ dbus::MessageWriter writer(&method_call);
+ writer.AppendString(package);
+ writer.AppendString(activity);
+ DCHECK(proxy_);
+ proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ dbus::ObjectProxy::EmptyResponseCallback());
+ }
+
+ void AddAppObserver(AppObserver* observer) override {
+ app_observers_.AddObserver(observer);
+ }
+
+ void RemoveAppObserver(AppObserver* observer) override {
+ app_observers_.RemoveObserver(observer);
+ }
+
protected:
void Init(dbus::Bus* bus) override {
proxy_ = bus->GetObjectProxy(kArcBridgeServiceName,
dbus::ObjectPath(kArcBridgeServicePath));
DCHECK(proxy_);
+
+ proxy_->ConnectToSignal(
+ kArcBridgeServiceInterface, kAppLauncherReadySignal,
+ base::Bind(&ArcBridgeClientImpl::AppLauncherReadyReceived,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&ArcBridgeClientImpl::AppLauncherReadyConnected,
+ weak_ptr_factory_.GetWeakPtr()));
+
+ proxy_->ConnectToSignal(kArcBridgeServiceInterface, kAppReadySignal,
+ base::Bind(&ArcBridgeClientImpl::AppReadyReceived,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&ArcBridgeClientImpl::AppReadyConnected,
+ weak_ptr_factory_.GetWeakPtr()));
+
+ proxy_->ConnectToSignal(
+ kArcBridgeServiceInterface, kAppsRefreshedSignal,
+ base::Bind(&ArcBridgeClientImpl::AppsRefreshedReceived,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&ArcBridgeClientImpl::AppsRefreshedConnected,
+ weak_ptr_factory_.GetWeakPtr()));
}
private:
dbus::ObjectProxy* proxy_;
+ base::ObserverList<AppObserver> app_observers_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<ArcBridgeClientImpl> weak_ptr_factory_;
+ void AppLauncherReadyReceived(dbus::Signal* signal) { Refresh(); }
+
+ // Called when the TimeUpdated signal is initially connected.
+ void AppLauncherReadyConnected(const std::string& interface_name,
+ const std::string& signal_name,
+ bool success) {}
+
+ bool ReadAppInfo(dbus::MessageReader& reader, AppInfo& app) {
+ size_t icon_size;
+ const uint8* icon_data;
+ if (!reader.PopString(&app.name) || !reader.PopString(&app.package) ||
+ !reader.PopArrayOfBytes(&icon_data, &icon_size)) {
+ return false;
+ }
+
+ if (icon_size) {
+ app.icon.resize(icon_size);
+ memcpy(&app.icon[0], icon_data, icon_size);
+ }
+
+ return true;
+ }
+
+ void AppReadyReceived(dbus::Signal* signal) {
+ AppInfo app;
+ dbus::MessageReader reader(signal);
+ if (!ReadAppInfo(reader, app)) {
+ return;
+ }
+
+ FOR_EACH_OBSERVER(AppObserver, app_observers_, OnAppReady(app));
+ }
+
+ void AppReadyConnected(const std::string& interface_name,
+ const std::string& signal_name,
+ bool success) {}
+
+ void AppsRefreshedReceived(dbus::Signal* signal) {
+ dbus::MessageReader reader(signal);
+ uint32 app_count;
+ if (!reader.PopUint32(&app_count)) {
+ return;
+ }
+ std::vector<AppInfo> apps(app_count);
+ for (uint32 i = 0; i < app_count; ++i) {
+ if (!ReadAppInfo(reader, apps[i])) {
+ return;
+ }
+ }
+
+ FOR_EACH_OBSERVER(AppObserver, app_observers_, OnAppsRefreshed(apps));
+ }
+
+ void AppsRefreshedConnected(const std::string& interface_name,
+ const std::string& signal_name,
+ bool success) {}
+
DISALLOW_COPY_AND_ASSIGN(ArcBridgeClientImpl);
};
@@ -74,4 +185,8 @@ ArcBridgeClient* ArcBridgeClient::Create() {
return new ArcBridgeClientImpl();
}
+ArcBridgeClient::AppInfo::AppInfo() {}
+
+ArcBridgeClient::AppInfo::~AppInfo() {}
+
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698