Commit 82423eec authored by rkc@chromium.org's avatar rkc@chromium.org

Change the login flow for kiosk mode.

Instead of showing the demo user UI, show the screensaver directly. On going active, the user gets dropped into a demo user session directly (see bug for details). Additionally removed the Lock Screen and Shutdown options from the wrench menu model for ChromeOS.

tbarzic@ - main review
sky@ - owners review for chrome/browser/ui/toolbar/wrench_menu_model_chromeos.cc

R=tbarzic@chromium.org,sky@chromium.org
BUG=chromium-os:26041,chromium-os:27543
TEST=Ran unit tests, tested with kiosk-mode flags and tested with giving an invalid screensaver to test the fallback flow.

Review URL: https://chromiumcodereview.appspot.com/9695029

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126736 0039d316-1c4b-4281-b951-d872f2087c98
parent a489f478
......@@ -9,6 +9,7 @@
#include "base/logging.h"
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_helper.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/ui/screensaver_extension_dialog.h"
#include "chrome/common/chrome_notification_types.h"
......@@ -37,7 +38,7 @@ void KioskModeScreensaver::Setup() {
// We should NOT be created if already logged in.
CHECK(!chromeos::UserManager::Get()->IsUserLoggedIn());
registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_CHANGED,
registrar_.Add(this, chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources());
// We will register ourselves now and unregister if a user logs in.
......@@ -46,10 +47,11 @@ void KioskModeScreensaver::Setup() {
if (!power_manager->HasObserver(this))
power_manager->AddObserver(this);
// Register for the next Idle for kScreensaverIdleTimeout event.
// We need to disappear and login the demo user if we go active.
chromeos::DBusThreadManager::Get()->
GetPowerManagerClient()->RequestIdleNotification(
chromeos::KioskModeHelper::Get()->GetScreensaverTimeout() * 1000);
GetPowerManagerClient()->RequestActiveNotification();
browser::ShowScreensaverDialog();
}
// NotificationObserver overrides:
......@@ -57,31 +59,30 @@ void KioskModeScreensaver::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
DCHECK_EQ(type, chrome::NOTIFICATION_LOGIN_USER_CHANGED);
DCHECK_EQ(type, chrome::NOTIFICATION_SESSION_STARTED);
// User logged in, remove our observers, screensaver will be deactivated.
chromeos::PowerManagerClient* power_manager =
chromeos::DBusThreadManager::Get()->GetPowerManagerClient();
if (power_manager->HasObserver(this))
power_manager->RemoveObserver(this);
browser::CloseScreensaverDialog();
ShutdownKioskModeScreensaver();
}
void KioskModeScreensaver::IdleNotify(int64 threshold) {
// We're idle; close screensaver when we go active.
chromeos::DBusThreadManager::Get()->
GetPowerManagerClient()->RequestActiveNotification();
browser::ShowScreensaverDialog();
}
void KioskModeScreensaver::ActiveNotify() {
browser::CloseScreensaverDialog();
// User is active, log us in.
ExistingUserController* controller =
ExistingUserController::current_controller();
// Request notification for Idle so we can start up the screensaver.
chromeos::DBusThreadManager::Get()->
GetPowerManagerClient()->RequestIdleNotification(
chromeos::KioskModeHelper::Get()->GetScreensaverTimeout() * 1000);}
if (controller)
// Logging in will shut us down, removing the screen saver.
controller->LoginAsDemoUser();
else
// Remove the screensaver so the user can at least use the underlying
// login screen to be able to log in.
browser::CloseScreensaverDialog();
}
static KioskModeScreensaver* g_kiosk_mode_screensaver = NULL;
......
......@@ -28,7 +28,6 @@ class KioskModeScreensaver : public PowerManagerClient::Observer,
const content::NotificationDetails& details) OVERRIDE;
// PowerManagerClient::Observer overrides:
virtual void IdleNotify(int64 threshold) OVERRIDE;
virtual void ActiveNotify() OVERRIDE;
private:
......
......@@ -41,7 +41,7 @@ class KioskModeScreensaverTest : public testing::Test {
bool LoginUserObserverRegistered() {
return screensaver_->registrar_.IsRegistered(
screensaver_,
chrome::NOTIFICATION_LOGIN_USER_CHANGED,
chrome::NOTIFICATION_SESSION_STARTED,
content::NotificationService::AllSources());
}
......@@ -65,11 +65,8 @@ TEST_F(KioskModeScreensaverTest, CheckObservers) {
TEST_F(KioskModeScreensaverTest, CheckObserversAfterUserLogin) {
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_LOGIN_USER_CHANGED,
chrome::NOTIFICATION_SESSION_STARTED,
content::Source<UserManager>(UserManager::Get()),
// Ideally this should be the user logged in, but since we won't really be
// checking for the current logged in user in our observer anyway, giving
// NoDetails here is fine.
content::NotificationService::NoDetails());
EXPECT_FALSE(PowerManagerObserverRegistered());
......
......@@ -7,6 +7,7 @@
#include "base/command_line.h"
#include "base/i18n/number_formatting.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "chrome/common/chrome_switches.h"
#include "grit/chromium_strings.h"
......@@ -72,11 +73,13 @@ void WrenchMenuModel::Build() {
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession)) {
AddItemWithStringId(IDC_EXIT, IDS_EXIT_GUEST_MODE);
AddItemWithStringId(IDC_SHUTDOWN, IDS_SHUTDOWN_BUTTON);
} else if (chromeos::UserManager::Get()->IsLoggedInAsDemoUser()) {
AddItemWithStringId(IDC_EXIT, IDS_SIGN_OUT);
} else {
AddItemWithStringId(IDC_LOCK_SCREEN, IDS_LOCK_SCREEN);
AddItemWithStringId(IDC_EXIT, IDS_SIGN_OUT);
AddItemWithStringId(IDC_SHUTDOWN, IDS_SHUTDOWN_BUTTON);
}
AddItemWithStringId(IDC_SHUTDOWN, IDS_SHUTDOWN_BUTTON);
}
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