diff --git a/MOLPayXdkExample/app/build.gradle b/MOLPayXdkExample/app/build.gradle index 326485e..355df55 100644 --- a/MOLPayXdkExample/app/build.gradle +++ b/MOLPayXdkExample/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 31 - buildToolsVersion "29.0.3" + compileSdkVersion 34 + //buildToolsVersion "29.0.3" defaultConfig { applicationId "com.molpay.molpayxdkexample" minSdkVersion 16 - targetSdkVersion 31 + targetSdkVersion 34 versionCode 1 versionName "1.0" } @@ -22,13 +22,17 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + namespace 'com.molpay.molpayxdkexample' } dependencies { testImplementation 'junit:junit:4.12' implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.5.0' - implementation 'com.github.RazerMS:Mobile-XDK-RazerMS_Android_Library:3.32.2' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.8.0' + implementation 'com.github.RazerMS:Mobile-XDK-RazerMS_Android_Library:3.33.6' } + + + diff --git a/MOLPayXdkExample/app/build/generated/source/buildConfig/debug/com/molpay/molpayxdkexample/BuildConfig.java b/MOLPayXdkExample/app/build/generated/source/buildConfig/debug/com/molpay/molpayxdkexample/BuildConfig.java new file mode 100644 index 0000000..d361061 --- /dev/null +++ b/MOLPayXdkExample/app/build/generated/source/buildConfig/debug/com/molpay/molpayxdkexample/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package com.molpay.molpayxdkexample; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "com.molpay.molpayxdkexample"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/MOLPayXdkExample/app/src/main/AndroidManifest.xml b/MOLPayXdkExample/app/src/main/AndroidManifest.xml index 163a0a6..cf765f0 100644 --- a/MOLPayXdkExample/app/src/main/AndroidManifest.xml +++ b/MOLPayXdkExample/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + android:theme="@style/AppTheme.NoActionBar" + android:exported="true"> - + - + diff --git a/MOLPayXdkExample/app/src/main/java/com/molpay/molpayxdkexample/MainActivity.java b/MOLPayXdkExample/app/src/main/java/com/molpay/molpayxdkexample/MainActivity.java index b74f40a..cc02982 100644 --- a/MOLPayXdkExample/app/src/main/java/com/molpay/molpayxdkexample/MainActivity.java +++ b/MOLPayXdkExample/app/src/main/java/com/molpay/molpayxdkexample/MainActivity.java @@ -3,9 +3,12 @@ import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; + import android.util.Log; +import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import android.widget.Button; import android.widget.TextView; import com.molpay.molpayxdk.MOLPayActivity; @@ -14,90 +17,187 @@ import java.util.HashMap; public class MainActivity extends AppCompatActivity { + String orderId; + String billName; + String Country; + String Currency; + String MobileNum; + String TtlAmount; - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - super.onActivityResult(requestCode, resultCode, data); - - if (requestCode == MOLPayActivity.MOLPayXDK && resultCode == RESULT_OK){ - Log.d(MOLPayActivity.MOLPAY, "MOLPay result = " + data.getStringExtra(MOLPayActivity.MOLPayTransactionResult)); - TextView tw = (TextView)findViewById(R.id.resultTV); - tw.setText(data.getStringExtra(MOLPayActivity.MOLPayTransactionResult)); - } + public void restartmolpay(HashMap paymentDetails) { + Intent intent = new Intent(MainActivity.this, MOLPayActivity.class); + intent.putExtra(MOLPayActivity.MOLPayPaymentDetails, paymentDetails); + startActivityForResult(intent, MOLPayActivity.MOLPayXDK); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + // Initialize payment details HashMap paymentDetails = new HashMap<>(); - paymentDetails.put(MOLPayActivity.mp_amount, "1.10"); - paymentDetails.put(MOLPayActivity.mp_username, ""); - paymentDetails.put(MOLPayActivity.mp_password, ""); - paymentDetails.put(MOLPayActivity.mp_merchant_ID, ""); - paymentDetails.put(MOLPayActivity.mp_app_name, ""); + // Optional, REQUIRED when use online Sandbox environment and account credentials. +// paymentDetails.put(MOLPayActivity.mp_dev_mode, false); + + // Mandatory String. Values obtained from MOLPay. + paymentDetails.put(MOLPayActivity.mp_username, "RMSxdk_2022"); + paymentDetails.put(MOLPayActivity.mp_password, "RMSpwd@2022"); + paymentDetails.put(MOLPayActivity.mp_merchant_ID, "rmsxdk_mobile_Dev"); + paymentDetails.put(MOLPayActivity.mp_app_name, "mobile"); + paymentDetails.put(MOLPayActivity.mp_verification_key, "ee738b541eff7b6b495e44771f71c0ec"); + + // Mandatory String. Payment values. + paymentDetails.put(MOLPayActivity.mp_amount, "1.10"); // Minimum 1.01 paymentDetails.put(MOLPayActivity.mp_order_ID, Calendar.getInstance().getTimeInMillis()); paymentDetails.put(MOLPayActivity.mp_currency, "MYR"); paymentDetails.put(MOLPayActivity.mp_country, "MY"); - paymentDetails.put(MOLPayActivity.mp_verification_key, ""); + + // Optional, but required payment values. User input will be required when values not passed. + // Use 'multi' for all available channels option. For individual channel seletion, please refer to https://github.com/MOLPay/molpay-mobile-xdk-examples/blob/master/channel_list.tsv. paymentDetails.put(MOLPayActivity.mp_channel, "multi"); - paymentDetails.put(MOLPayActivity.mp_bill_description, "description"); - paymentDetails.put(MOLPayActivity.mp_bill_name, "example"); - paymentDetails.put(MOLPayActivity.mp_bill_email, "example@mail.com"); - paymentDetails.put(MOLPayActivity.mp_bill_mobile, "+60123456789"); - - //paymentDetails.put(MOLPayActivity.mp_channel_editing, false); - //paymentDetails.put(MOLPayActivity.mp_editing_enabled, true); - //paymentDetails.put(MOLPayActivity.mp_transaction_id, ""); - //paymentDetails.put(MOLPayActivity.mp_request_type, ""); - - //String binlock[] = {"123456","234567"}; - //paymentDetails.put(MOLPayActivity.mp_bin_lock, binlock); - //paymentDetails.put(MOLPayActivity.mp_bin_lock_err_msg, "Wrong BIN format"); - - //paymentDetails.put(MOLPayActivity.mp_is_escrow, ""); - //paymentDetails.put(MOLPayActivity.mp_filter, "1"); - //paymentDetails.put(MOLPayActivity.mp_custom_css_url, "file:///android_asset/custom.css"); - //paymentDetails.put(MOLPayActivity.mp_preferred_token, ""); - //paymentDetails.put(MOLPayActivity.mp_tcctype, ""); // SALS // AUTH - //paymentDetails.put(MOLPayActivity.mp_is_recurring, false); - //String allowedchannels[] = {"credit","credit3"}; - //paymentDetails.put(MOLPayActivity.mp_allowed_channels, allowedchannels); - //paymentDetails.put(MOLPayActivity.mp_sandbox_mode, true); - //paymentDetails.put(MOLPayActivity.mp_express_mode, true); - //paymentDetails.put(MOLPayActivity.mp_advanced_email_validation_enabled, true); - //paymentDetails.put(MOLPayActivity.mp_advanced_phone_validation_enabled, true); - //paymentDetails.put(MOLPayActivity.mp_bill_name_edit_disabled, false); - //paymentDetails.put(MOLPayActivity.mp_bill_email_edit_disabled, false); - //paymentDetails.put(MOLPayActivity.mp_bill_mobile_edit_disabled, false); - //paymentDetails.put(MOLPayActivity.mp_bill_description_edit_disabled, false); + paymentDetails.put(MOLPayActivity.mp_bill_description, "billdesc"); + paymentDetails.put(MOLPayActivity.mp_bill_name, "billname"); + paymentDetails.put(MOLPayActivity.mp_bill_email, "email@domain.com"); + paymentDetails.put(MOLPayActivity.mp_bill_mobile, "+1234567"); + + // Optional, allow channel selection. + // paymentDetails.put(MOLPayActivity.mp_channel_editing, false); + + // Optional, allow billing information editing. +// paymentDetails.put(MOLPayActivity.mp_editing_enabled, true); + + // Optional, for Escrow. + // paymentDetails.put(MOLPayActivity.mp_is_escrow, ""); // Put "1" to enable escrow + + // Optional, for credit card BIN restrictions and campaigns. +// String binlock[] = {"414170","414171"}; + // paymentDetails.put(MOLPayActivity.mp_bin_lock, binlock); + + // Optional, for mp_bin_lock alert error. + // paymentDetails.put(MOLPayActivity.mp_bin_lock_err_msg, "Only UOB allowed"); + + // WARNING! FOR TRANSACTION QUERY USE ONLY, DO NOT USE THIS ON PAYMENT PROCESS. + // Optional, provide a valid cash channel transaction id here will display a payment instruction screen. Required if mp_request_type is 'Receipt'. + // paymentDetails.put(MOLPayActivity.mp_transaction_id, ""); + // Optional, use 'Receipt' for Cash channels, and 'Status' for transaction status query. + // paymentDetails.put(MOLPayActivity.mp_request_type, ""); + + // Optional, use this to customize the UI theme for the payment info screen, the original XDK custom.css file can be obtained at https://github.com/MOLPay/molpay-mobile-xdk-examples/blob/master/custom.css. + // paymentDetails.put(MOLPayActivity.mp_custom_css_url, "file:///android_asset/custom.css"); + + // Optional, set the token id to nominate a preferred token as the default selection, set "new" to allow new card only. +// paymentDetails.put(MOLPayActivity.mp_preferred_token, "new"); + + // Optional, credit card transaction type, set "AUTH" to authorize the transaction. + // paymentDetails.put(MOLPayActivity.mp_tcctype, ""); + + // Optional, required valid credit card channel, set true to process this transaction through the recurring api, please refer the MOLPay Recurring API pdf. + // paymentDetails.put(MOLPayActivity.mp_is_recurring, false); + + // Optional, show nominated channels. +// String allowedchannels[] = {"credit","credit3"}; + // paymentDetails.put(MOLPayActivity.mp_allowed_channels, allowedchannels); + + // Optional, simulate offline payment, set boolean value to enable. + // paymentDetails.put(MOLPayActivity.mp_sandbox_mode, true); + + // Optional, required a valid mp_channel value, this will skip the payment info page and go direct to the payment screen. +// paymentDetails.put(MOLPayActivity.mp_express_mode, false); + + // Optional, extended email format validation based on W3C standards. + // paymentDetails.put(MOLPayActivity.mp_advanced_email_validation_enabled, true); + + // Optional, extended phone format validation based on Google i18n standards. + // paymentDetails.put(MOLPayActivity.mp_advanced_phone_validation_enabled, true); + + // Optional, explicitly force disable user input. +// paymentDetails.put(MOLPayActivity.mp_bill_name_edit_disabled, true); +// paymentDetails.put(MOLPayActivity.mp_bill_email_edit_disabled, true); +// paymentDetails.put(MOLPayActivity.mp_bill_mobile_edit_disabled, true); +// paymentDetails.put(MOLPayActivity.mp_bill_description_edit_disabled, true); + + // Optional, EN, MS, VI, TH, FIL, MY, KM, ID, ZH. //paymentDetails.put(MOLPayActivity.mp_language, "EN"); -// paymentDetails.put(MOLPayActivity.mp_dev_mode, true); - //paymentDetails.put(MOLPayActivity.mp_cash_waittime, 24); - //paymentDetails.put(MOLPayActivity.mp_non_3DS, true); - //paymentDetails.put(MOLPayActivity.mp_card_list_disabled, true); - //String disabledChannels[] = {"credit"}; - //paymentDetails.put(MOLPayActivity.mp_disabled_channels, disabledChannels); + // Optional, Cash channel payment request expiration duration in hour. + // paymentDetails.put(MOLPayActivity.mp_cash_waittime, 48); - Intent intent = new Intent(MainActivity.this, MOLPayActivity.class); - intent.putExtra(MOLPayActivity.MOLPayPaymentDetails, paymentDetails); - startActivityForResult(intent, MOLPayActivity.MOLPayXDK); - + // Optional, allow bypass of 3DS on some credit card channels. + // paymentDetails.put(MOLPayActivity.mp_non_3DS, true); + + // Optional, disable card list option. + // paymentDetails.put(MOLPayActivity.mp_card_list_disabled, true); + + // Optional for channels restriction, this option has less priority than mp_allowed_channels. +// String disabledChannels[] = {""}; + // paymentDetails.put(MOLPayActivity.mp_disabled_channels, disabledChannels); + + orderId = paymentDetails.get(MOLPayActivity.mp_order_ID).toString(); + billName = paymentDetails.get(MOLPayActivity.mp_bill_name).toString(); + Country = paymentDetails.get(MOLPayActivity.mp_country).toString(); + Currency = paymentDetails.get(MOLPayActivity.mp_currency).toString(); + MobileNum = paymentDetails.get(MOLPayActivity.mp_bill_mobile).toString(); + TtlAmount = paymentDetails.get(MOLPayActivity.mp_amount).toString(); + + setContentView(R.layout.activity_main); + + TextView orderIdTextView = findViewById(R.id.order_id); + orderIdTextView.setText(orderId); + + TextView billNameTextView = findViewById(R.id.bill_name); + billNameTextView.setText(billName); + + TextView CountryTextView = findViewById(R.id.country); + CountryTextView.setText(Country); + + TextView CurrencyTextView = findViewById(R.id.currency); + CurrencyTextView.setText(Currency); + + TextView MobileNumTextView = findViewById(R.id.mobile); + MobileNumTextView.setText(MobileNum); + + TextView TtlAmountTextView = findViewById(R.id.amount); + TtlAmountTextView.setText(TtlAmount); + + + Button btnXdk = (Button) findViewById(R.id.xdk_button); + btnXdk.setOnClickListener( new View.OnClickListener() { + + @Override + public void onClick(View v) { + restartmolpay(paymentDetails); + } + }); + + } + + + +// @Override +// public boolean onOptionsItemSelected(MenuItem item) { +// int id = item.getItemId(); +// +// if (id == R.id.action_settings) { +// return true; +// } +// +// return super.onOptionsItemSelected(item); +// } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.action_settings) { - return true; - } + // closebtn clicked + return super.onOptionsItemSelected(item); } diff --git a/MOLPayXdkExample/app/src/main/res/layout/activity_main.xml b/MOLPayXdkExample/app/src/main/res/layout/activity_main.xml index 82fc1ac..1372432 100644 --- a/MOLPayXdkExample/app/src/main/res/layout/activity_main.xml +++ b/MOLPayXdkExample/app/src/main/res/layout/activity_main.xml @@ -8,27 +8,46 @@ tools:context="com.molpay.molpayxdkexample.MainActivity"> - + - - + + + + + + android:text="Welcome to Android XDK" + android:textColor="@android:color/white" + android:textSize="30sp" + app:layout_anchor="@+id/toolbar" + app:layout_anchorGravity="center" /> + + + + diff --git a/MOLPayXdkExample/app/src/main/res/layout/content_main.xml b/MOLPayXdkExample/app/src/main/res/layout/content_main.xml index f8dbcdd..f519db9 100644 --- a/MOLPayXdkExample/app/src/main/res/layout/content_main.xml +++ b/MOLPayXdkExample/app/src/main/res/layout/content_main.xml @@ -4,17 +4,204 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.molpay.molpayxdkexample.MainActivity" tools:showIn="@layout/activity_main"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + android:layout_below="@id/mobile_label" + android:layout_marginTop="200dp" + android:text="Total:" + android:textStyle="bold" /> + + + +