Skip to content

Commit 4991c75

Browse files
committed
implement new gh mobile money flow for mtn, tigo and vodafone
1 parent e353b98 commit 4991c75

File tree

11 files changed

+287
-12
lines changed

11 files changed

+287
-12
lines changed

raveandroid/src/main/java/com/flutterwave/raveandroid/Payload.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,11 @@ public void setNetwork(String network) {
572572

573573
public String network;
574574

575+
public String voucher;
575576

577+
public void setVoucher(String voucher) {
578+
this.voucher = voucher;
579+
}
576580

577581
public void setIs_mobile_money_gh(String is_mobile_money_gh) {
578582
this.is_mobile_money_gh = is_mobile_money_gh;

raveandroid/src/main/java/com/flutterwave/raveandroid/PayloadBuilder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class PayloadBuilder {
2121
private String payment_plan;
2222
private String network;
2323
private String bvn;
24+
private String voucher;
2425

2526
public PayloadBuilder setIs_mobile_money_gh(String is_mobile_money_gh) {
2627
this.is_mobile_money_gh = is_mobile_money_gh;
@@ -66,6 +67,11 @@ public PayloadBuilder setExpirymonth(String expirymonth) {
6667
return this;
6768
}
6869

70+
public PayloadBuilder setVoucher(String voucher) {
71+
this.voucher = voucher;
72+
return this;
73+
}
74+
6975
public PayloadBuilder setPBFPubKey(String pbfPubKey) {
7076
this.pbfPubKey = pbfPubKey;
7177
return this;
@@ -192,6 +198,7 @@ public Payload createGhMobileMoneyPayload() {
192198
firstname, currency, country, amount, email, device_fingerprint, txRef, pbfPubKey);
193199
payload.setIs_mobile_money_gh("1");
194200
payload.setPayment_type("mobilemoneygh");
201+
payload.setVoucher(voucher);
195202
payload.setNetwork(network);
196203
return payload;
197204
}

raveandroid/src/main/java/com/flutterwave/raveandroid/data/Callbacks.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.flutterwave.raveandroid.responses.ChargeResponse;
55
import com.flutterwave.raveandroid.responses.FeeCheckResponse;
6+
import com.flutterwave.raveandroid.responses.GhChargeResponse;
67
import com.flutterwave.raveandroid.responses.RequeryResponse;
78
import com.flutterwave.raveandroid.responses.RequeryResponsev2;
89

@@ -14,6 +15,11 @@
1415

1516
public class Callbacks {
1617

18+
public interface OnGhanaChargeRequestComplete {
19+
void onSuccess(GhChargeResponse response, String responseAsJSONString);
20+
void onError(String message, String responseAsJSONString);
21+
}
22+
1723
public interface OnChargeRequestComplete {
1824
void onSuccess(ChargeResponse response, String responseAsJSONString);
1925
void onError(String message, String responseAsJSONString);

raveandroid/src/main/java/com/flutterwave/raveandroid/data/DataRequest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public interface DataRequest {
1414

1515
interface NetworkRequest {
1616
void chargeCard(ChargeRequestBody chargeRequestBody, Callbacks.OnChargeRequestComplete callback);
17+
void chargeGhanaMobileMoneyWallet(ChargeRequestBody chargeRequestBody, Callbacks.OnGhanaChargeRequestComplete callback);
1718
void validateChargeCard(ValidateChargeBody cardRequestBody, Callbacks.OnValidateChargeCardRequestComplete callback);
1819
void validateAccountCard(ValidateChargeBody cardRequestBody, Callbacks.OnValidateChargeCardRequestComplete callback);
1920
void requeryTx(RequeryRequestBody requeryRequestBody, Callbacks.OnRequeryRequestComplete callback);

raveandroid/src/main/java/com/flutterwave/raveandroid/data/NetworkRequestImpl.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.flutterwave.raveandroid.card.ChargeRequestBody;
99
import com.flutterwave.raveandroid.responses.ChargeResponse;
1010
import com.flutterwave.raveandroid.responses.FeeCheckResponse;
11+
import com.flutterwave.raveandroid.responses.GhChargeResponse;
1112
import com.flutterwave.raveandroid.responses.RequeryResponse;
1213
import com.flutterwave.raveandroid.responses.RequeryResponsev2;
1314
import com.google.gson.Gson;
@@ -61,7 +62,6 @@ public void chargeCard(ChargeRequestBody body, final Callbacks.OnChargeRequestCo
6162

6263
createService();
6364

64-
// Call<ChargeResponse> call = service.charge(body);
6565
Call<String> call = service.charge(body);
6666

6767
call.enqueue(new Callback<String>() {
@@ -94,6 +94,43 @@ public void onFailure(Call<String> call, Throwable t) {
9494

9595
}
9696

97+
@Override
98+
public void chargeGhanaMobileMoneyWallet(ChargeRequestBody body, final Callbacks.OnGhanaChargeRequestComplete callback) {
99+
100+
createService();
101+
102+
Call<String> call = service.charge(body);
103+
104+
call.enqueue(new Callback<String>() {
105+
@Override
106+
public void onResponse(Call<String> call, Response<String> response) {
107+
108+
if (response.isSuccessful()) {
109+
Gson gson = new Gson();
110+
Type type = new TypeToken<GhChargeResponse>() {}.getType();
111+
GhChargeResponse chargeResponse = gson.fromJson(response.body(), type);
112+
callback.onSuccess(chargeResponse, response.body());
113+
}
114+
else {
115+
try {
116+
String errorBody = response.errorBody().string();
117+
ErrorBody error = parseErrorJson(errorBody);
118+
callback.onError(error.getMessage(), errorBody);
119+
} catch (IOException | NullPointerException e) {
120+
e.printStackTrace();
121+
callback.onError("error", errorParsingError);
122+
}
123+
}
124+
}
125+
126+
@Override
127+
public void onFailure(Call<String> call, Throwable t) {
128+
callback.onError(t.getMessage(), "");
129+
}
130+
});
131+
132+
}
133+
97134
@Override
98135
public void validateChargeCard(ValidateChargeBody body, final Callbacks.OnValidateChargeCardRequestComplete callback) {
99136

raveandroid/src/main/java/com/flutterwave/raveandroid/ghmobilemoney/GhMobileMoneyFragment.java

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import android.support.design.widget.TextInputLayout;
1010
import android.support.v4.app.Fragment;
1111
import android.support.v7.app.AlertDialog;
12+
import android.text.Html;
1213
import android.util.Log;
1314
import android.view.LayoutInflater;
1415
import android.view.View;
1516
import android.view.ViewGroup;
17+
import android.widget.AdapterView;
1618
import android.widget.ArrayAdapter;
1719
import android.widget.Button;
1820
import android.widget.Spinner;
21+
import android.widget.TextView;
1922
import android.widget.Toast;
2023

2124
import com.flutterwave.raveandroid.Payload;
@@ -42,6 +45,10 @@ public class GhMobileMoneyFragment extends Fragment implements GhMobileMoneyCont
4245
private ProgressDialog pollingProgressDialog ;
4346
GhMobileMoneyPresenter presenter;
4447
Spinner networkSpinner;
48+
TextView instructionsTv;
49+
TextInputEditText voucherEt;
50+
TextInputLayout voucherTil;
51+
String validateInstructions;
4552

4653
@Override
4754
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -56,6 +63,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
5663
phoneEt = (TextInputEditText) v.findViewById(R.id.rave_phoneEt);
5764
phoneTil = (TextInputLayout) v.findViewById(R.id.rave_phoneTil);
5865
networkSpinner = (Spinner) v.findViewById(R.id.rave_networkSpinner);
66+
voucherEt = (TextInputEditText) v.findViewById(R.id.rave_voucherEt);
67+
voucherTil = (TextInputLayout) v.findViewById(R.id.rave_voucherTil);
68+
instructionsTv = (TextView) v.findViewById(R.id.instructionsTv);
5969

6070
Button payButton = (Button) v.findViewById(R.id.rave_payButton);
6171

@@ -80,15 +90,67 @@ public void onClick(View v) {
8090
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
8191
networkSpinner.setAdapter(adapter);
8292

93+
final String vodafoneInstruction = getResources().getString(R.string.vodafone_msg);
94+
final String[] networks = getResources().getStringArray(R.array.gh_mobile_money_networks);
95+
final String mtnValidateInstruction = getResources().getString(R.string.mtn_validate_instructions);
96+
final String tigoValidateInstruction = getResources().getString(R.string.tigo_validate_instructions);
97+
98+
networkSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
99+
@Override
100+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
101+
if (position < networks.length) {
102+
String network = networks[position];
103+
104+
if (position == 0) {
105+
showInstructionsAndVoucher(false);
106+
validateInstructions = "Checking transaction status. \nPlease wait";
107+
}
108+
109+
if (network.equalsIgnoreCase("mtn")) {
110+
validateInstructions = mtnValidateInstruction;
111+
showInstructionsAndVoucher(false);
112+
}
113+
else if (network.equalsIgnoreCase("tigo")) {
114+
validateInstructions = tigoValidateInstruction;
115+
showInstructionsAndVoucher(false);
116+
}
117+
else if (network.equalsIgnoreCase("vodafone")) {
118+
validateInstructions = "Checking transaction status. \nPlease wait";
119+
showInstructionsAndVoucher(true);
120+
instructionsTv.setText(Html.fromHtml(vodafoneInstruction));
121+
}
122+
}
123+
}
124+
125+
@Override
126+
public void onNothingSelected(AdapterView<?> parent) {
127+
showInstructionsAndVoucher(false);
128+
}
129+
});
130+
83131
return v;
84132
}
85133

134+
private void showInstructionsAndVoucher(boolean show) {
135+
136+
if (show) {
137+
voucherTil.setVisibility(View.VISIBLE);
138+
instructionsTv.setVisibility(View.VISIBLE);
139+
}
140+
else {
141+
voucherTil.setVisibility(View.GONE);
142+
instructionsTv.setVisibility(View.GONE);
143+
}
144+
}
145+
86146
private void clearErrors() {
87147
amountTil.setError(null);
88148
phoneTil.setError(null);
149+
voucherTil.setError(null);
89150

90151
amountTil.setErrorEnabled(false);
91152
phoneTil.setErrorEnabled(false);
153+
voucherTil.setErrorEnabled(false);
92154

93155
}
94156

@@ -100,6 +162,7 @@ private void validate() {
100162

101163
String amount = amountEt.getText().toString();
102164
String phone = phoneEt.getText().toString();
165+
String voucher = voucherEt.getText().toString();
103166

104167
try {
105168
double amnt = Double.parseDouble(amount);
@@ -127,6 +190,11 @@ private void validate() {
127190
showToast("Select a network");
128191
}
129192

193+
if (voucherTil.getVisibility() == View.VISIBLE && voucher.length() == 0) {
194+
valid = false;
195+
voucherTil.setError("Enter a valid voucher code");
196+
}
197+
130198
if (valid) {
131199

132200
ravePayInitializer.setAmount(Double.parseDouble(amount));
@@ -145,6 +213,7 @@ private void validate() {
145213
.setMeta(ravePayInitializer.getMeta())
146214
.setSubAccount(ravePayInitializer.getSubAccount())
147215
.setNetwork(network)
216+
.setVoucher(voucher)
148217
.setPhonenumber(phone)
149218
.setPBFPubKey(ravePayInitializer.getPublicKey())
150219
.setDevice_fingerprint(Utils.getDeviceImei(getActivity()));
@@ -160,8 +229,6 @@ private void validate() {
160229

161230
}
162231

163-
164-
165232
@Override
166233
public void showProgressIndicator(boolean active) {
167234

@@ -186,11 +253,12 @@ public void showPollingIndicator(boolean active) {
186253

187254
if(pollingProgressDialog == null) {
188255
pollingProgressDialog = new ProgressDialog(getActivity());
189-
pollingProgressDialog.setMessage("Checking transaction status. \nPlease wait");
256+
pollingProgressDialog.setCanceledOnTouchOutside(false);
257+
pollingProgressDialog.setMessage(Html.fromHtml(validateInstructions));
190258
}
191259

192260
if (active && !pollingProgressDialog.isShowing()) {
193-
pollingProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
261+
pollingProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL PAYMENT", new DialogInterface.OnClickListener() {
194262
@Override
195263
public void onClick(DialogInterface dialog, int which) {
196264
pollingProgressDialog.dismiss();
@@ -266,6 +334,8 @@ public void showFetchFeeFailed(String s) {
266334

267335
@Override
268336
public void onPaymentFailed(String message, String responseAsJSONString) {
337+
338+
if (pollingProgressDialog != null && !pollingProgressDialog.isShowing()) { pollingProgressDialog.dismiss(); }
269339
Intent intent = new Intent();
270340
intent.putExtra("response", responseAsJSONString);
271341
if (getActivity() != null) {

raveandroid/src/main/java/com/flutterwave/raveandroid/ghmobilemoney/GhMobileMoneyPresenter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.flutterwave.raveandroid.mpesa.MpesaContract;
1616
import com.flutterwave.raveandroid.responses.ChargeResponse;
1717
import com.flutterwave.raveandroid.responses.FeeCheckResponse;
18+
import com.flutterwave.raveandroid.responses.GhChargeResponse;
1819
import com.flutterwave.raveandroid.responses.RequeryResponse;
1920
import com.flutterwave.raveandroid.responses.RequeryResponsev2;
2021

@@ -78,9 +79,9 @@ public void chargeGhMobileMoney(Payload payload, final String secretKey) {
7879

7980
mView.showProgressIndicator(true);
8081

81-
new NetworkRequestImpl().chargeCard(body, new Callbacks.OnChargeRequestComplete() {
82+
new NetworkRequestImpl().chargeGhanaMobileMoneyWallet(body, new Callbacks.OnGhanaChargeRequestComplete() {
8283
@Override
83-
public void onSuccess(ChargeResponse response, String responseAsJSONString) {
84+
public void onSuccess(GhChargeResponse response, String responseAsJSONString) {
8485

8586
mView.showProgressIndicator(false);
8687

0 commit comments

Comments
 (0)