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#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_
6#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_
7
8#include <map>
9#include <set>
10#include <string>
11
12#include "base/callback.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/strings/string16.h"
15#include "chrome/browser/media_galleries/media_galleries_dialog_controller.h"
16#include "chrome/browser/media_galleries/media_galleries_preferences.h"
17#include "components/storage_monitor/removable_storage_observer.h"
18
19namespace content {
20class WebContents;
21}
22
23namespace extensions {
24class Extension;
25}
26
27namespace ui {
28class MenuModel;
29}
30
31class MediaGalleriesScanResultController;
32class MediaGalleryContextMenu;
33class Profile;
34
35// The controller is responsible for handling the logic of the dialog and
36// interfacing with the model (i.e., MediaGalleriesPreferences). It shows
37// the dialog and owns itself.
38class MediaGalleriesScanResultController
39    : public MediaGalleriesDialogController,
40      public storage_monitor::RemovableStorageObserver,
41      public MediaGalleriesPreferences::GalleryChangeObserver {
42 public:
43  // |preferences| must be already initialized.
44  static size_t ScanResultCountForExtension(
45      MediaGalleriesPreferences* preferences,
46      const extensions::Extension* extension);
47
48  // The constructor creates a dialog controller which owns itself.
49  MediaGalleriesScanResultController(
50      content::WebContents* web_contents,
51      const extensions::Extension& extension,
52      const base::Closure& on_finish);
53
54  // MediaGalleriesDialogController implementation.
55  virtual base::string16 GetHeader() const OVERRIDE;
56  virtual base::string16 GetSubtext() const OVERRIDE;
57  virtual bool IsAcceptAllowed() const OVERRIDE;
58  virtual bool ShouldShowFolderViewer(const Entry& entry) const OVERRIDE;
59  virtual std::vector<base::string16> GetSectionHeaders() const OVERRIDE;
60  virtual Entries GetSectionEntries(size_t index) const OVERRIDE;
61  virtual base::string16 GetAuxiliaryButtonText() const OVERRIDE;
62  virtual void DidClickAuxiliaryButton() OVERRIDE;
63  virtual void DidToggleEntry(MediaGalleryPrefId id, bool selected) OVERRIDE;
64  virtual void DidClickOpenFolderViewer(MediaGalleryPrefId id) OVERRIDE;
65  virtual void DidForgetEntry(MediaGalleryPrefId id) OVERRIDE;
66  virtual base::string16 GetAcceptButtonText() const OVERRIDE;
67  virtual void DialogFinished(bool accepted) OVERRIDE;
68  virtual ui::MenuModel* GetContextMenu(MediaGalleryPrefId id) OVERRIDE;
69  virtual content::WebContents* WebContents() OVERRIDE;
70
71 protected:
72  typedef base::Callback<MediaGalleriesDialog* (
73      MediaGalleriesDialogController*)> CreateDialogCallback;
74  typedef std::map<MediaGalleryPrefId, Entry> ScanResults;
75
76  // Updates |scan_results| from |preferences|. Will not add galleries from
77  // |ignore_list| onto |scan_results|.
78  static void UpdateScanResultsFromPreferences(
79      MediaGalleriesPreferences* preferences,
80      const extensions::Extension* extension,
81      MediaGalleryPrefIdSet ignore_list,
82      ScanResults* scan_results);
83
84  // Used for unit tests.
85  MediaGalleriesScanResultController(
86      const extensions::Extension& extension,
87      MediaGalleriesPreferences* preferences_,
88      const CreateDialogCallback& create_dialog_callback,
89      const base::Closure& on_finish);
90
91  virtual ~MediaGalleriesScanResultController();
92
93 private:
94  friend class MediaGalleriesScanResultControllerTest;
95  friend class MediaGalleriesScanResultCocoaTest;
96  friend class TestMediaGalleriesAddScanResultsFunction;
97
98  // Bottom half of constructor -- called when |preferences_| is initialized.
99  void OnPreferencesInitialized();
100
101  // Used to keep the dialog in sync with the preferences.
102  void OnPreferenceUpdate(const std::string& extension_id);
103
104  // Used to keep the dialog in sync with attached and detached devices.
105  void OnRemovableDeviceUpdate(const std::string device_id);
106
107  Profile* GetProfile() const;
108
109  // RemovableStorageObserver implementation.
110  // Used to keep dialog in sync with removable device status.
111  virtual void OnRemovableStorageAttached(
112      const storage_monitor::StorageInfo& info) OVERRIDE;
113  virtual void OnRemovableStorageDetached(
114      const storage_monitor::StorageInfo& info) OVERRIDE;
115
116  // MediaGalleriesPreferences::GalleryChangeObserver implementations.
117  // Used to keep the dialog in sync when the preferences change.
118  virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
119                                 const std::string& extension_id,
120                                 MediaGalleryPrefId pref_id) OVERRIDE;
121  virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
122                                   const std::string& extension_id,
123                                   MediaGalleryPrefId pref_id) OVERRIDE;
124  virtual void OnGalleryAdded(MediaGalleriesPreferences* pref,
125                              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