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