| Index: athena/content/app_activity.cc
|
| diff --git a/athena/content/app_activity.cc b/athena/content/app_activity.cc
|
| index c90daffa625e253e3498cdb11b9dd0ea6e9de7ca..309454ab401e440fc05f0282479f4f89ae03c7e8 100644
|
| --- a/athena/content/app_activity.cc
|
| +++ b/athena/content/app_activity.cc
|
| @@ -5,9 +5,13 @@
|
| #include "athena/content/app_activity.h"
|
|
|
| #include "athena/activity/public/activity_manager.h"
|
| +#include "athena/content/app_activity_registry.h"
|
| +#include "athena/content/public/app_content_control_delegate.h"
|
| +#include "athena/content/public/app_registry.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "extensions/shell/browser/shell_app_window.h"
|
| #include "ui/views/controls/webview/webview.h"
|
| +#include "ui/views/widget/widget.h"
|
|
|
| namespace athena {
|
|
|
| @@ -15,13 +19,14 @@ namespace athena {
|
| AppActivity::AppActivity(extensions::ShellAppWindow* app_window)
|
| : app_window_(app_window),
|
| web_view_(NULL),
|
| - current_state_(ACTIVITY_UNLOADED) {
|
| - DCHECK(app_window_);
|
| + current_state_(ACTIVITY_UNLOADED),
|
| + app_activity_registry_(NULL) {
|
| }
|
|
|
| AppActivity::~AppActivity() {
|
| - if (GetCurrentState() != ACTIVITY_UNLOADED)
|
| - SetCurrentState(ACTIVITY_UNLOADED);
|
| + // If this activity is registered, we unregister it now.
|
| + if (app_activity_registry_)
|
| + app_activity_registry_->UnregisterAppActivity(this);
|
| }
|
|
|
| ActivityViewModel* AppActivity::GetActivityViewModel() {
|
| @@ -29,35 +34,41 @@ ActivityViewModel* AppActivity::GetActivityViewModel() {
|
| }
|
|
|
| void AppActivity::SetCurrentState(Activity::ActivityState state) {
|
| + ActivityState current_state = state;
|
| + // Remember the last requested state now so that a call to GetCurrentState()
|
| + // returns the new state.
|
| + current_state_ = state;
|
| +
|
| switch (state) {
|
| case ACTIVITY_VISIBLE:
|
| // Fall through (for the moment).
|
| case ACTIVITY_INVISIBLE:
|
| // By clearing the overview mode image we allow the content to be shown.
|
| overview_mode_image_ = gfx::ImageSkia();
|
| - // TODO(skuhne): Find out how to reload an app from the extension system.
|
| + // Note: A reload from the unloaded state will be performed through the
|
| + // |AppActivityProxy| object and no further action isn't necessary here.
|
| break;
|
| case ACTIVITY_BACKGROUND_LOW_PRIORITY:
|
| - DCHECK(ACTIVITY_VISIBLE == current_state_ ||
|
| - ACTIVITY_INVISIBLE == current_state_);
|
| + DCHECK(ACTIVITY_VISIBLE == current_state ||
|
| + ACTIVITY_INVISIBLE == current_state);
|
| // TODO(skuhne): Do this.
|
| break;
|
| case ACTIVITY_PERSISTENT:
|
| - DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_);
|
| + DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state);
|
| // TODO(skuhne): Do this.
|
| break;
|
| case ACTIVITY_UNLOADED:
|
| - DCHECK_NE(ACTIVITY_UNLOADED, current_state_);
|
| - // TODO(skuhne): Find out how to evict an app from the extension system.
|
| - // web_view_->EvictContent();
|
| + DCHECK_NE(ACTIVITY_UNLOADED, current_state);
|
| + // This will cause the application to shut down, close its windows and
|
| + // delete this object. Instead a |AppActivityProxy| will be created as
|
| + // place holder.
|
| + if (app_activity_registry_)
|
| + app_activity_registry_->Unload();
|
| break;
|
| }
|
| - // Remember the last requested state.
|
| - current_state_ = state;
|
| }
|
|
|
| Activity::ActivityState AppActivity::GetCurrentState() {
|
| - // TODO(skuhne): Check here also eviction status.
|
| if (!web_view_) {
|
| DCHECK_EQ(ACTIVITY_UNLOADED, current_state_);
|
| return ACTIVITY_UNLOADED;
|
| @@ -82,6 +93,10 @@ Activity::ActivityMediaState AppActivity::GetMediaState() {
|
| return Activity::ACTIVITY_MEDIA_STATE_NONE;
|
| }
|
|
|
| +aura::Window* AppActivity::GetWindow() {
|
| + return !web_view_ ? NULL : web_view_->GetWidget()->GetNativeWindow();
|
| +}
|
| +
|
| void AppActivity::Init() {
|
| }
|
|
|
| @@ -130,4 +145,26 @@ void AppActivity::DidUpdateFaviconURL(
|
| ActivityManager::Get()->UpdateActivity(this);
|
| }
|
|
|
| +void AppActivity::DidStartNavigationToPendingEntry(
|
| + const GURL& url,
|
| + content::NavigationController::ReloadType reload_type) {
|
| + if (!app_activity_registry_)
|
| + RegisterActivity();
|
| +}
|
| +
|
| +// Register an |activity| with an application.
|
| +// Note: This should only get called once for an |app_window| of the
|
| +// |activity|.
|
| +void AppActivity::RegisterActivity() {
|
| + content::WebContents* web_contents = app_window_->GetAssociatedWebContents();
|
| + AppRegistry* app_registry = AppRegistry::Get();
|
| + // Get the application's registry.
|
| + app_activity_registry_ = app_registry->GetAppActivityRegistry(
|
| + app_registry->GetDelegate()->GetApplicationID(web_contents),
|
| + web_contents->GetBrowserContext());
|
| + DCHECK(app_activity_registry_);
|
| + // Register the activity.
|
| + app_activity_registry_->RegisterAppActivity(this);
|
| +}
|
| +
|
| } // namespace athena
|
|
|