root/chrome/browser/ui/autofill/new_credit_card_bubble_controller.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright 2013 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_UI_AUTOFILL_NEW_CREDIT_CARD_BUBBLE_CONTROLLER_H_
#define CHROME_BROWSER_UI_AUTOFILL_NEW_CREDIT_CARD_BUBBLE_CONTROLLER_H_

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "ui/gfx/image/image.h"

class Profile;

namespace content {
class WebContents;
}

namespace autofill {

class NewCreditCardBubbleView;
class AutofillProfile;
class CreditCard;

// A simple wrapper that contains descriptive information about a credit card
// that should be shown in the content of the bubble.
struct CreditCardDescription {
 CreditCardDescription();
 ~CreditCardDescription();
 // The icon of the credit card issuer (i.e. Visa, Mastercard).
 gfx::Image icon;
 // The display name of the card. Shown next to the icon.
 base::string16 name;
 // A longer description of the card being shown in the bubble.
 base::string16 description;
};

////////////////////////////////////////////////////////////////////////////////
//
// NewCreditCardBubbleController
//
//  A class to control showing/hiding a bubble after saved a new card in Chrome.
//  Here's a visual reference to what this bubble looks like:
//
//  @----------------------------------------@
//  |  Bubble title text                     |
//  |                                        |
//  |  [ Card icon ] Card name               |
//  |  Card description that will probably   |
//  |  also span multiple lines.             |
//  |                                        |
//  |  Learn more link                       |
//  @----------------------------------------@
//
////////////////////////////////////////////////////////////////////////////////
class NewCreditCardBubbleController {
 public:
  virtual ~NewCreditCardBubbleController();

  // Show a bubble informing the user that new credit card data has been saved.
  // This bubble points to the settings menu. Ownership of |new_card|
  // and |billing_profile| are transferred by this call.
  static void Show(content::WebContents* web_contents,
                   scoped_ptr<CreditCard> new_card,
                   scoped_ptr<AutofillProfile> billing_profile);

  // The bubble's title text.
  const base::string16& TitleText() const;

  // A card description to show in the bubble.
  const CreditCardDescription& CardDescription() const;

  // The text of the link shown at the bubble of the bubble.
  const base::string16& LinkText() const;

  // Called when |bubble_| is destroyed.
  void OnBubbleDestroyed();

  // Called when the link at the bottom of the bubble is clicked.
  void OnLinkClicked();

  // Returns the profile this bubble is associated with.
  Profile* profile() { return profile_; }

  // Returns the WebContents this bubble is associated with.
  content::WebContents* web_contents() { return web_contents_; }

 protected:
  // Create a bubble attached to |profile|.
  explicit NewCreditCardBubbleController(content::WebContents* web_contents);

  // Creates and returns an Autofill credit card bubble. Exposed for testing.
  virtual base::WeakPtr<NewCreditCardBubbleView> CreateBubble();

  // Returns a weak reference to |bubble_|. May be invalid/NULL.
  virtual base::WeakPtr<NewCreditCardBubbleView> bubble();

  // Show a bubble notifying the user that new credit card data has been saved.
  // Exposed for testing.
  virtual void SetupAndShow(scoped_ptr<CreditCard> new_card,
                            scoped_ptr<AutofillProfile> billing_profile);

 private:
  friend class NewCreditCardBubbleCocoaUnitTest;

  // Hides |bubble_| if it exists.
  void Hide();

  // The profile this bubble is associated with.
  // TODO(dbeam): Break Views dependency on Profile and remove |profile_|.
  Profile* const profile_;

  // The web contents associated with this bubble.
  content::WebContents* const web_contents_;

  // The newly saved credit card and assocated billing information.
  scoped_ptr<CreditCard> new_card_;
  scoped_ptr<AutofillProfile> billing_profile_;

  // The title text of the bubble.
  const base::string16 title_text_;

  // The bubble's link text.
  const base::string16 link_text_;

  // Strings and descriptions that are generated based on |new_card_| and
  // |billing_profile_|.
  struct CreditCardDescription card_desc_;

  // A bubble view that's created by calling either |Show*()| method; owned by
  // the native widget/hierarchy, not this class (though this class must outlive
  // |bubble_|). NULL in many cases.
  base::WeakPtr<NewCreditCardBubbleView> bubble_;

  // A weak pointer factory for |Create()|.
  base::WeakPtrFactory<NewCreditCardBubbleController> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(NewCreditCardBubbleController);
};

}  // namespace autofill

#endif  // CHROME_BROWSER_UI_AUTOFILL_NEW_CREDIT_CARD_BUBBLE_CONTROLLER_H_

/* [<][>][^][v][top][bottom][index][help] */