b918dddda8dc0d43b75de976143fcb4e13872003
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / media_galleries_scan_result_controller.h
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
19 namespace content {
20 class WebContents;
21 }
22
23 namespace extensions {
24 class Extension;
25 }
26
27 namespace ui {
28 class MenuModel;
29 }
30
31 class MediaGalleriesScanResultController;
32 class MediaGalleryContextMenu;
33 class 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.
38 class 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   base::string16 GetHeader() const override;
56   base::string16 GetSubtext() const override;
57   bool IsAcceptAllowed() const override;
58   bool ShouldShowFolderViewer(const Entry& entry) const override;
59   std::vector<base::string16> GetSectionHeaders() const override;
60   Entries GetSectionEntries(size_t index) const override;
61   base::string16 GetAuxiliaryButtonText() const override;
62   void DidClickAuxiliaryButton() override;
63   void DidToggleEntry(MediaGalleryPrefId id, bool selected) override;
64   void DidClickOpenFolderViewer(MediaGalleryPrefId id) override;
65   void DidForgetEntry(MediaGalleryPrefId id) override;
66   base::string16 GetAcceptButtonText() const override;
67   void DialogFinished(bool accepted) override;
68   ui::MenuModel* GetContextMenu(MediaGalleryPrefId id) override;
69   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   ~MediaGalleriesScanResultController() override;
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   void OnRemovableStorageAttached(
112       const storage_monitor::StorageInfo& info) override;
113   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   void OnPermissionAdded(MediaGalleriesPreferences* pref,
119                          const std::string& extension_id,
120                          MediaGalleryPrefId pref_id) override;
121   void OnPermissionRemoved(MediaGalleriesPreferences* pref,
122                            const std::string& extension_id,
123                            MediaGalleryPrefId pref_id) override;
124   void OnGalleryAdded(MediaGalleriesPreferences* pref,
125                       MediaGalleryPrefId pref_id) override;
126   void OnGalleryRemoved(MediaGalleriesPreferences* pref,
127                         MediaGalleryPrefId pref_id) override;
128   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_