blob: e89c2ba1de1b8c83f5b59c673380bd47eea86256 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DOWNLOAD_BUBBLE_DOWNLOAD_DISPLAY_CONTROLLER_H_
#define CHROME_BROWSER_DOWNLOAD_BUBBLE_DOWNLOAD_DISPLAY_CONTROLLER_H_
#include "base/memory/raw_ptr.h"
#include "base/power_monitor/power_observer.h"
#include "base/timer/timer.h"
#include "chrome/browser/download/offline_item_model.h"
#include "chrome/browser/ui/download/download_display.h"
#include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
#include "chrome/browser/ui/exclusive_access/fullscreen_observer.h"
#include "components/download/content/public/all_download_item_notifier.h"
#include "components/offline_items_collection/core/offline_content_aggregator.h"
#include "components/offline_items_collection/core/offline_content_provider.h"
struct DownloadBubbleDisplayInfo;
class DownloadBubbleUIController;
class DownloadDisplay;
namespace base {
class TimeDelta;
class OneShotTimer;
} // namespace base
namespace offline_items_collection {
struct ContentId;
}
// Used to control the DownloadToolbar Button, through the DownloadDisplay
// interface. Supports both regular Download and Offline items. When in the
// future OfflineItems include regular Download on Desktop platforms,
// we can remove AllDownloadItemNotifier::Observer.
// TODO(chlily): Consolidate this with DownloadBubbleUIController.
class DownloadDisplayController : public FullscreenObserver,
public base::PowerSuspendObserver {
public:
DownloadDisplayController(DownloadDisplay* display,
Browser* browser,
DownloadBubbleUIController* bubble_controller);
DownloadDisplayController(const DownloadDisplayController&) = delete;
DownloadDisplayController& operator=(const DownloadDisplayController&) =
delete;
~DownloadDisplayController() override;
// Notifies the controller that the button is pressed. Called by `display_`.
void OnButtonPressed();
// Handles the button pressed event. Called by the profile level controller.
void HandleButtonPressed();
// Common methods for new downloads or new offline items.
// These methods are virtual so that they can be overridden for fake
// controllers in testing.
// Called from bubble controller when new item(s) are added.
// |show_animation| specifies whether a small animated arrow should be shown.
virtual void OnNewItem(bool show_animation);
// Called from bubble controller when an item is updated, with |is_done|
// indicating if it was marked done, and with |may_show_details| indicating
// whether the partial view can be shown. (Whether the partial view is
// actually shown may depend on the state of the other downloads.)
virtual void OnUpdatedItem(bool is_done, bool may_show_details);
// Called from bubble controller when an item is deleted.
virtual void OnRemovedItem(const ContentId& id);
// Asks `display_` to hide the toolbar button. Does nothing if the toolbar
// button is already hidden.
void HideToolbarButton();
// Asks `display_` to hide the toolbar button details. Does nothing if the
// details are already hidden.
void HideBubble();
// Start listening to full screen changes. This is separate from the
// constructor as the exclusive access manager is constructed after
// BrowserWindow.
void ListenToFullScreenChanges();
// FullScreenObserver
void OnFullscreenStateChanged() override;
// PowerSuspendObserver
void OnResume() override;
// Returns the DownloadDisplay. Should always return a valid display.
DownloadDisplay* download_display_for_testing() { return display_; }
void OpenSecuritySubpage(const offline_items_collection::ContentId& id);
private:
friend class DownloadDisplayControllerTest;
// Gets info about all models to display and progress ring info from the
// update service, then updates the toolbar button state accordingly. Returns
// the info about all models.
const DownloadBubbleDisplayInfo& UpdateButtonStateFromUpdateService();
// Obtains and announces accessible alerts from the update service.
void HandleAccessibleAlerts();
// Stops and restarts `icon_disappearance_timer_`. The toolbar button will
// be hidden after the `interval`.
void ScheduleToolbarDisappearance(base::TimeDelta interval);
// Stops and restarts `icon_inactive_timer_`. The toolbar button will
// be changed to inactive state after the `interval`.
void ScheduleToolbarInactive(base::TimeDelta interval);
// Asks `display_` to show the toolbar button. Does nothing if the toolbar
// button is already showing.
void ShowToolbarButton();
// Updates the icon state of the `display_`, including the progress ring.
void UpdateToolbarButtonState(
const DownloadBubbleDisplayInfo& info,
const DownloadDisplay::ProgressInfo& progress_info);
// Asks `display_` to make the download icon inactive.
void UpdateDownloadIconToInactive();
// Decides whether the toolbar button should be shown when it is created.
virtual void MaybeShowButtonWhenCreated();
// The pointer is created in ToolbarView and owned by ToolbarView.
raw_ptr<DownloadDisplay> const display_;
raw_ptr<Browser> browser_;
base::ScopedObservation<FullscreenController, FullscreenObserver>
observation_{this};
base::OneShotTimer icon_disappearance_timer_;
base::OneShotTimer icon_inactive_timer_;
bool fullscreen_notification_shown_ = false;
bool should_show_details_on_exit_fullscreen_ = false;
// DownloadDisplayController and DownloadBubbleUIController have the same
// lifetime. Both are owned, constructed together, and destructed together by
// DownloadToolbarButtonView. If one is valid, so is the other.
raw_ptr<DownloadBubbleUIController, DanglingUntriaged> bubble_controller_;
base::WeakPtrFactory<DownloadDisplayController> weak_factory_{this};
};
#endif // CHROME_BROWSER_DOWNLOAD_BUBBLE_DOWNLOAD_DISPLAY_CONTROLLER_H_