• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/apps/drive/drive_service_bridge.h"
6 
7 #include <string>
8 
9 #include "base/logging.h"
10 #include "chrome/browser/drive/drive_api_service.h"
11 #include "chrome/browser/drive/drive_app_registry.h"
12 #include "chrome/browser/drive/drive_notification_manager.h"
13 #include "chrome/browser/drive/drive_notification_manager_factory.h"
14 #include "chrome/browser/drive/drive_notification_observer.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
17 #include "chrome/browser/signin/signin_manager_factory.h"
18 #include "components/signin/core/browser/profile_oauth2_token_service.h"
19 #include "components/signin/core/browser/signin_manager.h"
20 #include "content/public/browser/browser_thread.h"
21 
22 namespace {
23 
24 // Hosts DriveAPIService and DriveAppRegistry.
25 // TODO(xiyuan): Optimize to leverage chromeos::DriveIntegrationService.
26 class DriveServiceBridgeImpl : public DriveServiceBridge,
27                                public drive::DriveServiceObserver,
28                                public drive::DriveNotificationObserver {
29  public:
30   explicit DriveServiceBridgeImpl(Profile* profile);
31   virtual ~DriveServiceBridgeImpl();
32 
33   void Initialize();
34 
35   // DriveServiceBridge:
36   virtual drive::DriveAppRegistry* GetAppRegistry() OVERRIDE;
37 
38   // drive::DriveServiceObserver:
39   virtual void OnReadyToSendRequests() OVERRIDE;
40 
41   // drive::DriveNotificationObserver:
42   virtual void OnNotificationReceived() OVERRIDE;
43   virtual void OnPushNotificationEnabled(bool enabled) OVERRIDE;
44 
45  private:
46   Profile* profile_;
47   scoped_ptr<drive::DriveServiceInterface> drive_service_;
48   scoped_ptr<drive::DriveAppRegistry> drive_app_registry_;
49 
50   DISALLOW_COPY_AND_ASSIGN(DriveServiceBridgeImpl);
51 };
52 
DriveServiceBridgeImpl(Profile * profile)53 DriveServiceBridgeImpl::DriveServiceBridgeImpl(Profile* profile)
54     : profile_(profile) {
55   DCHECK(profile_);
56 }
57 
~DriveServiceBridgeImpl()58 DriveServiceBridgeImpl::~DriveServiceBridgeImpl() {
59   drive::DriveNotificationManager* drive_notification_manager =
60       drive::DriveNotificationManagerFactory::FindForBrowserContext(profile_);
61   if (drive_notification_manager)
62     drive_notification_manager->RemoveObserver(this);
63 
64   drive_service_->RemoveObserver(this);
65 
66   drive_app_registry_.reset();
67   drive_service_.reset();
68 }
69 
Initialize()70 void DriveServiceBridgeImpl::Initialize() {
71   scoped_refptr<base::SequencedWorkerPool> worker_pool(
72       content::BrowserThread::GetBlockingPool());
73   scoped_refptr<base::SequencedTaskRunner> drive_task_runner(
74       worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
75           worker_pool->GetSequenceToken(),
76           base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
77 
78   ProfileOAuth2TokenService* token_service =
79       ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
80   drive_service_.reset(new drive::DriveAPIService(
81       token_service,
82       profile_->GetRequestContext(),
83       drive_task_runner.get(),
84       GURL(google_apis::DriveApiUrlGenerator::kBaseUrlForProduction),
85       GURL(google_apis::DriveApiUrlGenerator::kBaseDownloadUrlForProduction),
86       GURL(google_apis::GDataWapiUrlGenerator::kBaseUrlForProduction),
87       std::string() /* custom_user_agent */));
88   SigninManagerBase* signin_manager =
89       SigninManagerFactory::GetForProfile(profile_);
90   drive_service_->Initialize(signin_manager->GetAuthenticatedAccountId());
91   drive_service_->AddObserver(this);
92 
93   drive::DriveNotificationManager* drive_notification_manager =
94       drive::DriveNotificationManagerFactory::GetForBrowserContext(profile_);
95   if (drive_notification_manager)
96     drive_notification_manager->AddObserver(this);
97 
98   drive_app_registry_.reset(new drive::DriveAppRegistry(drive_service_.get()));
99   if (drive_service_->CanSendRequest())
100     drive_app_registry_->Update();
101 }
102 
GetAppRegistry()103 drive::DriveAppRegistry* DriveServiceBridgeImpl::GetAppRegistry() {
104   return drive_app_registry_.get();
105 }
106 
OnReadyToSendRequests()107 void DriveServiceBridgeImpl::OnReadyToSendRequests() {
108   drive_app_registry_->Update();
109 }
110 
OnNotificationReceived()111 void DriveServiceBridgeImpl::OnNotificationReceived() {
112   if (drive_service_->CanSendRequest())
113     drive_app_registry_->Update();
114 }
115 
OnPushNotificationEnabled(bool enabled)116 void DriveServiceBridgeImpl::OnPushNotificationEnabled(bool enabled) {
117   if (enabled && drive_service_->CanSendRequest())
118     drive_app_registry_->Update();
119 }
120 
121 }  // namespace
122 
123 // static
Create(Profile * profile)124 scoped_ptr<DriveServiceBridge> DriveServiceBridge::Create(Profile* profile) {
125   scoped_ptr<DriveServiceBridgeImpl> bridge(
126       new DriveServiceBridgeImpl(profile));
127   bridge->Initialize();
128   return bridge.PassAs<DriveServiceBridge>();
129 }
130 
131 // static
AppendDependsOnFactories(std::set<BrowserContextKeyedServiceFactory * > * factories)132 void DriveServiceBridge::AppendDependsOnFactories(
133     std::set<BrowserContextKeyedServiceFactory*>* factories) {
134   DCHECK(factories);
135   factories->insert(ProfileOAuth2TokenServiceFactory::GetInstance());
136   factories->insert(SigninManagerFactory::GetInstance());
137   factories->insert(drive::DriveNotificationManagerFactory::GetInstance());
138 }
139