forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Windows and notifications are hidden during first-run tutorial.
Windows are hidden by hiding kShellWindowId_DefaultContainer and kShellWindowId_AlwaysOnTopContainer. NotificationBlocker used for hiding notifications. BUG=269286 TEST=ash_unittests --gtest_filter=FirstRunHelperTest* Review URL: https://codereview.chromium.org/99673003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@240436 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
dzhioev@chromium.org
committed
Dec 12, 2013
1 parent
1cbf5e5
commit a5c7880
Showing
13 changed files
with
382 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
// Copyright 2013 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 "ash/first_run/desktop_cleaner.h" | ||
|
||
#include "ash/shell.h" | ||
#include "ash/shell_window_ids.h" | ||
#include "ui/aura/root_window.h" | ||
#include "ui/aura/window_observer.h" | ||
#include "ui/compositor/scoped_layer_animation_settings.h" | ||
#include "ui/message_center/message_center.h" | ||
#include "ui/message_center/notification_blocker.h" | ||
|
||
namespace ash { | ||
namespace internal { | ||
|
||
namespace { | ||
|
||
const int kContainerIdsToHide[] = { | ||
kShellWindowId_DefaultContainer, | ||
kShellWindowId_AlwaysOnTopContainer, | ||
kShellWindowId_PanelContainer, | ||
// TODO(dzhioev): uncomment this when issue with BrowserView::CanActivate | ||
// will be fixed. | ||
// kShellWindowId_SystemModalContainer | ||
}; | ||
|
||
} // namespace | ||
|
||
class ContainerHider : public aura::WindowObserver, | ||
public ui::ImplicitAnimationObserver { | ||
public: | ||
explicit ContainerHider(aura::Window* container) | ||
: container_was_hidden_(!container->IsVisible()), | ||
container_(container) { | ||
if (container_was_hidden_) | ||
return; | ||
ui::Layer* layer = container_->layer(); | ||
ui::ScopedLayerAnimationSettings animation_settings(layer->GetAnimator()); | ||
animation_settings.AddObserver(this); | ||
layer->SetOpacity(0.0); | ||
} | ||
|
||
virtual ~ContainerHider() { | ||
if (container_was_hidden_ || !container_) | ||
return; | ||
if (!WasAnimationCompletedForProperty(ui::LayerAnimationElement::OPACITY)) { | ||
// We are in the middle of animation. | ||
StopObservingImplicitAnimations(); | ||
} else { | ||
container_->Show(); | ||
} | ||
ui::Layer* layer = container_->layer(); | ||
ui::ScopedLayerAnimationSettings animation_settings(layer->GetAnimator()); | ||
layer->SetOpacity(1.0); | ||
} | ||
|
||
private: | ||
// Overriden from ui::ImplicitAnimationObserver. | ||
virtual void OnImplicitAnimationsCompleted() OVERRIDE { | ||
container_->Hide(); | ||
} | ||
|
||
// Overriden from aura::WindowObserver. | ||
virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { | ||
DCHECK(window == container_); | ||
container_ = NULL; | ||
} | ||
|
||
const bool container_was_hidden_; | ||
aura::Window* container_; | ||
|
||
DISALLOW_COPY_AND_ASSIGN(ContainerHider); | ||
}; | ||
|
||
class NotificationBlocker : public message_center::NotificationBlocker { | ||
public: | ||
NotificationBlocker() | ||
: message_center::NotificationBlocker( | ||
message_center::MessageCenter::Get()) { | ||
NotifyBlockingStateChanged(); | ||
} | ||
|
||
virtual ~NotificationBlocker() {}; | ||
|
||
private: | ||
// Overriden from message_center::NotificationBlocker. | ||
virtual bool ShouldShowNotificationAsPopup( | ||
const message_center::NotifierId& notifier_id) const OVERRIDE { | ||
return false; | ||
} | ||
|
||
DISALLOW_COPY_AND_ASSIGN(NotificationBlocker); | ||
}; | ||
|
||
DesktopCleaner::DesktopCleaner() { | ||
// TODO(dzhioev): Add support for secondary displays. | ||
aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); | ||
for (size_t i = 0; i < arraysize(kContainerIdsToHide); ++i) { | ||
aura::Window* container = | ||
Shell::GetContainer(root_window, kContainerIdsToHide[i]); | ||
container_hiders_.push_back(make_linked_ptr(new ContainerHider(container))); | ||
} | ||
notification_blocker_.reset(new NotificationBlocker()); | ||
} | ||
|
||
DesktopCleaner::~DesktopCleaner() {} | ||
|
||
// static | ||
std::vector<int> DesktopCleaner::GetContainersToHideForTest() { | ||
return std::vector<int>(kContainerIdsToHide, | ||
kContainerIdsToHide + arraysize(kContainerIdsToHide)); | ||
} | ||
|
||
} // namespace internal | ||
} // namespace ash | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// Copyright 2013 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. | ||
|
||
#ifndef ASH_FIRST_RUN_DESKTOP_CLEANER_ | ||
#define ASH_FIRST_RUN_DESKTOP_CLEANER_ | ||
|
||
#include <vector> | ||
|
||
#include "ash/ash_export.h" | ||
#include "base/basictypes.h" | ||
#include "base/memory/linked_ptr.h" | ||
#include "base/memory/scoped_ptr.h" | ||
|
||
namespace ash { | ||
|
||
namespace test { | ||
class FirstRunHelperTest; | ||
} | ||
|
||
namespace internal { | ||
|
||
class ContainerHider; | ||
class NotificationBlocker; | ||
|
||
// Class used to "clean" ash desktop, i.e. hide all windows and notifications. | ||
class ASH_EXPORT DesktopCleaner { | ||
public: | ||
DesktopCleaner(); | ||
~DesktopCleaner(); | ||
|
||
private: | ||
// Returns the list of containers that DesctopCleaner hides. | ||
static std::vector<int> GetContainersToHideForTest(); | ||
|
||
std::vector<linked_ptr<ContainerHider> > container_hiders_; | ||
scoped_ptr<NotificationBlocker> notification_blocker_; | ||
|
||
friend class ash::test::FirstRunHelperTest; | ||
DISALLOW_COPY_AND_ASSIGN(DesktopCleaner); | ||
}; | ||
|
||
} // namespace internal | ||
} // namespace ash | ||
|
||
#endif // ASH_FIRST_RUN_DESKTOP_CLEANER_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.