Home | History | Annotate | Download | only in drive
      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 
     53 DriveServiceBridgeImpl::DriveServiceBridgeImpl(Profile* profile)
     54     : profile_(profile) {
     55   DCHECK(profile_);
     56 }
     57 
     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 
     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 
    103 drive::DriveAppRegistry* DriveServiceBridgeImpl::GetAppRegistry() {
    104   return drive_app_registry_.get();
    105 }
    106 
    107 void DriveServiceBridgeImpl::OnReadyToSendRequests() {
    108   drive_app_registry_->Update();
    109 }
    110 
    111 void DriveServiceBridgeImpl::OnNotificationReceived() {
    112   if (drive_service_->CanSendRequest())
    113     drive_app_registry_->Update();
    114 }
    115 
    116 void DriveServiceBridgeImpl::OnPushNotificationEnabled(bool enabled) {
    117   if (enabled && drive_service_->CanSendRequest())
    118     drive_app_registry_->Update();
    119 }
    120 
    121 }  // namespace
    122 
    123 // static
    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
    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