athena: Expose the list of activities from the ActivityManager.

Notable implementation details of the change:
. Have ActivityManagerImpl observer each aura::Window of the activities, and
  update order of the activities when their windows are restacked.
. Introduce ActivityManagerObserver::OnActivityOrderChanged().
. Remove the code from ResourceManagerImpl that tracks the activity order, and
  replace it to get the list from ActivityManager instead.
  - Make sure the code traverses the activities in the correct order.

BUG=413928
R=oshima@chromium.org, skuhne@chromium.org

Review URL: https://codereview.chromium.org/694353004

Cr-Commit-Position: refs/heads/master@{#302574}
parent 395b6533
...@@ -6,4 +6,5 @@ include_rules = [ ...@@ -6,4 +6,5 @@ include_rules = [
"+ui/base", "+ui/base",
"+ui/gfx", "+ui/gfx",
"+ui/views", "+ui/views",
"+ui/wm",
] ]
...@@ -10,9 +10,12 @@ ...@@ -10,9 +10,12 @@
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_manager_observer.h" #include "athena/activity/public/activity_manager_observer.h"
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "athena/screen/public/screen_manager.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "ui/aura/window.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
#include "ui/wm/public/activation_client.h"
namespace athena { namespace athena {
...@@ -46,9 +49,16 @@ views::Widget* GetWidget(Activity* activity) { ...@@ -46,9 +49,16 @@ views::Widget* GetWidget(Activity* activity) {
ActivityManagerImpl::ActivityManagerImpl() { ActivityManagerImpl::ActivityManagerImpl() {
CHECK(!instance); CHECK(!instance);
instance = this; instance = this;
aura::Window* root_window =
ScreenManager::Get()->GetContext()->GetRootWindow();
aura::client::GetActivationClient(root_window)->AddObserver(this);
} }
ActivityManagerImpl::~ActivityManagerImpl() { ActivityManagerImpl::~ActivityManagerImpl() {
aura::Window* root_window =
ScreenManager::Get()->GetContext()->GetRootWindow();
aura::client::GetActivationClient(root_window)->RemoveObserver(this);
while (!activities_.empty()) while (!activities_.empty())
Activity::Delete(activities_.front()); Activity::Delete(activities_.front());
...@@ -59,9 +69,9 @@ ActivityManagerImpl::~ActivityManagerImpl() { ...@@ -59,9 +69,9 @@ ActivityManagerImpl::~ActivityManagerImpl() {
void ActivityManagerImpl::AddActivity(Activity* activity) { void ActivityManagerImpl::AddActivity(Activity* activity) {
CHECK(activities_.end() == CHECK(activities_.end() ==
std::find(activities_.begin(), activities_.end(), activity)); std::find(activities_.begin(), activities_.end(), activity));
activities_.push_back(activity); activities_.insert(activities_.begin(), activity);
views::Widget* widget = CreateWidget(activity); views::Widget* widget = CreateWidget(activity);
widget->AddObserver(this); widget->GetNativeView()->AddObserver(this);
FOR_EACH_OBSERVER(ActivityManagerObserver, FOR_EACH_OBSERVER(ActivityManagerObserver,
observers_, observers_,
OnActivityStarted(activity)); OnActivityStarted(activity));
...@@ -76,7 +86,7 @@ void ActivityManagerImpl::RemoveActivity(Activity* activity) { ...@@ -76,7 +86,7 @@ void ActivityManagerImpl::RemoveActivity(Activity* activity) {
ActivityManagerObserver, observers_, OnActivityEnding(activity)); ActivityManagerObserver, observers_, OnActivityEnding(activity));
activities_.erase(find); activities_.erase(find);
views::Widget* widget = GetWidget(activity); views::Widget* widget = GetWidget(activity);
widget->RemoveObserver(this); widget->GetNativeView()->RemoveObserver(this);
widget->Close(); widget->Close();
} }
} }
...@@ -87,6 +97,10 @@ void ActivityManagerImpl::UpdateActivity(Activity* activity) { ...@@ -87,6 +97,10 @@ void ActivityManagerImpl::UpdateActivity(Activity* activity) {
widget->UpdateWindowTitle(); widget->UpdateWindowTitle();
} }
const ActivityList& ActivityManagerImpl::GetActivityList() {
return activities_;
}
Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) { Activity* ActivityManagerImpl::GetActivityForWindow(aura::Window* window) {
struct Matcher { struct Matcher {
Matcher(aura::Window* w) : window(w) {} Matcher(aura::Window* w) : window(w) {}
...@@ -108,14 +122,33 @@ void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) { ...@@ -108,14 +122,33 @@ void ActivityManagerImpl::RemoveObserver(ActivityManagerObserver* observer) {
observers_.RemoveObserver(observer); observers_.RemoveObserver(observer);
} }
void ActivityManagerImpl::OnWidgetDestroying(views::Widget* widget) { void ActivityManagerImpl::OnWindowDestroying(aura::Window* window) {
Activity* activity = GetActivityForWindow(widget->GetNativeWindow()); Activity* activity = GetActivityForWindow(window);
if (activity) { if (activity) {
widget->RemoveObserver(this); window->RemoveObserver(this);
Activity::Delete(activity); Activity::Delete(activity);
} }
} }
void ActivityManagerImpl::OnWindowActivated(aura::Window* gained_active,
aura::Window* lost_active) {
Activity* activity = GetActivityForWindow(gained_active);
if (!activity)
return;
CHECK(!activities_.empty());
if (activity == activities_.front())
return;
// Move the activity for |gained_active| at the front of the list.
ActivityList::reverse_iterator iter = std::find(activities_.rbegin(),
activities_.rend(),
activity);
CHECK(iter != activities_.rend());
std::rotate(iter, iter + 1, activities_.rend());
FOR_EACH_OBSERVER(ActivityManagerObserver,
observers_,
OnActivityOrderChanged());
}
// static // static
ActivityManager* ActivityManager::Create() { ActivityManager* ActivityManager::Create() {
new ActivityManagerImpl(); new ActivityManagerImpl();
......
...@@ -8,14 +8,16 @@ ...@@ -8,14 +8,16 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "ui/views/widget/widget_observer.h" #include "ui/aura/window_observer.h"
#include "ui/wm/public/activation_change_observer.h"
namespace athena { namespace athena {
class ActivityManagerObserver; class ActivityManagerObserver;
class ActivityManagerImpl : public ActivityManager, class ActivityManagerImpl : public ActivityManager,
public views::WidgetObserver { public aura::WindowObserver,
public aura::client::ActivationChangeObserver {
public: public:
ActivityManagerImpl(); ActivityManagerImpl();
~ActivityManagerImpl() override; ~ActivityManagerImpl() override;
...@@ -26,14 +28,19 @@ class ActivityManagerImpl : public ActivityManager, ...@@ -26,14 +28,19 @@ class ActivityManagerImpl : public ActivityManager,
void AddActivity(Activity* activity) override; void AddActivity(Activity* activity) override;
void RemoveActivity(Activity* activity) override; void RemoveActivity(Activity* activity) override;
void UpdateActivity(Activity* activity) override; void UpdateActivity(Activity* activity) override;
const ActivityList& GetActivityList() override;
Activity* GetActivityForWindow(aura::Window* window) override; Activity* GetActivityForWindow(aura::Window* window) override;
void AddObserver(ActivityManagerObserver* observer) override; void AddObserver(ActivityManagerObserver* observer) override;
void RemoveObserver(ActivityManagerObserver* observer) override; void RemoveObserver(ActivityManagerObserver* observer) override;
// views::WidgetObserver
void OnWidgetDestroying(views::Widget* widget) override;
private: private:
// aura::WindowObserver:
void OnWindowDestroying(aura::Window* window) override;
// aura::client::ActivationChangeObserver:
void OnWindowActivated(aura::Window* gained_active,
aura::Window* lost_active) override;
std::vector<Activity*> activities_; std::vector<Activity*> activities_;
ObserverList<ActivityManagerObserver> observers_; ObserverList<ActivityManagerObserver> observers_;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "athena/test/base/athena_test_base.h" #include "athena/test/base/athena_test_base.h"
#include "athena/test/base/test_windows.h" #include "athena/test/base/test_windows.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/wm/core/window_util.h"
namespace athena { namespace athena {
...@@ -58,4 +59,25 @@ TEST_F(ActivityManagerTest, GetActivityForWindow) { ...@@ -58,4 +59,25 @@ TEST_F(ActivityManagerTest, GetActivityForWindow) {
EXPECT_EQ(nullptr, manager->GetActivityForWindow(window.get())); EXPECT_EQ(nullptr, manager->GetActivityForWindow(window.get()));
} }
TEST_F(ActivityManagerTest, ActivationBringsActivityToTop) {
ActivityManager* manager = ActivityManager::Get();
ActivityFactory* factory = ActivityFactory::Get();
Activity* activity1 =
factory->CreateWebActivity(nullptr, base::string16(), GURL());
Activity* activity2 =
factory->CreateWebActivity(nullptr, base::string16(), GURL());
activity1->GetWindow()->Show();
activity2->GetWindow()->Show();
ASSERT_EQ(2u, manager->GetActivityList().size());
EXPECT_EQ(activity2, manager->GetActivityList()[0]);
EXPECT_EQ(activity1, manager->GetActivityList()[1]);
wm::ActivateWindow(activity1->GetWindow());
ASSERT_EQ(2u, manager->GetActivityList().size());
EXPECT_EQ(activity1, manager->GetActivityList()[0]);
EXPECT_EQ(activity2, manager->GetActivityList()[1]);
}
} // namespace athena } // namespace athena
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef ATHENA_ACTIVITY_PUBLIC_ACTIVITY_MANAGER_H_ #ifndef ATHENA_ACTIVITY_PUBLIC_ACTIVITY_MANAGER_H_
#define ATHENA_ACTIVITY_PUBLIC_ACTIVITY_MANAGER_H_ #define ATHENA_ACTIVITY_PUBLIC_ACTIVITY_MANAGER_H_
#include <vector>
#include "athena/athena_export.h" #include "athena/athena_export.h"
namespace aura { namespace aura {
...@@ -16,6 +18,8 @@ namespace athena { ...@@ -16,6 +18,8 @@ namespace athena {
class Activity; class Activity;
class ActivityManagerObserver; class ActivityManagerObserver;
using ActivityList = std::vector<Activity*>;
// Manages a set of activities. // Manages a set of activities.
class ATHENA_EXPORT ActivityManager { class ATHENA_EXPORT ActivityManager {
public: public:
...@@ -29,13 +33,17 @@ class ATHENA_EXPORT ActivityManager { ...@@ -29,13 +33,17 @@ class ATHENA_EXPORT ActivityManager {
virtual void AddActivity(Activity* activity) = 0; virtual void AddActivity(Activity* activity) = 0;
virtual void RemoveActivity(Activity* activity) = 0; virtual void RemoveActivity(Activity* activity) = 0;
// Updates the UI when the task color/title changes.
virtual void UpdateActivity(Activity* activity) = 0;
// Returns a list of activities, sorted in their activation order (the most
// recently used activity is at the front of the returned list).
virtual const ActivityList& GetActivityList() = 0;
// Returns the activity that has a |window| as toplevel window, or // Returns the activity that has a |window| as toplevel window, or
// nullptr if such activity does not exist. // nullptr if such activity does not exist.
virtual Activity* GetActivityForWindow(aura::Window* window) = 0; virtual Activity* GetActivityForWindow(aura::Window* window) = 0;
// Updates the UI when the task color/title changes.
virtual void UpdateActivity(Activity* activity) = 0;
virtual void AddObserver(ActivityManagerObserver* observer) = 0; virtual void AddObserver(ActivityManagerObserver* observer) = 0;
virtual void RemoveObserver(ActivityManagerObserver* observer) = 0; virtual void RemoveObserver(ActivityManagerObserver* observer) = 0;
}; };
......
...@@ -20,6 +20,9 @@ class ATHENA_EXPORT ActivityManagerObserver { ...@@ -20,6 +20,9 @@ class ATHENA_EXPORT ActivityManagerObserver {
// Called before an |activity| gets destroyed. // Called before an |activity| gets destroyed.
virtual void OnActivityEnding(Activity* activity) = 0; virtual void OnActivityEnding(Activity* activity) = 0;
// Called when the order of the activities in the list has changed.
virtual void OnActivityOrderChanged() = 0;
}; };
} // namespace athena } // namespace athena
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "athena/wm/public/window_list_provider_observer.h" #include "athena/wm/public/window_list_provider_observer.h"
#include "athena/wm/public/window_manager.h" #include "athena/wm/public/window_manager.h"
#include "athena/wm/public/window_manager_observer.h" #include "athena/wm/public/window_manager_observer.h"
#include "base/containers/adapters.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/time/time.h" #include "base/time/time.h"
...@@ -51,16 +52,15 @@ class ResourceManagerImpl : public ResourceManager, ...@@ -51,16 +52,15 @@ class ResourceManagerImpl : public ResourceManager,
} else { } else {
DCHECK(pause_); DCHECK(pause_);
--pause_; --pause_;
if (!pause && queued_command_) { if (!pause && queued_command_)
UpdateActivityOrder();
ManageResource(); ManageResource();
} }
} }
}
// ActivityManagerObserver: // ActivityManagerObserver:
virtual void OnActivityStarted(Activity* activity) override; virtual void OnActivityStarted(Activity* activity) override;
virtual void OnActivityEnding(Activity* activity) override; virtual void OnActivityEnding(Activity* activity) override;
virtual void OnActivityOrderChanged() override;
// WindowManagerObserver: // WindowManagerObserver:
virtual void OnOverviewModeEnter() override; virtual void OnOverviewModeEnter() override;
...@@ -88,11 +88,6 @@ class ResourceManagerImpl : public ResourceManager, ...@@ -88,11 +88,6 @@ class ResourceManagerImpl : public ResourceManager,
// Check if activities can be unloaded to reduce memory pressure. // Check if activities can be unloaded to reduce memory pressure.
void TryToUnloadAnActivity(); void TryToUnloadAnActivity();
// Order our activity list to the order of activities of the stream.
// TODO(skuhne): Once the ActivityManager is responsible to create this list
// for us, we can remove this code here.
void UpdateActivityOrder();
// Resources were released and a quiet period is needed before we release // Resources were released and a quiet period is needed before we release
// more since it takes a while to trickle through the system. // more since it takes a while to trickle through the system.
void OnResourcesReleased(); void OnResourcesReleased();
...@@ -105,11 +100,6 @@ class ResourceManagerImpl : public ResourceManager, ...@@ -105,11 +100,6 @@ class ResourceManagerImpl : public ResourceManager,
// unloading another activity. // unloading another activity.
bool AllowedToUnloadActivity(); bool AllowedToUnloadActivity();
// The sorted (new(front) -> old(back)) activity list.
// TODO(skuhne): Once the ActivityManager is responsible to create this list
// for us, we can remove this code here.
std::vector<Activity*> activity_list_;
// The resource manager delegate. // The resource manager delegate.
scoped_ptr<ResourceManagerDelegate> delegate_; scoped_ptr<ResourceManagerDelegate> delegate_;
...@@ -177,9 +167,6 @@ ResourceManagerImpl::~ResourceManagerImpl() { ...@@ -177,9 +167,6 @@ ResourceManagerImpl::~ResourceManagerImpl() {
ActivityManager::Get()->RemoveObserver(this); ActivityManager::Get()->RemoveObserver(this);
WindowManager::Get()->GetWindowListProvider()->RemoveObserver(this); WindowManager::Get()->GetWindowListProvider()->RemoveObserver(this);
WindowManager::Get()->RemoveObserver(this); WindowManager::Get()->RemoveObserver(this);
while (!activity_list_.empty())
OnActivityEnding(activity_list_.front());
} }
void ResourceManagerImpl::SetMemoryPressureAndStopMonitoring( void ResourceManagerImpl::SetMemoryPressureAndStopMonitoring(
...@@ -189,24 +176,16 @@ void ResourceManagerImpl::SetMemoryPressureAndStopMonitoring( ...@@ -189,24 +176,16 @@ void ResourceManagerImpl::SetMemoryPressureAndStopMonitoring(
} }
void ResourceManagerImpl::OnActivityStarted(Activity* activity) { void ResourceManagerImpl::OnActivityStarted(Activity* activity) {
// As long as we have to manage the list of activities ourselves, we need to
// order it here.
activity_list_.push_back(activity);
UpdateActivityOrder();
// Update the activity states. // Update the activity states.
ManageResource(); ManageResource();
// Remember that the activity order has changed.
activity_order_changed_ = true; activity_order_changed_ = true;
} }
void ResourceManagerImpl::OnActivityEnding(Activity* activity) { void ResourceManagerImpl::OnActivityEnding(Activity* activity) {
DCHECK(activity->GetWindow()); activity_order_changed_ = true;
// Remove the activity from the list again. }
std::vector<Activity*>::iterator it =
std::find(activity_list_.begin(), activity_list_.end(), activity); void ResourceManagerImpl::OnActivityOrderChanged() {
DCHECK(it != activity_list_.end());
activity_list_.erase(it);
// Remember that the activity order has changed.
activity_order_changed_ = true; activity_order_changed_ = true;
} }
...@@ -216,9 +195,6 @@ void ResourceManagerImpl::OnOverviewModeEnter() { ...@@ -216,9 +195,6 @@ void ResourceManagerImpl::OnOverviewModeEnter() {
void ResourceManagerImpl::OnOverviewModeExit() { void ResourceManagerImpl::OnOverviewModeExit() {
in_overview_mode_ = false; in_overview_mode_ = false;
// Reorder the activities and manage the resources again since an order change
// might have caused a visibility change.
UpdateActivityOrder();
ManageResource(); ManageResource();
} }
...@@ -236,7 +212,6 @@ void ResourceManagerImpl::OnSplitViewModeExit() { ...@@ -236,7 +212,6 @@ void ResourceManagerImpl::OnSplitViewModeExit() {
} }
void ResourceManagerImpl::OnWindowStackingChangedInList() { void ResourceManagerImpl::OnWindowStackingChangedInList() {
activity_order_changed_ = true;
if (pause_) { if (pause_) {
queued_command_ = true; queued_command_ = true;
return; return;
...@@ -246,10 +221,6 @@ void ResourceManagerImpl::OnWindowStackingChangedInList() { ...@@ -246,10 +221,6 @@ void ResourceManagerImpl::OnWindowStackingChangedInList() {
if (in_overview_mode_) if (in_overview_mode_)
return; return;
// As long as we have to manage the list of activities ourselves, we need to
// order it here.
UpdateActivityOrder();
// Manage the resources of each activity. // Manage the resources of each activity.
ManageResource(); ManageResource();
} }
...@@ -267,7 +238,7 @@ ResourceManagerDelegate* ResourceManagerImpl::GetDelegate() { ...@@ -267,7 +238,7 @@ ResourceManagerDelegate* ResourceManagerImpl::GetDelegate() {
void ResourceManagerImpl::ManageResource() { void ResourceManagerImpl::ManageResource() {
// If there is none or only one app running we cannot do anything. // If there is none or only one app running we cannot do anything.
if (activity_list_.size() <= 1U) if (ActivityManager::Get()->GetActivityList().size() <= 1U)
return; return;
if (pause_) { if (pause_) {
...@@ -296,23 +267,22 @@ void ResourceManagerImpl::UpdateVisibilityStates() { ...@@ -296,23 +267,22 @@ void ResourceManagerImpl::UpdateVisibilityStates() {
if (current_memory_pressure_ == MEMORY_PRESSURE_CRITICAL) if (current_memory_pressure_ == MEMORY_PRESSURE_CRITICAL)
max_activities = in_split_view_mode_ ? 2 : 1; max_activities = in_split_view_mode_ ? 2 : 1;
// Restart and / or bail if the order of activities changes due to our calls. do {
activity_order_changed_ = false; activity_order_changed_ = false;
// Change the visibility of our activities in a pre-processing step. This is // Change the visibility of our activities in a pre-processing step. This is
// required since it might change the order/number of activities. // required since it might change the order/number of activities.
size_t index = 0; size_t count = 0;
while (index < activity_list_.size()) { for (Activity* activity : ActivityManager::Get()->GetActivityList()) {
Activity* activity = activity_list_[index];
Activity::ActivityState state = activity->GetCurrentState(); Activity::ActivityState state = activity->GetCurrentState();
// The first |kMaxVisibleActivities| entries should be visible, all others // The first |kMaxVisibleActivities| entries should be visible, all others
// invisible or at a lower activity state. // invisible or at a lower activity state.
if (index < max_activities || if (count < max_activities ||
(state == Activity::ACTIVITY_INVISIBLE || (state == Activity::ACTIVITY_INVISIBLE ||
state == Activity::ACTIVITY_VISIBLE)) { state == Activity::ACTIVITY_VISIBLE)) {
Activity::ActivityState visiblity_state = Activity::ActivityState visiblity_state =
index < max_activities ? Activity::ACTIVITY_VISIBLE : count < max_activities ? Activity::ACTIVITY_VISIBLE :
Activity::ACTIVITY_INVISIBLE; Activity::ACTIVITY_INVISIBLE;
// Only change the state when it changes. Note that when the memory // Only change the state when it changes. Note that when the memory
// pressure is critical, only the primary activities (1 or 2) are made // pressure is critical, only the primary activities (1 or 2) are made
...@@ -329,14 +299,14 @@ void ResourceManagerImpl::UpdateVisibilityStates() { ...@@ -329,14 +299,14 @@ void ResourceManagerImpl::UpdateVisibilityStates() {
} }
} }
// See which index we should handle next. // See which count we should handle next.
if (activity_order_changed_) { if (activity_order_changed_)
activity_order_changed_ = false; break;
index = 0; ++count;
} else {
++index;
}
} }
// If we stopped iterating over the list of activities because of the change
// in ordering, then restart processing the activities from the beginning.
} while (activity_order_changed_);
} }
void ResourceManagerImpl::TryToUnloadAnActivity() { void ResourceManagerImpl::TryToUnloadAnActivity() {
...@@ -365,25 +335,28 @@ void ResourceManagerImpl::TryToUnloadAnActivity() { ...@@ -365,25 +335,28 @@ void ResourceManagerImpl::TryToUnloadAnActivity() {
// Check if / which activity we want to unload. // Check if / which activity we want to unload.
Activity* oldest_media_activity = nullptr; Activity* oldest_media_activity = nullptr;
std::vector<Activity*> unloadable_activities; Activity* oldest_unloadable_activity = nullptr;
for (std::vector<Activity*>::iterator it = activity_list_.begin(); size_t unloadable_activity_count = 0;
it != activity_list_.end(); ++it) { const ActivityList& activity_list = ActivityManager::Get()->GetActivityList();
Activity::ActivityState state = (*it)->GetCurrentState(); for (Activity* activity : activity_list) {
Activity::ActivityState state = activity->GetCurrentState();
// The activity should neither be unloaded nor visible. // The activity should neither be unloaded nor visible.
if (state != Activity::ACTIVITY_UNLOADED && if (state != Activity::ACTIVITY_UNLOADED &&
state != Activity::ACTIVITY_VISIBLE) { state != Activity::ACTIVITY_VISIBLE) {
if ((*it)->GetMediaState() == Activity::ACTIVITY_MEDIA_STATE_NONE) { if (activity->GetMediaState() == Activity::ACTIVITY_MEDIA_STATE_NONE) {
// Does not play media - so we can unload this immediately. // Does not play media - so we can unload this immediately.
unloadable_activities.push_back(*it); ++unloadable_activity_count;
oldest_unloadable_activity = activity;
} else { } else {
oldest_media_activity = *it; oldest_media_activity = activity;
} }
} }
} }
if (unloadable_activities.size() > max_running_activities) { if (unloadable_activity_count > max_running_activities) {
CHECK(oldest_unloadable_activity);
OnResourcesReleased(); OnResourcesReleased();
unloadable_activities.back()->SetCurrentState(Activity::ACTIVITY_UNLOADED); oldest_unloadable_activity->SetCurrentState(Activity::ACTIVITY_UNLOADED);
return; return;
} else if (current_memory_pressure_ == MEMORY_PRESSURE_CRITICAL) { } else if (current_memory_pressure_ == MEMORY_PRESSURE_CRITICAL) {
if (oldest_media_activity) { if (oldest_media_activity) {
...@@ -402,39 +375,10 @@ void ResourceManagerImpl::TryToUnloadAnActivity() { ...@@ -402,39 +375,10 @@ void ResourceManagerImpl::TryToUnloadAnActivity() {
LOG(WARNING) << "[ResourceManager]: No way to release memory pressure (" << LOG(WARNING) << "[ResourceManager]: No way to release memory pressure (" <<
current_memory_pressure_ << current_memory_pressure_ <<
"), Activities (running, allowed, unloadable)=(" << "), Activities (running, allowed, unloadable)=(" <<
activity_list_.size() << ", " << activity_list.size() << ", " <<
max_running_activities << ", " << max_running_activities << ", " <<
unloadable_activities.size() << ")"; unloadable_activity_count << ")";
}
}
void ResourceManagerImpl::UpdateActivityOrder() {
queued_command_ = true;
if (activity_list_.empty())
return;
std::vector<Activity*> new_activity_list;
const aura::Window::Windows children =
WindowManager::Get()->GetWindowListProvider()->GetWindowList();
// Find the first window in the container which is part of the application.
for (aura::Window::Windows::const_reverse_iterator child_iterator =
children.rbegin();
child_iterator != children.rend(); ++child_iterator) {
for (std::vector<Activity*>::iterator activity_iterator =
activity_list_.begin();
activity_iterator != activity_list_.end(); ++activity_iterator) {
if (*child_iterator == (*activity_iterator)->GetWindow()) {
new_activity_list.push_back(*activity_iterator);
activity_list_.erase(activity_iterator);
break;
}
} }
}
// At this point the old list should be empty and we can swap the lists.
DCHECK(!activity_list_.size());
activity_list_ = new_activity_list;
// Remember that the activity order has changed.
activity_order_changed_ = true;
} }
void ResourceManagerImpl::OnResourcesReleased() { void ResourceManagerImpl::OnResourcesReleased() {
......
...@@ -25,6 +25,9 @@ void ActivityLifetimeTracker::OnActivityEnding(Activity* activity) { ...@@ -25,6 +25,9 @@ void ActivityLifetimeTracker::OnActivityEnding(Activity* activity) {
deleted_activity_ = activity; deleted_activity_ = activity;
} }
void ActivityLifetimeTracker::OnActivityOrderChanged() {
}
Activity* ActivityLifetimeTracker::GetNewActivityAndReset() { Activity* ActivityLifetimeTracker::GetNewActivityAndReset() {
Activity* activity = new_activity_; Activity* activity = new_activity_;
new_activity_ = nullptr; new_activity_ = nullptr;
......
...@@ -17,11 +17,10 @@ class ActivityLifetimeTracker : public ActivityManagerObserver { ...@@ -17,11 +17,10 @@ class ActivityLifetimeTracker : public ActivityManagerObserver {
ActivityLifetimeTracker(); ActivityLifetimeTracker();
~ActivityLifetimeTracker() override; ~ActivityLifetimeTracker() override;
// Called after an |activity| got created. // ActivityManagerObserver:
void OnActivityStarted(Activity* activity) override; void OnActivityStarted(Activity* activity) override;
// Called before an |activity| gets destroyed.
void OnActivityEnding(Activity* activity) override; void OnActivityEnding(Activity* activity) override;
void OnActivityOrderChanged() override;
// Returns the newly created activity (if any) and resets its reference. // Returns the newly created activity (if any) and resets its reference.
Activity* GetNewActivityAndReset(); Activity* GetNewActivityAndReset();
......
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