| Index: mash/login/login.cc
|
| diff --git a/mash/login/login.cc b/mash/login/login.cc
|
| index 1ae4e77ef79b442b939cb349aa03baf24e4a0ba5..e5c566b74b92d755839888fae2138b07c6cc99f2 100644
|
| --- a/mash/login/login.cc
|
| +++ b/mash/login/login.cc
|
| @@ -4,72 +4,203 @@
|
|
|
| #include "mash/login/login.h"
|
|
|
| +#include <map>
|
| +
|
| +#include "base/guid.h"
|
| #include "base/macros.h"
|
| -#include "mash/login/ui.h"
|
| -#include "mojo/public/cpp/bindings/strong_binding.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "components/mus/public/cpp/property_type_converters.h"
|
| +#include "components/mus/public/interfaces/user_access_manager.mojom.h"
|
| +#include "mash/init/public/interfaces/init.mojom.h"
|
| +#include "mash/login/public/interfaces/login.mojom.h"
|
| +#include "mash/wm/public/interfaces/container.mojom.h"
|
| +#include "mojo/public/cpp/bindings/binding_set.h"
|
| +#include "mojo/services/tracing/public/cpp/tracing_impl.h"
|
| #include "mojo/shell/public/cpp/connector.h"
|
| +#include "mojo/shell/public/cpp/shell_client.h"
|
| +#include "ui/views/background.h"
|
| +#include "ui/views/controls/button/label_button.h"
|
| #include "ui/views/mus/aura_init.h"
|
| +#include "ui/views/mus/native_widget_mus.h"
|
| #include "ui/views/mus/window_manager_connection.h"
|
| +#include "ui/views/widget/widget_delegate.h"
|
|
|
| namespace mash {
|
| namespace login {
|
| namespace {
|
|
|
| -class Login : public mojom::Login {
|
| +class Login;
|
| +
|
| +class UI : public views::WidgetDelegateView,
|
| + public views::ButtonListener {
|
| + public:
|
| + static void Show(mojo::Connector* connector, Login* login) {
|
| + UI* ui = new UI(login, connector);
|
| + ui->StartWindowManager();
|
| +
|
| + views::WindowManagerConnection::Create(connector);
|
| +
|
| + views::Widget* widget = new views::Widget;
|
| + views::Widget::InitParams params(
|
| + views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
| + params.delegate = ui;
|
| +
|
| + std::map<std::string, std::vector<uint8_t>> properties;
|
| + properties[mash::wm::mojom::kWindowContainer_Property] =
|
| + mojo::TypeConverter<const std::vector<uint8_t>, int32_t>::Convert(
|
| + static_cast<int32_t>(mash::wm::mojom::Container::LOGIN_WINDOWS));
|
| + mus::Window* window =
|
| + views::WindowManagerConnection::Get()->NewWindow(properties);
|
| + params.native_widget = new views::NativeWidgetMus(
|
| + widget, connector, window, mus::mojom::SurfaceType::DEFAULT);
|
| + widget->Init(params);
|
| + widget->Show();
|
| + }
|
| +
|
| + private:
|
| + UI(Login* login, mojo::Connector* connector)
|
| + : login_(login),
|
| + connector_(connector),
|
| + user_id_1_("00000000-0000-4000-8000-000000000000"),
|
| + user_id_2_("00000000-0000-4000-8000-000000000001"),
|
| + login_button_1_(
|
| + new views::LabelButton(this, base::ASCIIToUTF16("Timothy"))),
|
| + login_button_2_(
|
| + new views::LabelButton(this, base::ASCIIToUTF16("Jimothy"))) {
|
| + set_background(views::Background::CreateSolidBackground(SK_ColorRED));
|
| + login_button_1_->SetStyle(views::Button::STYLE_BUTTON);
|
| + login_button_2_->SetStyle(views::Button::STYLE_BUTTON);
|
| + AddChildView(login_button_1_);
|
| + AddChildView(login_button_2_);
|
| + }
|
| + ~UI() override {
|
| + // Prevent the window manager from restarting during graceful shutdown.
|
| + window_manager_connection_->SetConnectionLostClosure(base::Closure());
|
| + base::MessageLoop::current()->QuitWhenIdle();
|
| + }
|
| +
|
| + // Overridden from views::WidgetDelegate:
|
| + views::View* GetContentsView() override { return this; }
|
| + base::string16 GetWindowTitle() const override {
|
| + // TODO(beng): use resources.
|
| + return base::ASCIIToUTF16("Login");
|
| + }
|
| + void DeleteDelegate() override { delete this; }
|
| +
|
| + // Overridden from views::View:
|
| + void Layout() override {
|
| + gfx::Rect button_box = GetLocalBounds();
|
| + button_box.Inset(10, 10);
|
| +
|
| + gfx::Size ps1 = login_button_1_->GetPreferredSize();
|
| + gfx::Size ps2 = login_button_2_->GetPreferredSize();
|
| +
|
| + DCHECK(ps1.height() == ps2.height());
|
| +
|
| + // The 10 is inter-button spacing.
|
| + button_box.set_x((button_box.width() - ps1.width() - ps2.width() - 10) / 2);
|
| + button_box.set_y((button_box.height() - ps1.height()) / 2);
|
| +
|
| + login_button_1_->SetBounds(button_box.x(), button_box.y(), ps1.width(),
|
| + ps1.height());
|
| + login_button_2_->SetBounds(login_button_1_->bounds().right() + 10,
|
| + button_box.y(), ps2.width(), ps2.height());
|
| + }
|
| +
|
| + // Overridden from views::ButtonListener:
|
| + void ButtonPressed(views::Button* sender, const ui::Event& event) override;
|
| +
|
| + void StartWindowManager() {
|
| + window_manager_connection_ = connector_->Connect("mojo:desktop_wm");
|
| + window_manager_connection_->SetConnectionLostClosure(
|
| + base::Bind(&UI::StartWindowManager, base::Unretained(this)));
|
| + }
|
| +
|
| + Login* login_;
|
| + mojo::Connector* connector_;
|
| + const std::string user_id_1_;
|
| + const std::string user_id_2_;
|
| + views::LabelButton* login_button_1_;
|
| + views::LabelButton* login_button_2_;
|
| + scoped_ptr<mojo::Connection> window_manager_connection_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(UI);
|
| +};
|
| +
|
| +class Login : public mojo::ShellClient,
|
| + public mojo::InterfaceFactory<mojom::Login>,
|
| + public mojom::Login {
|
| public:
|
| - Login(mojo::Connector* connector,
|
| - LoginController* controller,
|
| - const std::string& user_id,
|
| - mojom::LoginRequest request)
|
| - : connector_(connector),
|
| - controller_(controller),
|
| - user_id_(user_id),
|
| - binding_(this, std::move(request)) {}
|
| + Login() {}
|
| ~Login() override {}
|
|
|
| + void LoginAs(const std::string& user_id) {
|
| + user_access_manager_->SetActiveUser(user_id);
|
| + mash::init::mojom::InitPtr init;
|
| + connector_->ConnectToInterface("mojo:mash_init", &init);
|
| + init->StartService("mojo:mash_shell", user_id);
|
| + }
|
| +
|
| private:
|
| + // mojo::ShellClient:
|
| + void Initialize(mojo::Connector* connector, const mojo::Identity& identity,
|
| + uint32_t id) override {
|
| + connector_ = connector;
|
| + tracing_.Initialize(connector, identity.name());
|
| +
|
| + aura_init_.reset(new views::AuraInit(connector, "views_mus_resources.pak"));
|
| +
|
| + connector_->ConnectToInterface("mojo:mus", &user_access_manager_);
|
| + user_access_manager_->SetActiveUser(identity.user_id());
|
| + }
|
| + bool AcceptConnection(mojo::Connection* connection) override {
|
| + connection->AddInterface<mojom::Login>(this);
|
| + return true;
|
| + }
|
| +
|
| + // mojo::InterfaceFactory<mojom::Login>:
|
| + void Create(mojo::Connection* connection,
|
| + mojom::LoginRequest request) override {
|
| + bindings_.AddBinding(this, std::move(request));
|
| + }
|
| +
|
| // mojom::Login:
|
| void ShowLoginUI() override {
|
| - UI::Show(connector_, controller_);
|
| + UI::Show(connector_, this);
|
| }
|
| void SwitchUser() override {
|
| - UI::Show(connector_, controller_);
|
| + UI::Show(connector_, this);
|
| }
|
|
|
| + void StartWindowManager();
|
| +
|
| mojo::Connector* connector_;
|
| - LoginController* controller_;
|
| - const std::string user_id_;
|
| - mojo::StrongBinding<mojom::Login> binding_;
|
| + mojo::TracingImpl tracing_;
|
| + scoped_ptr<views::AuraInit> aura_init_;
|
| + mojo::BindingSet<mojom::Login> bindings_;
|
| + mus::mojom::UserAccessManagerPtr user_access_manager_;
|
| + scoped_ptr<mojo::Connection> window_manager_connection_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Login);
|
| };
|
|
|
| -} // namespace
|
| -
|
| -LoginController::LoginController() {}
|
| -LoginController::~LoginController() {}
|
| -
|
| -void LoginController::Initialize(mojo::Connector* connector,
|
| - const mojo::Identity& identity,
|
| - uint32_t id) {
|
| - connector_ = connector;
|
| - login_user_id_ = identity.user_id();
|
| - tracing_.Initialize(connector, identity.name());
|
| -
|
| - aura_init_.reset(new views::AuraInit(connector, "views_mus_resources.pak"));
|
| +void UI::ButtonPressed(views::Button* sender, const ui::Event& event) {
|
| + // Login...
|
| + if (sender == login_button_1_) {
|
| + login_->LoginAs(user_id_1_);
|
| + } else if (sender == login_button_2_) {
|
| + login_->LoginAs(user_id_2_);
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| + GetWidget()->Close();
|
| }
|
|
|
| -bool LoginController::AcceptConnection(mojo::Connection* connection) {
|
| - if (connection->GetRemoteIdentity().name() == "mojo:mash_init")
|
| - connection->GetInterface(&init_);
|
| - connection->AddInterface<mojom::Login>(this);
|
| - return true;
|
| -}
|
| +} // namespace
|
|
|
| -void LoginController::Create(mojo::Connection* connection,
|
| - mojom::LoginRequest request) {
|
| - new Login(connector_, this, connection->GetRemoteIdentity().user_id(),
|
| - std::move(request));
|
| +mojo::ShellClient* CreateLogin() {
|
| + return new Login;
|
| }
|
|
|
| } // namespace login
|
|
|