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)