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.
5 #ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_
6 #define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_
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"
23 namespace extensions
{
31 class MediaGalleriesScanResultController
;
32 class MediaGalleryContextMenu
;
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
{
43 // |preferences| must be already initialized.
44 static size_t ScanResultCountForExtension(
45 MediaGalleriesPreferences
* preferences
,
46 const extensions::Extension
* extension
);
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
);
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
;
72 typedef base::Callback
<MediaGalleriesDialog
* (
73 MediaGalleriesDialogController
*)> CreateDialogCallback
;
74 typedef std::map
<MediaGalleryPrefId
, Entry
> ScanResults
;
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
);
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
);
91 ~MediaGalleriesScanResultController() override
;
94 friend class MediaGalleriesScanResultControllerTest
;
95 friend class MediaGalleriesScanResultCocoaTest
;
96 friend class TestMediaGalleriesAddScanResultsFunction
;
98 // Bottom half of constructor -- called when |preferences_| is initialized.
99 void OnPreferencesInitialized();
101 // Used to keep the dialog in sync with the preferences.
102 void OnPreferenceUpdate(const std::string
& extension_id
);
104 // Used to keep the dialog in sync with attached and detached devices.
105 void OnRemovableDeviceUpdate(const std::string device_id
);
107 Profile
* GetProfile() const;
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
;
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
;
131 // The web contents from which the request originated.
132 content::WebContents
* web_contents_
;
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_
;
138 // The scan results that aren't blacklisted and this extension doesn't
139 // already have access to.
140 ScanResults scan_results_
;
142 // The set of scan results which should be removed (blacklisted) - unless
143 // the user clicks Cancel.
144 MediaGalleryPrefIdSet results_to_remove_
;
146 // Callback to run when the dialog closes.
147 base::Closure on_finish_
;
149 // The model that tracks galleries and extensions' permissions.
150 // This is the authoritative source for gallery information.
151 MediaGalleriesPreferences
* preferences_
;
153 // Creates the dialog. Only changed for unit tests.
154 CreateDialogCallback create_dialog_callback_
;
156 // The view that's showing.
157 scoped_ptr
<MediaGalleriesDialog
> dialog_
;
159 scoped_ptr
<MediaGalleryContextMenu
> context_menu_
;
161 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesScanResultController
);
164 #endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_SCAN_RESULT_CONTROLLER_H_