1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (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) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_ 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/callback.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_dialog_controller.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/storage_monitor/removable_storage_observer.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContents; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Extension; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace ui { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MenuModel; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MediaGalleriesScanResultController; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaGalleryContextMenu; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The controller is responsible for handling the logic of the dialog and 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interfacing with the model (i.e., MediaGalleriesPreferences). It shows 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the dialog and owns itself. 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MediaGalleriesScanResultController 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public MediaGalleriesDialogController, 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public storage_monitor::RemovableStorageObserver, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public MediaGalleriesPreferences::GalleryChangeObserver { 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |preferences| must be already initialized. 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static size_t ScanResultCountForExtension( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaGalleriesPreferences* preferences, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The constructor creates a dialog controller which owns itself. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaGalleriesScanResultController( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension& extension, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& on_finish); 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // MediaGalleriesDialogController implementation. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::string16 GetHeader() const OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::string16 GetSubtext() const OVERRIDE; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool IsAcceptAllowed() const OVERRIDE; 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual bool ShouldShowFolderViewer(const Entry& entry) const OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::vector<base::string16> GetSectionHeaders() const OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual Entries GetSectionEntries(size_t index) const OVERRIDE; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::string16 GetAuxiliaryButtonText() const OVERRIDE; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidClickAuxiliaryButton() OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidToggleEntry(MediaGalleryPrefId id, bool selected) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidClickOpenFolderViewer(MediaGalleryPrefId id) OVERRIDE; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidForgetEntry(MediaGalleryPrefId id) OVERRIDE; 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual base::string16 GetAcceptButtonText() const OVERRIDE; 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void DialogFinished(bool accepted) OVERRIDE; 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ui::MenuModel* GetContextMenu(MediaGalleryPrefId id) OVERRIDE; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual content::WebContents* WebContents() OVERRIDE; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef base::Callback<MediaGalleriesDialog* ( 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaGalleriesDialogController*)> CreateDialogCallback; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::map<MediaGalleryPrefId, Entry> ScanResults; 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Updates |scan_results| from |preferences|. Will not add galleries from 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |ignore_list| onto |scan_results|. 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void UpdateScanResultsFromPreferences( 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MediaGalleriesPreferences* preferences, 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const extensions::Extension* extension, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MediaGalleryPrefIdSet ignore_list, 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ScanResults* scan_results); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Used for unit tests. 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MediaGalleriesScanResultController( 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::Extension& extension, 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MediaGalleriesPreferences* preferences_, 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const CreateDialogCallback& create_dialog_callback, 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Closure& on_finish); 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~MediaGalleriesScanResultController(); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class MediaGalleriesScanResultControllerTest; 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch friend class MediaGalleriesScanResultCocoaTest; 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend class TestMediaGalleriesAddScanResultsFunction; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Bottom half of constructor -- called when |preferences_| is initialized. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnPreferencesInitialized(); 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Used to keep the dialog in sync with the preferences. 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnPreferenceUpdate(const std::string& extension_id); 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Used to keep the dialog in sync with attached and detached devices. 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnRemovableDeviceUpdate(const std::string device_id); 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Profile* GetProfile() const; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // RemovableStorageObserver implementation. 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Used to keep dialog in sync with removable device status. 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnRemovableStorageAttached( 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnRemovableStorageDetached( 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // MediaGalleriesPreferences::GalleryChangeObserver implementations. 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Used to keep the dialog in sync when the preferences change. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPermissionAdded(MediaGalleriesPreferences* pref, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& extension_id, 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaGalleryPrefId pref_id) OVERRIDE; 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& extension_id, 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnGalleryAdded(MediaGalleriesPreferences* pref, 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) MediaGalleryPrefId pref_id) OVERRIDE; 126 virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref, 127 MediaGalleryPrefId pref_id) OVERRIDE; 128 virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref, 129 MediaGalleryPrefId pref_id) OVERRIDE; 130 131 // The web contents from which the request originated. 132 content::WebContents* web_contents_; 133 134 // This is just a reference, but it's assumed that it won't become invalid 135 // while the dialog is showing. 136 const extensions::Extension* extension_; 137 138 // The scan results that aren't blacklisted and this extension doesn't 139 // already have access to. 140 ScanResults scan_results_; 141 142 // The set of scan results which should be removed (blacklisted) - unless 143 // the user clicks Cancel. 144 MediaGalleryPrefIdSet results_to_remove_; 145 146 // Callback to run when the dialog closes. 147 base::Closure on_finish_; 148 149 // The model that tracks galleries and extensions' permissions. 150 // This is the authoritative source for gallery information. 151 MediaGalleriesPreferences* preferences_; 152 153 // Creates the dialog. Only changed for unit tests. 154 CreateDialogCallback create_dialog_callback_; 155 156 // The view that's showing. 157 scoped_ptr<MediaGalleriesDialog> dialog_; 158 159 scoped_ptr<MediaGalleryContextMenu> context_menu_; 160 161 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesScanResultController); 162}; 163 164#endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_ 165