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

Unified Diff: athena/system/power_button_controller.cc

Issue 659923002: Revert of Intorduce PowerButtonObserver API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
« no previous file with comments | « athena/system/power_button_controller.h ('k') | athena/system/shutdown_dialog.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: athena/system/power_button_controller.cc
diff --git a/athena/system/power_button_controller.cc b/athena/system/power_button_controller.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e1105b90e9ad458f4816dfc5d525aa5e4247813d
--- /dev/null
+++ b/athena/system/power_button_controller.cc
@@ -0,0 +1,126 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "athena/system/power_button_controller.h"
+
+#include "athena/screen/public/screen_manager.h"
+#include "athena/strings/grit/athena_strings.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/font_list.h"
+#include "ui/views/background.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/widget/widget.h"
+
+namespace athena {
+namespace {
+
+// The amount of time that the power button must be held to show the shutdown
+// warning dialog.
+const int kShowShutdownWarningTimeoutMs = 1000;
+
+// The amount of time that the power button must be held to shut down the
+// device.
+const int kShutdownTimeoutMs = 5000;
+
+} // namespace
+
+PowerButtonController::PowerButtonController(aura::Window* dialog_container)
+ : warning_message_container_(dialog_container),
+ brightness_is_zero_(false),
+ state_(STATE_OTHER) {
+ chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
+ this);
+}
+
+PowerButtonController::~PowerButtonController() {
+ chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
+ this);
+}
+
+void PowerButtonController::ShowShutdownWarningDialog() {
+ state_ = STATE_SHUTDOWN_WARNING_VISIBLE;
+
+ shutdown_warning_message_.reset(new views::Widget);
+
+ views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
+ params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.parent = warning_message_container_;
+ shutdown_warning_message_->Init(params);
+
+ views::Label* label =
+ new views::Label(l10n_util::GetStringUTF16(IDS_ATHENA_SHUTDOWN_WARNING));
+ label->SetBackgroundColor(SK_ColorWHITE);
+ label->SetFontList(gfx::FontList().DeriveWithStyle(gfx::Font::BOLD));
+
+ views::View* container = new views::View;
+ container->AddChildView(label);
+
+ const int kBorderSpacing = 50;
+ container->SetLayoutManager(new views::BoxLayout(
+ views::BoxLayout::kHorizontal, kBorderSpacing, kBorderSpacing, 0));
+ container->set_background(
+ views::Background::CreateSolidBackground(SK_ColorWHITE));
+ container->SetBorder(views::Border::CreateSolidBorder(1, SK_ColorBLACK));
+
+ shutdown_warning_message_->SetContentsView(container);
+ shutdown_warning_message_->CenterWindow(container->GetPreferredSize());
+ shutdown_warning_message_->Show();
+
+ timer_.Start(FROM_HERE,
+ base::TimeDelta::FromMilliseconds(kShutdownTimeoutMs -
+ kShowShutdownWarningTimeoutMs),
+ this,
+ &PowerButtonController::Shutdown);
+}
+
+void PowerButtonController::Shutdown() {
+ state_ = STATE_SHUTDOWN_REQUESTED;
+ chromeos::DBusThreadManager::Get()
+ ->GetPowerManagerClient()
+ ->RequestShutdown();
+}
+
+void PowerButtonController::BrightnessChanged(int level, bool user_initiated) {
+ if (brightness_is_zero_)
+ zero_brightness_end_time_ = base::TimeTicks::Now();
+ brightness_is_zero_ = (level == 0);
+}
+
+void PowerButtonController::PowerButtonEventReceived(
+ bool down,
+ const base::TimeTicks& timestamp) {
+ if (state_ == STATE_SHUTDOWN_REQUESTED)
+ return;
+
+ // Avoid requesting suspend or shutdown if the power button is pressed while
+ // the screen is off (http://crbug.com/128451).
+ base::TimeDelta time_since_zero_brightness = brightness_is_zero_ ?
+ base::TimeDelta() : (base::TimeTicks::Now() - zero_brightness_end_time_);
+ const int kShortTimeMs = 10;
+ if (time_since_zero_brightness.InMilliseconds() <= kShortTimeMs)
+ return;
+
+ if (down) {
+ state_ = STATE_SUSPEND_ON_RELEASE;
+ timer_.Start(
+ FROM_HERE,
+ base::TimeDelta::FromMilliseconds(kShowShutdownWarningTimeoutMs),
+ this,
+ &PowerButtonController::ShowShutdownWarningDialog);
+ } else {
+ if (state_ == STATE_SUSPEND_ON_RELEASE) {
+ chromeos::DBusThreadManager::Get()
+ ->GetPowerManagerClient()
+ ->RequestSuspend();
+ }
+ state_ = STATE_OTHER;
+ timer_.Stop();
+ shutdown_warning_message_.reset();
+ }
+}
+
+} // namespace athena
« no previous file with comments | « athena/system/power_button_controller.h ('k') | athena/system/shutdown_dialog.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698