blob: a56731589ae071578e77b36c278d92ce1c5fa24c [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_DIALOG_CONTROLLER_H_
#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_DIALOG_CONTROLLER_H_
#include <list>
#include <map>
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "chrome/browser/media_galleries/media_galleries_preferences.h"
#include "chrome/browser/storage_monitor/removable_storage_observer.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/shell_dialogs/select_file_dialog.h"
namespace content {
class WebContents;
}
namespace extensions {
class Extension;
}
namespace ui {
class MenuModel;
}
class GalleryContextMenuModel;
class MediaGalleriesDialogController;
class Profile;
// The view.
class MediaGalleriesDialog {
public:
virtual ~MediaGalleriesDialog();
// Tell the dialog to update its display list of galleries.
virtual void UpdateGalleries() = 0;
// Constructs a platform-specific dialog owned and controlled by |controller|.
static MediaGalleriesDialog* Create(
MediaGalleriesDialogController* controller);
};
// The controller is responsible for handling the logic of the dialog and
// interfacing with the model (i.e., MediaGalleriesPreferences). It shows
// the dialog and owns itself.
class MediaGalleriesDialogController
: public ui::SelectFileDialog::Listener,
public RemovableStorageObserver,
public MediaGalleriesPreferences::GalleryChangeObserver {
public:
struct GalleryPermission {
GalleryPermission(const MediaGalleryPrefInfo& pref_info, bool allowed)
: pref_info(pref_info), allowed(allowed) {}
GalleryPermission() {}
MediaGalleryPrefInfo pref_info;
bool allowed;
};
typedef std::vector<GalleryPermission> GalleryPermissionsVector;
// The constructor creates a dialog controller which owns itself.
MediaGalleriesDialogController(content::WebContents* web_contents,
const extensions::Extension& extension,
const base::Closure& on_finish);
// The title of the dialog view.
base::string16 GetHeader() const;
// Explanatory text directly below the title.
base::string16 GetSubtext() const;
// Header for unattached devices part of the dialog.
base::string16 GetUnattachedLocationsHeader() const;
// Initial state of whether the dialog's confirmation button will be enabled.
bool HasPermittedGalleries() const;
// Get the set of permissions to attached galleries.
virtual GalleryPermissionsVector AttachedPermissions() const;
// Get the set of permissions to unattached galleries.
virtual GalleryPermissionsVector UnattachedPermissions() const;
// Called when the add-folder button in the dialog is clicked.
virtual void OnAddFolderClicked();
// A checkbox beside a gallery permission was checked. The full set
// of gallery permissions checkbox settings is sent on every checkbox toggle.
virtual void DidToggleGalleryId(MediaGalleryPrefId pref_id,
bool enabled);
virtual void DidToggleNewGallery(const MediaGalleryPrefInfo& gallery,
bool enabled);
// The forget command in the context menu was selected.
virtual void DidForgetGallery(MediaGalleryPrefId pref_id);
// The dialog is being deleted.
virtual void DialogFinished(bool accepted);
virtual content::WebContents* web_contents();
ui::MenuModel* GetContextMenuModel(MediaGalleryPrefId id);
protected:
// For use with tests.
explicit MediaGalleriesDialogController(
const extensions::Extension& extension);
virtual ~MediaGalleriesDialogController();
private:
// This type keeps track of media galleries already known to the prefs system.
typedef std::map<MediaGalleryPrefId, GalleryPermission>
KnownGalleryPermissions;
// Bottom half of constructor -- called when |preferences_| is initialized.
void OnPreferencesInitialized();
// SelectFileDialog::Listener implementation:
virtual void FileSelected(const base::FilePath& path,
int index,
void* params) OVERRIDE;
// RemovableStorageObserver implementation.
// Used to keep dialog in sync with removable device status.
virtual void OnRemovableStorageAttached(const StorageInfo& info) OVERRIDE;
virtual void OnRemovableStorageDetached(const StorageInfo& info) OVERRIDE;
// MediaGalleriesPreferences::GalleryChangeObserver implementations.
// Used to keep the dialog in sync when the preferences change.
virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
const std::string& extension_id,
MediaGalleryPrefId pref_id) OVERRIDE;
virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
const std::string& extension_id,
MediaGalleryPrefId pref_id) OVERRIDE;
virtual void OnGalleryAdded(MediaGalleriesPreferences* pref,
MediaGalleryPrefId pref_id) OVERRIDE;
virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
MediaGalleryPrefId pref_id) OVERRIDE;
virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref,
MediaGalleryPrefId pref_id) OVERRIDE;
// Populates |known_galleries_| from |preferences_|. Subsequent calls merge
// into |known_galleries_| and do not change permissions for user toggled
// galleries.
void InitializePermissions();
// Saves state of |known_galleries_| and |new_galleries_| to model.
void SavePermissions();
// Updates the model and view when |preferences_| changes. Some of the
// possible changes includes a gallery getting blacklisted, or a new
// auto detected gallery becoming available.
void UpdateGalleriesOnPreferencesEvent();
// Updates the model and view when a device is attached or detached.
void UpdateGalleriesOnDeviceEvent(const std::string& device_id);
// Fill |permissions| with a sorted list of either attached or unattached
// gallery permissions.
void FillPermissions(bool attached,
GalleryPermissionsVector* permissions) const;
Profile* GetProfile();
// The web contents from which the request originated.
content::WebContents* web_contents_;
// This is just a reference, but it's assumed that it won't become invalid
// while the dialog is showing.
const extensions::Extension* extension_;
// This map excludes those galleries which have been blacklisted; it only
// counts active known galleries.
KnownGalleryPermissions known_galleries_;
// Galleries in |known_galleries_| that the user have toggled.
MediaGalleryPrefIdSet toggled_galleries_;
// Map of new galleries the user added, but have not saved. This list should
// never overlap with |known_galleries_|.
GalleryPermissionsVector new_galleries_;
// Callback to run when the dialog closes.
base::Closure on_finish_;
// The model that tracks galleries and extensions' permissions.
// This is the authoritative source for gallery information.
MediaGalleriesPreferences* preferences_;
// The view that's showing.
scoped_ptr<MediaGalleriesDialog> dialog_;
scoped_refptr<ui::SelectFileDialog> select_folder_dialog_;
scoped_ptr<ui::MenuModel> context_menu_model_;
scoped_ptr<GalleryContextMenuModel> gallery_menu_model_;
DISALLOW_COPY_AND_ASSIGN(MediaGalleriesDialogController);
};
#endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_GALLERIES_DIALOG_CONTROLLER_H_