on xenial help sign in
Check purchase state to determine if purchase was cancelled and hide progress. Fixes: 1362622, 1370651

Approved by: Michael Zanetti, Alejandro J. Cura

commitb93892fd1585adf6a44ba69bd071e387707ef425 authorRodney Dawes <rodney.dawes@canonical.com> dateThu 18 Sep 2014, 21:26 (12 years ago) parent992b0b26f4e9a4
6 files changed+74−2
plugins/Ubuntu/Payments/Payments.cpp+21−1 plugins/Ubuntu/Payments/Payments.h+4 qml/Dash/Previews/PreviewPayments.qml+6 tests/mocks/Ubuntu/Payments/MockPayments.cpp+3−1 tests/mocks/Ubuntu/Payments/MockPayments.h+1 tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+39
plugins/Ubuntu/Payments/Payments.cpp+21−1
@@ -41,13 +41,23 @@ static void observer(PayPackage* /* package */, const char* itemid, PayPackageIt
4141 case PAY_PACKAGE_ITEM_STATUS_PURCHASED:
4242 Q_EMIT self->purchaseCompleted();
4343 break;
44+ case PAY_PACKAGE_ITEM_STATUS_PURCHASING:
45+ self->setPurchasing(true);
46+ break;
47+ case PAY_PACKAGE_ITEM_STATUS_NOT_PURCHASED:
48+ if (self->purchasing()) {
49+ self->setPurchasing(false);
50+ Q_EMIT self->purchaseCancelled();
51+ }
52+ break;
4453 default:
4554 break;
4655 }
4756}
4857
4958Payments::Payments(QObject *parent)
50− : QObject(parent)
59+ : QObject(parent),
60+ m_purchasing(false)
5161{
5262 m_package = pay_package_new("click-scope");
5363 pay_package_item_observer_install(m_package, observer, this);
@@ -80,6 +90,11 @@ QString Payments::formattedPrice() const
8090 return locale.toCurrencyString(m_price, m_currency);
8191}
8292
93+bool Payments::purchasing() const
94+{
95+ return m_purchasing;
96+}
97+
8398void Payments::setCurrency(const QString &currency)
8499{
85100 if(m_currency != currency) {
@@ -112,6 +127,11 @@ void Payments::setStoreItemId(const QString &store_item_id)
112127 pay_package_item_start_verification(m_package, m_store_item_id.toLocal8Bit().data());
113128}
114129
130+void Payments::setPurchasing(bool is_purchasing)
131+{
132+ m_purchasing = is_purchasing;
133+}
134+
115135void Payments::start()
116136{
117137 pay_package_item_start_purchase(m_package, m_store_item_id.toLocal8Bit().data());
plugins/Ubuntu/Payments/Payments.h+4
@@ -39,10 +39,12 @@ public:
3939 double price() const;
4040 QString storeItemId() const;
4141 QString formattedPrice() const;
42+ bool purchasing() const;
4243
4344 void setCurrency(const QString& currency);
4445 void setPrice(const double price);
4546 void setStoreItemId(const QString& store_item_id);
47+ void setPurchasing(bool is_purchasing);
4648 Q_INVOKABLE void start();
4749
4850Q_SIGNALS:
@@ -53,11 +55,13 @@ Q_SIGNALS:
5355
5456 void purchaseError(const QString &error);
5557 void purchaseCompleted();
58+ void purchaseCancelled();
5659
5760private:
5861 QString m_currency;
5962 double m_price;
6063 QString m_store_item_id;
64+ bool m_purchasing;
6165
6266 PayPackage *m_package;
6367};
qml/Dash/Previews/PreviewPayments.qml+6
@@ -63,6 +63,12 @@ PreviewWidget {
6363 paymentButton.opacity = 1;
6464 root.triggered(widgetId, "purchaseError", source);
6565 }
66+ onPurchaseCancelled: {
67+ paymentButton.opacity = 1;
68+ // DO NOT emit the signal right now, as it causes a new
69+ // preview to be requested, when that is not what we want.
70+ //root.triggered(widgetId, "purchaseCancelled", source);
71+ }
6672 }
6773 }
6874
tests/mocks/Ubuntu/Payments/MockPayments.cpp+3−1
@@ -84,7 +84,9 @@ void MockPayments::start()
8484
8585void MockPayments::process()
8686{
87− if (m_store_item_id == "com.example.invalid") {
87+ if (m_store_item_id == "com.example.cancel") {
88+ Q_EMIT purchaseCancelled();
89+ } else if (m_store_item_id == "com.example.invalid") {
8890 Q_EMIT purchaseError("Purchase failed.");
8991 } else {
9092 Q_EMIT purchaseCompleted();
tests/mocks/Ubuntu/Payments/MockPayments.h+1
@@ -51,6 +51,7 @@ Q_SIGNALS:
5151
5252 void purchaseError(const QString &error);
5353 void purchaseCompleted();
54+ void purchaseCancelled();
5455
5556private:
5657 QString m_currency;
tests/qmltests/Dash/Previews/tst_PreviewPayments.qml+39
@@ -33,6 +33,10 @@ Rectangle {
3333 "source": { "price" : 0.99, "currency": "USD", "store_item_id": "com.example.invalid" }
3434 }
3535
36+ property var jsonPurchaseCancel: {
37+ "source": { "price" : 0.99, "currency": "USD", "store_item_id": "com.example.cancel" }
38+ }
39+
3640 SignalSpy {
3741 id: spy
3842 target: previewPayments
@@ -160,5 +164,40 @@ Rectangle {
160164 compare(args[1], "purchaseError");
161165 compare(args[2], jsonPurchaseError["source"]);
162166 }
167+
168+ function test_purchase_cancelled() {
169+ // The mock Payments triggers cancellation when com.example.cancel
170+ // is passed to it as store_item_id. Exercise it here
171+ previewPayments.widgetData = jsonPurchaseCancel;
172+
173+ var button = findChild(previewPayments, "paymentButton");
174+ var progress = findChild(previewPayments, "loadingBar");
175+ verify(button, "Button not found.");
176+ verify(progress, "Progress not found.");
177+
178+ mouseClick(button, button.width / 2, button.height / 2);
179+
180+ tryCompare(progress, "visible", true);
181+ tryCompare(progress, "opacity", 1);
182+ tryCompare(button, "visible", false);
183+ tryCompare(button, "opacity", 0);
184+
185+ paymentClient.process();
186+
187+ // Signal is not used at the moment, to avoid preview refresh.
188+ /*
189+ *spy.wait();
190+ *
191+ * var args = spy.signalArguments[0];
192+ * compare(args[0], "previewPayments");
193+ * compare(args[1], "purchaseCancelled");
194+ * compare(args[2], jsonPurchaseCancel["source"]);
195+ */
196+
197+ tryCompare(progress, "visible", false);
198+ tryCompare(progress, "opacity", 0);
199+ tryCompare(button, "visible", true);
200+ tryCompare(button, "opacity", 1);
201+ }
163202 }
164203}