Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/payments/payment_request_dialog.h" | |
| 6 | |
| 5 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 6 #include "chrome/browser/payments/payment_request_impl.h" | 8 #include "chrome/browser/payments/payment_request_impl.h" |
| 7 #include "chrome/browser/ui/views/payments/payment_request_dialog.h" | 9 #include "chrome/browser/ui/views/payments/payment_dialog_state.h" |
| 10 #include "chrome/browser/ui/views/payments/payment_sheet_state.h" | |
| 8 #include "components/constrained_window/constrained_window_views.h" | 11 #include "components/constrained_window/constrained_window_views.h" |
| 9 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
| 13 #include "ui/views/animation/bounds_animator_observer.h" | |
| 10 #include "ui/views/layout/fill_layout.h" | 14 #include "ui/views/layout/fill_layout.h" |
| 11 | 15 |
| 12 namespace chrome { | 16 namespace chrome { |
| 13 | 17 |
| 14 void ShowPaymentRequestDialog(payments::PaymentRequestImpl* impl) { | 18 void ShowPaymentRequestDialog(payments::PaymentRequestImpl* impl) { |
| 15 constrained_window::ShowWebModalDialogViews( | 19 constrained_window::ShowWebModalDialogViews( |
| 16 new payments::PaymentRequestDialog(impl), impl->web_contents()); | 20 new payments::PaymentRequestDialog(impl), impl->web_contents()); |
| 17 } | 21 } |
| 18 | 22 |
| 19 } | 23 } |
| 20 | 24 |
| 21 namespace payments { | 25 namespace payments { |
| 22 | 26 |
| 27 // Observes the Slide Out state animation and removes the view when it's done | |
| 28 // being animated, then deletes itself. This takes ownership of the state so | |
| 29 // it's garanteed to be properly disposed of when the animation is over. | |
| 30 class SlideOutObserver : public views::BoundsAnimatorObserver { | |
| 31 public: | |
| 32 SlideOutObserver(std::unique_ptr<PaymentDialogState> state_animating_out, | |
| 33 views::View* parent_view) | |
| 34 : state_animating_out_(std::move(state_animating_out)), | |
| 35 parent_view_(parent_view) {} | |
| 36 | |
| 37 views::View* GetAnimatedView() { | |
| 38 return state_animating_out_->GetView(); | |
| 39 } | |
| 40 | |
| 41 private: | |
| 42 // views::BoundsAnimatorObserver: | |
| 43 void OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) override {} | |
| 44 | |
| 45 void OnBoundsAnimatorDone(views::BoundsAnimator* animator) override { | |
| 46 animator->RemoveObserver(this); | |
| 47 parent_view_->RemoveChildView(state_animating_out_->GetView()); | |
|
sky
2016/12/08 03:58:17
Is this necessary?
anthonyvd
2016/12/08 20:31:22
Ahh, it's not! Because the state being deleted als
| |
| 48 delete this; | |
| 49 } | |
| 50 | |
| 51 std::unique_ptr<PaymentDialogState> state_animating_out_; | |
| 52 views::View* parent_view_; | |
| 53 }; | |
|
sky
2016/12/08 03:58:17
DISALLOW...
anthonyvd
2016/12/08 20:31:22
Done.
| |
| 54 | |
| 23 PaymentRequestDialog::PaymentRequestDialog(PaymentRequestImpl* impl) | 55 PaymentRequestDialog::PaymentRequestDialog(PaymentRequestImpl* impl) |
| 24 : impl_(impl), | 56 : impl_(impl), |
| 25 label_(new views::Label(base::ASCIIToUTF16("Payments dialog"))) { | 57 slide_in_animator_(new views::BoundsAnimator(this)), |
| 58 slide_out_animator_(new views::BoundsAnimator(this)) { | |
| 26 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 59 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 27 SetLayoutManager(new views::FillLayout()); | 60 SetLayoutManager(new views::FillLayout()); |
| 28 AddChildView(label_.get()); | 61 |
| 62 std::unique_ptr<PaymentSheetState> initial_state = | |
| 63 base::MakeUnique<PaymentSheetState>(); | |
| 64 initial_state->AddObserver(this); | |
| 65 state_stack_.push(std::move(initial_state)); | |
| 66 | |
| 67 AddChildView(state_stack_.top()->GetView()); | |
| 29 } | 68 } |
| 30 | 69 |
| 31 PaymentRequestDialog::~PaymentRequestDialog() {} | 70 PaymentRequestDialog::~PaymentRequestDialog() { |
| 71 // Cancel animations to make sure their observer's OnBoundsAnimatorDone is | |
| 72 // called. | |
| 73 slide_in_animator_->Cancel(); | |
|
sky
2016/12/08 03:58:17
Are you sure cancel resluts in OnBoundsAnimatorDon
anthonyvd
2016/12/08 20:31:22
Yes, Cancel() ends up calling BoundsAnimator::Ani
| |
| 74 slide_out_animator_->Cancel(); | |
| 75 } | |
| 76 | |
| 77 void PaymentRequestDialog::PushState( | |
| 78 std::unique_ptr<PaymentDialogState> state) { | |
| 79 state_stack_.top()->SetInteractable(false); | |
| 80 | |
| 81 // First add the new view out of bounds since it'll slide in from right to | |
| 82 // left. | |
| 83 state->GetView()->SetPosition(gfx::Point(x() + width(), y())); | |
|
sky
2016/12/08 03:58:17
I would expect this to SetBounds, by which I mean
anthonyvd
2016/12/08 20:31:22
Done.
| |
| 84 | |
| 85 AddChildView(state->GetView()); | |
| 86 // Animate the new view to be right on top of this one. | |
| 87 slide_in_animator_->AnimateViewTo(state->GetView(), bounds()); | |
|
sky
2016/12/08 03:58:17
bounds() is relative to the parent, where as the v
anthonyvd
2016/12/08 20:31:22
Ah yes, so this only worked because the parent was
| |
| 88 | |
| 89 // Add the new state to the stack so it can be popped later when navigating | |
| 90 // back to the previous screen. | |
| 91 state_stack_.push(std::move(state)); | |
| 92 state_stack_.top()->SetInteractable(true); | |
| 93 } | |
| 94 | |
| 95 void PaymentRequestDialog::PopState() { | |
| 96 state_stack_.top()->SetInteractable(false); | |
| 97 | |
| 98 gfx::Rect destination = bounds(); | |
|
sky
2016/12/08 03:58:17
Similar comment about bounds here, you want a orig
anthonyvd
2016/12/08 20:31:22
Done.
| |
| 99 destination.Offset(width(), 0); | |
| 100 | |
| 101 // This deletes itself. | |
| 102 SlideOutObserver* observer = | |
| 103 new SlideOutObserver(std::move(state_stack_.top()), this); | |
| 104 slide_out_animator_->AddObserver(observer); | |
| 105 | |
| 106 state_stack_.pop(); | |
| 107 DCHECK(!state_stack_.empty()) << "State stack should never be empty"; | |
| 108 | |
| 109 slide_out_animator_->AnimateViewTo(observer->GetAnimatedView(), destination); | |
| 110 state_stack_.top()->SetInteractable(true); | |
| 111 } | |
| 32 | 112 |
| 33 ui::ModalType PaymentRequestDialog::GetModalType() const { | 113 ui::ModalType PaymentRequestDialog::GetModalType() const { |
| 34 return ui::MODAL_TYPE_CHILD; | 114 return ui::MODAL_TYPE_CHILD; |
| 35 } | 115 } |
| 36 | 116 |
| 37 gfx::Size PaymentRequestDialog::GetPreferredSize() const { | 117 gfx::Size PaymentRequestDialog::GetPreferredSize() const { |
| 38 gfx::Size ps = label_->GetPreferredSize(); | 118 return gfx::Size(300, 300); |
|
sky
2016/12/08 03:58:17
How do you know 300x300 is going to be enough?
anthonyvd
2016/12/08 20:31:22
I don't, this is a temporary value until we figure
| |
| 39 ps.Enlarge(200, 200); | |
| 40 return ps; | |
| 41 } | 119 } |
| 42 | 120 |
| 43 bool PaymentRequestDialog::Cancel() { | 121 bool PaymentRequestDialog::Cancel() { |
| 44 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 122 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 45 impl_->Cancel(); | 123 impl_->Cancel(); |
| 46 return true; | 124 return true; |
| 47 } | 125 } |
| 48 | 126 |
| 127 void PaymentRequestDialog::OnOrderSummaryClicked() { | |
| 128 std::unique_ptr<OrderSummaryState> order_summary = | |
| 129 base::MakeUnique<OrderSummaryState>(); | |
| 130 order_summary->AddObserver(this); | |
| 131 PushState(std::move(order_summary)); | |
| 132 } | |
| 133 | |
| 134 void PaymentRequestDialog::OnBackClicked() { | |
| 135 PopState(); | |
| 136 } | |
| 137 | |
| 49 } // namespace payments | 138 } // namespace payments |
| OLD | NEW |