chromium/ios/chrome/browser/infobars/model/infobar_ios.h

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_INFOBARS_MODEL_INFOBAR_IOS_H_
#define IOS_CHROME_BROWSER_INFOBARS_MODEL_INFOBAR_IOS_H_

#import <UIKit/UIKit.h>
#include <memory>

#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "components/infobars/core/infobar.h"
#import "ios/chrome/browser/infobars/model/infobar_controller_delegate.h"
#import "ios/chrome/browser/infobars/model/infobar_type.h"

namespace infobars {
class InfoBarDelegate;
}

// The iOS version of infobars::InfoBar.
class InfoBarIOS : public infobars::InfoBar, public InfoBarControllerDelegate {
 public:
  InfoBarIOS(InfobarType infobar_type,
             std::unique_ptr<infobars::InfoBarDelegate> delegate,
             bool skip_banner = false);
  ~InfoBarIOS() override;
  InfoBarIOS(const InfoBarIOS&) = delete;
  InfoBarIOS& operator=(const InfoBarIOS&) = delete;

  // Observer interface for objects interested in changes to InfoBarIOS.
  class Observer : public base::CheckedObserver {
   public:
    // Called when `infobar`'s accepted() is set to a new value.
    virtual void DidUpdateAcceptedState(InfoBarIOS* infobar) {}

    // Called when `infobar` is destroyed.
    virtual void InfobarDestroyed(InfoBarIOS* infobar) {}
  };

  // Adds and removes observers.
  void AddObserver(Observer* obs) { observers_.AddObserver(obs); }
  void RemoveObserver(Observer* obs) { observers_.RemoveObserver(obs); }

  // Returns the infobar type.
  InfobarType infobar_type() const { return infobar_type_; }

  // Whether or not the infobar has been accepted.  Set to true when the
  // associated action has been executed (e.g. page translation finished), and
  // false if the action has not been executed or has been reverted.
  bool accepted() const { return accepted_; }
  void set_accepted(bool accepted);

  // Whether or not the banner should be skipped. If true if the banner
  // should be skipped but not the badge and subsequent modals.
  bool skip_banner() const { return skip_banner_; }

  // Whether or not the banner should be shown for a longer time and be
  // presented immediately.
  bool high_priority() const { return high_priority_; }
  void set_high_priority(bool high_priority);

  // Whether or not this infobar reference has been removed from its owning
  // InfobarManager.
  bool removed_from_owner() { return removed_from_owner_; }
  void set_removed_from_owner() { removed_from_owner_ = true; }

  // Returns a weak pointer to the infobar.
  base::WeakPtr<InfoBarIOS> GetWeakPtr();

 protected:

 private:
  // InfoBarControllerDelegate overrides:
  bool IsOwned() override;
  void RemoveInfoBar() override;

  base::ObserverList<Observer, /*check_empty=*/true> observers_;
  InfobarType infobar_type_;
  bool accepted_ = false;
  bool skip_banner_ = false;
  bool high_priority_ = false;
  bool removed_from_owner_ = false;
  base::WeakPtrFactory<InfoBarIOS> weak_factory_{this};
};

#endif  // IOS_CHROME_BROWSER_INFOBARS_MODEL_INFOBAR_IOS_H_