app_activity.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "athena/content/app_activity.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "apps/shell/browser/shell_app_window.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "athena/activity/public/activity_manager.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/webview/webview.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace athena {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mukai): specifies the same accelerators of WebActivity.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppActivity::AppActivity(apps::ShellAppWindow* app_window)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : app_window_(app_window),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_view_(NULL),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_state_(ACTIVITY_UNLOADED) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(app_window_);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppActivity::~AppActivity() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetCurrentState() != ACTIVITY_UNLOADED)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetCurrentState(ACTIVITY_UNLOADED);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ActivityViewModel* AppActivity::GetActivityViewModel() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppActivity::SetCurrentState(Activity::ActivityState state) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state) {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ACTIVITY_VISIBLE:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fall through (for the moment).
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ACTIVITY_INVISIBLE:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // By clearing the overview mode image we allow the content to be shown.
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      overview_mode_image_ = gfx::ImageSkia();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(skuhne): Find out how to reload an app from the extension system.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ACTIVITY_BACKGROUND_LOW_PRIORITY:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(ACTIVITY_VISIBLE == current_state_ ||
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ACTIVITY_INVISIBLE == current_state_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(skuhne): Do this.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ACTIVITY_PERSISTENT:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_EQ(ACTIVITY_BACKGROUND_LOW_PRIORITY, current_state_);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(skuhne): Do this.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ACTIVITY_UNLOADED:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_NE(ACTIVITY_UNLOADED, current_state_);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(skuhne): Find out how to evict an app from the extension system.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      //      web_view_->EvictContent();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remember the last requested state.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_state_ = state;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Activity::ActivityState AppActivity::GetCurrentState() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skuhne): Check here also eviction status.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_view_) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(ACTIVITY_UNLOADED, current_state_);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ACTIVITY_UNLOADED;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skuhne): This should be controlled by an observer and should not
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reside here.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsVisible() && current_state_ != ACTIVITY_VISIBLE)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetCurrentState(ACTIVITY_VISIBLE);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: If the activity is not visible it does not necessarily mean that it
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does not have GPU compositor resources (yet).
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_state_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppActivity::IsVisible() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_ && web_view_->IsDrawn();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Activity::ActivityMediaState AppActivity::GetMediaState() {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skuhne): The function GetTabMediaStateForContents(WebContents),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the AudioStreamMonitor needs to be moved from Chrome into contents to
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // make it more modular and so that we can use it from here.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Activity::ACTIVITY_MEDIA_STATE_NONE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppActivity::Init() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor AppActivity::GetRepresentativeColor() const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sad): Compute the color from the favicon.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SK_ColorGRAY;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::string16 AppActivity::GetTitle() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_->GetWebContents()->GetTitle();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppActivity::UsesFrame() const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* AppActivity::GetContentsView() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_view_) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(oshima): use apps::NativeAppWindowViews
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContents* web_contents =
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        app_window_->GetAssociatedWebContents();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_view_ = new views::WebView(web_contents->GetBrowserContext());
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_view_->SetWebContents(web_contents);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetCurrentState(ACTIVITY_INVISIBLE);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Observe(web_contents);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    overview_mode_image_ = gfx::ImageSkia();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_view_;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppActivity::CreateOverviewModeImage() {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(skuhne): Implement this!
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia AppActivity::GetOverviewModeImage() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return overview_mode_image_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AppActivity::TitleWasSet(content::NavigationEntry* entry,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool explicit_set) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ActivityManager::Get()->UpdateActivity(this);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppActivity::DidUpdateFaviconURL(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<content::FaviconURL>& candidates) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ActivityManager::Get()->UpdateActivity(this);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace athena
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)