_consumeList )
+ {
+ mConsumeList = _consumeList;
+ }
+
+ public void setErrorVo( ErrorVo _errorVo )
+ {
+ mErrorVo = _errorVo;
+ }
+
+ public boolean checkAppsPackage()
+ {
+ Log.d(TAG, "checkAppsPackage: pos0");
+ // 1. If Billing Package is installed in your device
+ // ====================================================================
+ if(HelperUtil.isInstalledAppsPackage(this)) {
+ Log.d(TAG, "checkAppsPackage: pos1");
+ // 1) If Billing package installed in your device is valid
+ // ================================================================
+ if (!HelperUtil.isEnabledAppsPackage(this)) {
+ Log.d(TAG, "checkAppsPackage: pos2");
+
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.parse("package:" + HelperDefine.GALAXY_PACKAGE_NAME));
+ startActivityForResult(intent, HelperDefine.REQUEST_CODE_IS_ENABLE_BILLING);
+ }
+ };
+ Log.d(TAG, "checkAppsPackage: pos3");
+ //// TODO: 2017-08-16 need to set the error string
+ HelperUtil.showIapDialogIfNeeded(this,
+ getString(R.string.mids_sapps_header_samsung_in_app_purchase_abb),
+ getString(R.string.mids_sapps_pop_unable_to_open_samsung_in_app_purchase_msg),
+ false,
+ runnable,
+ true);
+
+ } else if (HelperUtil.isValidAppsPackage(this)) {
+ Log.d(TAG, "checkAppsPackage: pos4");
+ return true;
+
+ // ================================================================
+ // 2) If IAP package installed in your device is not valid
+ // ================================================================
+ } else {
+ Log.d(TAG, "checkAppsPackage: pos5");
+ // Set error to notify result to third-party application
+ // ------------------------------------------------------------
+ //// TODO: 2017-08-16 need to set the error string
+ mErrorVo.setError(HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_an_invalid_installation_of_in_app_purchase_has_been_detected_check_and_try_again));
+ // ------------------------------------------------------------
+ // show alert dialog if IAP Package is invalid
+ // ------------------------------------------------------------
+ HelperUtil.showIapDialogIfNeeded(
+ this,
+ getString(R.string.mids_sapps_header_samsung_in_app_purchase_abb),
+ getString(R.string.mids_sapps_pop_an_invalid_installation_of_in_app_purchase_has_been_detected_check_and_try_again),
+ true,
+ null,
+ mShowErrorDialog);
+ // ------------------------------------------------------------
+ }
+ // ================================================================
+
+ // ====================================================================
+ // 2. If IAP Package is not installed in your device
+ // ====================================================================
+ } else {
+ Log.d(TAG, "checkAppsPackage: pos6");
+ HelperUtil.installAppsPackage( this );
+ }
+ // ====================================================================
+ Log.d(TAG, "checkAppsPackage: pos7");
+ return false;
+ }
+
+ /**
+ * Binding to IAPService
+ * Once IAPService bound successfully, invoke succeedBind() method.
+ */
+ public void bindIapService()
+ {
+ Log.i( TAG, "start Bind... ");
+
+ // 1. Bind to IAPService
+ // ====================================================================
+ mIapHelper.bindIapService( new OnIapBindListener()
+ {
+ @Override
+ public void onBindIapFinished( int _result )
+ {
+ Log.i( TAG, "Binding OK... ");
+
+ // 1) If IAPService is bound successfully.
+ // ============================================================
+ if( _result == HelperDefine.IAP_RESPONSE_RESULT_OK )
+ {
+ succeedBind();
+ }
+ // ============================================================
+ // 2) If IAPService is not bound.
+ // ============================================================
+ else
+ {
+ // a) Set error for notifying result to third-party
+ // application
+ // --------------------------------------------------------
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_unknown_error_occurred) );
+ // --------------------------------------------------------
+ // b) show alert dialog when bind is failed
+ // --------------------------------------------------------
+ HelperUtil.showIapDialogIfNeeded( BaseActivity.this,
+ getString(R.string.mids_sapps_header_samsung_in_app_purchase_abb),
+ getString(R.string.mids_sapps_pop_unknown_error_occurred)
+ + "[Lib_Bind]",
+ true,
+ null,
+ mShowErrorDialog);
+ // --------------------------------------------------------
+ }
+ // ============================================================
+ }
+ });
+ // ====================================================================
+ }
+
+ /**
+ * dispose IapHelper {@link ConsumePurchasedItemsActivity}, {@link OwnedProductActivity},{@link PaymentActivity}
+ * and {@link ProductActivity}
+ * To do that, preDestory must be invoked at first in onDestory of each child activity
+ */
+ protected void preDestory()
+ {
+ // 1. Invoke dispose Method to unbind service and release inprogress flag
+ // ====================================================================
+ if( null != mIapHelper )
+ {
+ mIapHelper.dispose();
+ mIapHelper = null;
+ }
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ // 1. dismiss ProgressDialog
+ // ====================================================================
+ try
+ {
+ if( mProgressDialog != null )
+ {
+ mProgressDialog.dismiss();
+ mProgressDialog = null;
+ }
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ // ====================================================================
+
+ super.onDestroy();
+ }
+
+ abstract void succeedBind();
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ConsumePurchasedItemsActivity.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ConsumePurchasedItemsActivity.java
new file mode 100644
index 0000000..5e23d18
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ConsumePurchasedItemsActivity.java
@@ -0,0 +1,136 @@
+package com.samsung.android.sdk.iap.lib.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.helper.HelperListenerManager;
+import com.samsung.android.sdk.iap.lib.helper.HelperUtil;
+import com.samsung.android.sdk.iap.lib.helper.IapHelper;
+import com.samsung.android.sdk.iap.lib.listener.OnConsumePurchasedItemsListener;
+
+public class ConsumePurchasedItemsActivity extends BaseActivity
+{
+ @SuppressWarnings("unused")
+ private static final String TAG = ConsumePurchasedItemsActivity.class.getSimpleName();
+
+ /**
+ * Product Type
+ * Item : 00 {@link HelperDefine#ITEM_TYPE_CONSUMABLE}
+ * Subscription : 01 {@link HelperDefine#ITEM_TYPE_SUBSCRIPTION}
+ * All : 10 {@link HelperDefine#ITEM_TYPE_ALL}
+ */
+ private String mPurchaseIds = "";
+
+ @Override
+ protected void onCreate( Bundle savedInstanceState )
+ {
+ super.onCreate( savedInstanceState );
+
+ // 1. save StartNum, EndNum and ItemType passed by Intent
+ // ====================================================================
+ Intent intent = getIntent();
+
+ if( intent != null && intent.getExtras() != null
+ && intent.getExtras().containsKey("PurchaseIds"))
+ {
+ Bundle extras = intent.getExtras();
+ mPurchaseIds = extras.getString("PurchaseIds");
+ mShowErrorDialog = extras.getBoolean( "ShowErrorDialog", true );
+ Log.d(TAG, "onCreate: PurchaseIds [" + mPurchaseIds + "]");
+ }
+ else
+ {
+ Toast.makeText( this,
+ R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase,
+ Toast.LENGTH_LONG ).show();
+
+ // Set error to notify result to third-party application
+ // ----------------------------------------------------------------
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase) );
+ // ----------------------------------------------------------------
+
+ finish();
+ return;
+ }
+
+ // ====================================================================
+ // 2. If IAP package is installed and valid, start SamsungAccount
+ // authentication activity to start purchase.
+ // ====================================================================
+ if( checkAppsPackage() == true )
+ {
+ Log.i( TAG, "Samsung Account Login..." );
+
+ HelperUtil.startAccountActivity( this );
+ }
+ // ====================================================================
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ super.preDestory();
+ Log.d(TAG, "onDestroy: ");
+ OnConsumePurchasedItemsListener onConsumePurchasedItemsListener
+ = HelperListenerManager.getInstance().getOnConsumePurchasedItemsListener();
+ HelperListenerManager.getInstance().setOnConsumePurchasedItemsListener(null);
+ if( null != onConsumePurchasedItemsListener )
+ {
+ onConsumePurchasedItemsListener.onConsumePurchasedItems(mErrorVo, mConsumeList);
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onActivityResult(int _requestCode, int _resultCode, Intent intent) {
+ Log.d(TAG, "onActivityResult>> requestCode : " + _requestCode + ", resultCode : " + _resultCode);
+ switch(_requestCode) {
+ case HelperDefine.REQUEST_CODE_IS_ACCOUNT_CERTIFICATION :
+ Log.i(TAG, "REQUEST_CODE_IS_ACCOUNT_CERTIFICATION Result : " + _resultCode);
+ // 1) If SamsungAccount authentication is succeed
+ // ------------------------------------------------------------
+ if( RESULT_OK == _resultCode )
+ {
+ // bind to IAPService
+ // --------------------------------------------------------
+ bindIapService();
+ // --------------------------------------------------------
+ }
+ // ------------------------------------------------------------
+ // 2) If SamsungAccount authentication is cancelled
+ // ------------------------------------------------------------
+ else
+ {
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString( R.string.mids_sapps_pop_unknown_error_occurred ) );
+ }
+ break;
+ case HelperDefine.REQUEST_CODE_IS_ENABLE_BILLING:
+ Log.i(TAG, "REQUEST_CODE_IS_ENABLE_BILLING Result : " + _resultCode);
+ if(checkAppsPackage()) {
+ bindIapService();
+ }
+ break;
+ }
+ }
+
+ /**
+ * If binding to IAPService is successful, this method is invoked.
+ * This method loads the item list through IAPService.
+ */
+ protected void succeedBind()
+ {
+ Log.d(TAG, "succeedBind: ");
+ if ( mIapHelper != null )
+ {
+ mIapHelper.safeConsumePurchasedItems( ConsumePurchasedItemsActivity.this,
+ mPurchaseIds,
+ mShowErrorDialog );
+ }
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/OwnedProductActivity.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/OwnedProductActivity.java
new file mode 100644
index 0000000..bb21023
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/OwnedProductActivity.java
@@ -0,0 +1,141 @@
+package com.samsung.android.sdk.iap.lib.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.helper.HelperListenerManager;
+import com.samsung.android.sdk.iap.lib.helper.HelperUtil;
+import com.samsung.android.sdk.iap.lib.helper.IapHelper;
+import com.samsung.android.sdk.iap.lib.listener.OnGetOwnedListListener;
+
+public class OwnedProductActivity extends BaseActivity
+{
+ @SuppressWarnings("unused")
+ private static final String TAG = OwnedProductActivity.class.getSimpleName();
+
+ /**
+ * Product Type
+ * Item : 00 {@link HelperDefine#ITEM_TYPE_CONSUMABLE}
+ * Subscription : 01 {@link HelperDefine#ITEM_TYPE_SUBSCRIPTION}
+ * All : 10 {@link HelperDefine#ITEM_TYPE_ALL}
+ */
+ private String mProductType ;
+
+ @Override
+ protected void onCreate( Bundle savedInstanceState )
+ {
+ super.onCreate( savedInstanceState );
+
+ // 1. save StartNum, EndNum and ItemType passed by Intent
+ // ====================================================================
+ Intent intent = getIntent();
+
+ if( intent != null && intent.getExtras() != null
+ && intent.getExtras().containsKey( "ProductType" ) )
+ {
+ Bundle extras = intent.getExtras();
+ mProductType = extras.getString( "ProductType" );
+ mShowErrorDialog = extras.getBoolean( "ShowErrorDialog", true );
+ Log.d(TAG, "onCreate: ItemType [" + mProductType +"]");
+ }
+ else
+ {
+ Toast.makeText( this,
+ R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase,
+ Toast.LENGTH_LONG ).show();
+
+ // Set error to notify result to third-party application
+ // ----------------------------------------------------------------
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase) );
+ // ----------------------------------------------------------------
+
+ finish();
+ return;
+ }
+
+ // ====================================================================
+ // 2. If IAP package is installed and valid, start SamsungAccount
+ // authentication activity to start purchase.
+ // ====================================================================
+ if( checkAppsPackage() == true )
+ {
+ Log.i( TAG, "Samsung Account Login..." );
+ HelperUtil.startAccountActivity( this );
+ }
+ // ====================================================================
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ super.preDestory();
+ Log.d(TAG, "onDestroy: ");
+ OnGetOwnedListListener onOwnedListListener
+ = HelperListenerManager.getInstance().getOnGetOwnedListListener();
+ HelperListenerManager.getInstance().setOnGetOwnedListListener(null);
+ if( null != onOwnedListListener )
+ {
+ onOwnedListListener.onGetOwnedProducts(mErrorVo, mOwnedList);
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onActivityResult(int _requestCode, int _resultCode, Intent intent) {
+ Log.d(TAG, "onActivityResult>> requestCode : " + _requestCode + ", resultCode : " + _resultCode);
+ switch(_requestCode) {
+ case HelperDefine.REQUEST_CODE_IS_ACCOUNT_CERTIFICATION :
+ Log.i(TAG, "REQUEST_CODE_IS_ACCOUNT_CERTIFICATION Result : " + _resultCode);
+ // 1) If SamsungAccount authentication is succeed
+ // ------------------------------------------------------------
+ if( RESULT_OK == _resultCode )
+ {
+ // bind to IAPService
+ // --------------------------------------------------------
+ bindIapService();
+ // --------------------------------------------------------
+ }
+ // ------------------------------------------------------------
+ // 2) If SamsungAccount authentication is cancelled
+ // ------------------------------------------------------------
+ else
+ {
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString( R.string.mids_sapps_pop_unknown_error_occurred ) );
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ getString( R.string.mids_sapps_pop_payment_canceled ),
+ true,
+ null,
+ false );
+ }
+ break;
+ case HelperDefine.REQUEST_CODE_IS_ENABLE_BILLING:
+ Log.i(TAG, "REQUEST_CODE_IS_ENABLE_BILLING Result : " + _resultCode);
+ if(checkAppsPackage()) {
+ bindIapService();
+ }
+ break;
+ }
+ }
+
+ /**
+ * If binding to IAPService is successful, this method is invoked.
+ * This method loads the item list through IAPService.
+ */
+ protected void succeedBind()
+ {
+ Log.d(TAG, "succeedBind: ");
+ if ( mIapHelper != null )
+ {
+ mIapHelper.safeGetOwnedList( OwnedProductActivity.this,
+ mProductType,
+ mShowErrorDialog );
+ }
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/PaymentActivity.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/PaymentActivity.java
new file mode 100644
index 0000000..9e3e3c5
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/PaymentActivity.java
@@ -0,0 +1,324 @@
+package com.samsung.android.sdk.iap.lib.activity;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.helper.HelperListenerManager;
+import com.samsung.android.sdk.iap.lib.helper.HelperUtil;
+import com.samsung.android.sdk.iap.lib.helper.IapHelper;
+import com.samsung.android.sdk.iap.lib.listener.OnPaymentListener;
+import com.samsung.android.sdk.iap.lib.vo.PurchaseVo;
+
+public class PaymentActivity extends BaseActivity
+{
+ private static final String TAG = PaymentActivity.class.getSimpleName();
+
+ /** Item ID */
+ private String mItemId = null;
+ private String mPassThroughParam = "";
+ private int mMode = HelperDefine.IAP_MODE_PRODUCTION;
+ @Override
+ protected void onCreate( Bundle savedInstanceState )
+ {
+ super.onCreate( savedInstanceState );
+
+ // 1. Save ItemId, ShowSuccessDialog passed by Intent
+ // ====================================================================
+ Intent intent = getIntent();
+
+ if( intent != null && intent.getExtras() != null
+ && intent.getExtras().containsKey( "ItemId" ) )
+ {
+ Bundle extras = intent.getExtras();
+
+ mItemId = extras.getString( "ItemId" );
+ mPassThroughParam = extras.getString( "PassThroughParam" );
+ mShowSuccessDialog = extras.getBoolean( "ShowSuccessDialog", true );
+ mShowErrorDialog = extras.getBoolean( "ShowErrorDialog", true );
+ mMode = extras.getInt("OperationMode", HelperDefine.IAP_MODE_PRODUCTION);
+ }
+ else
+ {
+ Toast.makeText( this,
+ R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase,
+ Toast.LENGTH_LONG ).show();
+
+ // Set error to pass result to third-party application
+ // ----------------------------------------------------------------
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase) );
+ // ----------------------------------------------------------------
+
+ finish();
+ }
+ // ====================================================================
+
+
+ // 2. If IAP package is installed and valid, start SamsungAccount
+ // authentication activity to start purchase.
+ // ====================================================================
+ if( checkAppsPackage() == true )
+ {
+ Log.i( TAG, "Samsung Account Login..." );
+ HelperUtil.startAccountActivity( this );
+ }
+ // ====================================================================
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ super.preDestory();
+ Log.d(TAG, "onDestroy: ");
+ OnPaymentListener onPaymentListener =
+ HelperListenerManager.getInstance().getOnPaymentListener();
+ HelperListenerManager.getInstance().setOnPaymentListener(null);
+ if( null != onPaymentListener )
+ {
+ onPaymentListener.onPayment(mErrorVo, mPurchaseVo);
+ }
+ super.onDestroy();
+ }
+
+ protected void succeedBind()
+ {
+ if ( mIapHelper != null )
+ {
+ startPaymentActivity(
+ PaymentActivity.this,
+ HelperDefine.REQUEST_CODE_IS_IAP_PAYMENT,
+ mItemId,
+ mPassThroughParam,
+ mMode);
+ }
+ }
+
+ /**
+ * Handle SamsungAccount authentication result and purchase result.
+ */
+ @Override
+ protected void onActivityResult
+ (
+ int _requestCode,
+ int _resultCode,
+ Intent _intent
+ )
+ {
+ switch( _requestCode )
+ {
+ // 1. Handle result of purchase
+ // ================================================================
+ case HelperDefine.REQUEST_CODE_IS_IAP_PAYMENT:
+ {
+ // 1) If payment is finished
+ // ------------------------------------------------------------
+ if( RESULT_OK == _resultCode )
+ {
+ finishPurchase( _intent );
+ }
+ // ------------------------------------------------------------
+ // 2) If payment is cancelled
+ // ------------------------------------------------------------
+ else if( RESULT_CANCELED == _resultCode )
+ {
+ mErrorVo.setError( HelperDefine.IAP_PAYMENT_IS_CANCELED,
+ getString(R.string.mids_sapps_pop_payment_canceled));
+
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mErrorVo.getErrorString(),
+ true,
+ null,
+ mShowErrorDialog );
+
+ break;
+ }
+ // ------------------------------------------------------------
+
+ break;
+ }
+ // ================================================================
+
+ // 2. Handle result of SamsungAccount authentication
+ // ================================================================
+ case HelperDefine.REQUEST_CODE_IS_ACCOUNT_CERTIFICATION :
+ {
+ Log.i( TAG, "Samsung Account Result : " + _resultCode );
+
+ // 1) If SamsungAccount authentication is succeed
+ // ------------------------------------------------------------
+ if( RESULT_OK == _resultCode )
+ {
+ // bind to IAPService
+ // --------------------------------------------------------
+ bindIapService();
+ // --------------------------------------------------------
+ }
+ // ------------------------------------------------------------
+ // 2) If SamsungAccount authentication is cancelled
+ // ------------------------------------------------------------
+ else
+ {
+ mErrorVo.setError( HelperDefine.IAP_PAYMENT_IS_CANCELED,
+ getString( R.string.mids_sapps_pop_payment_canceled ) );
+
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ getString( R.string.mids_sapps_pop_payment_canceled ),
+ true,
+ null,
+ mShowErrorDialog );
+ }
+ // ------------------------------------------------------------
+
+ break;
+ }
+ // ================================================================
+
+ case HelperDefine.REQUEST_CODE_IS_ENABLE_BILLING:
+ if(checkAppsPackage()) {
+ Log.i( TAG, "Samsung Account Login..." );
+ HelperUtil.startAccountActivity(this);
+ }
+ break;
+ }
+ }
+
+ /**
+ * Invoked when payment has been finished.
+ * @param _intent
+ */
+ private void finishPurchase( Intent _intent )
+ {
+ // 1. If there is bundle passed from IAP
+ // ====================================================================
+ if( null != _intent && null != _intent.getExtras() )
+ {
+ Bundle extras = _intent.getExtras();
+
+ mErrorVo.setError( extras.getInt( HelperDefine.KEY_NAME_STATUS_CODE ),
+ extras.getString( HelperDefine.KEY_NAME_ERROR_STRING ) );
+
+ // 1) If the purchase is successful,
+ // ----------------------------------------------------------------
+ if( mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NONE )
+ {
+ //verification Checking is deleted
+ // a) Create PurcahseVo with data in Intent
+ // ------------------------------------------------------------
+ mPurchaseVo = new PurchaseVo( extras.getString(
+ HelperDefine.KEY_NAME_RESULT_OBJECT ) );
+ Log.d(TAG, "finishPurchase: " + mPurchaseVo.dump());
+ // ------------------------------------------------------------
+
+ /*
+ // b) Validate the purchase
+ // ------------------------------------------------------------
+ mIapHelper.verifyPurchaseResult( PaymentActivity.this,
+ mPurchaseVo,
+ mShowSuccessDialog,
+ mShowErrorDialog );
+ // ------------------------------------------------------------
+ */
+
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_NONE ,
+ getString( R.string.dlg_msg_payment_success ) );
+
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mErrorVo.getErrorString(),
+ true,
+ null,
+ mShowSuccessDialog );
+
+ }
+ // ----------------------------------------------------------------
+ // 2) If the purchase is failed
+ // ----------------------------------------------------------------
+ else
+ {
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mErrorVo.getErrorString(),
+ true,
+ null,
+ mShowErrorDialog);
+ }
+ // ----------------------------------------------------------------
+ }
+ // ====================================================================
+ // 2. If there is no bundle passed from IAP
+ // ====================================================================
+ else
+ {
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString( R.string.mids_sapps_pop_unknown_error_occurred ) );
+
+ HelperUtil.showIapDialogIfNeeded( this,
+ getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ getString( R.string.mids_sapps_pop_unknown_error_occurred )
+ + "[Lib_Payment]",
+ true,
+ null,
+ mShowErrorDialog );
+
+ return;
+ }
+ // ====================================================================
+ }
+
+ /**
+ * Start payment.
+ * @param _activity
+ * @param _requestCode
+ * @param _itemId
+ * @param _passThroughParam
+ */
+ static private void startPaymentActivity
+ (
+ Activity _activity,
+ int _requestCode,
+ String _itemId,
+ String _passThroughParam,
+ int _mode
+ )
+ {
+ try
+ {
+ Context context = _activity.getApplicationContext();
+ Bundle bundle = new Bundle();
+ bundle.putString( HelperDefine.KEY_NAME_THIRD_PARTY_NAME,
+ context.getPackageName() );
+
+ bundle.putString( HelperDefine.KEY_NAME_ITEM_ID, _itemId );
+ if(_passThroughParam != null)
+ bundle.putString( HelperDefine.KEY_NAME_PASSTHROUGH_ID, _passThroughParam);
+ bundle.putInt(HelperDefine.KEY_NAME_OPERATION_MODE, _mode);
+
+ ComponentName com = new ComponentName( HelperDefine.GALAXY_PACKAGE_NAME,
+ HelperDefine.IAP_PACKAGE_NAME + ".activity.PaymentMethodListActivity" );
+
+ Intent intent = new Intent( Intent.ACTION_MAIN );
+ intent.addCategory( Intent.CATEGORY_LAUNCHER );
+ intent.setComponent( com );
+
+ intent.putExtras( bundle );
+
+ if(intent.resolveActivity(context.getPackageManager()) != null) {
+ _activity.startActivityForResult(intent, _requestCode);
+ }
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ProductActivity.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ProductActivity.java
new file mode 100644
index 0000000..8e79769
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ProductActivity.java
@@ -0,0 +1,107 @@
+package com.samsung.android.sdk.iap.lib.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.helper.HelperListenerManager;
+import com.samsung.android.sdk.iap.lib.helper.IapHelper;
+import com.samsung.android.sdk.iap.lib.listener.OnGetProductsDetailsListener;
+
+public class ProductActivity extends BaseActivity
+{
+ @SuppressWarnings("unused")
+ private static final String TAG = ProductActivity.class.getSimpleName();
+
+ /**
+ * Product Type
+ * Item : 00 {@link HelperDefine#ITEM_TYPE_CONSUMABLE}
+ * Subscription : 01 {@link HelperDefine#ITEM_TYPE_SUBSCRIPTION}
+ * All : 10 {@link HelperDefine#ITEM_TYPE_ALL}
+ */
+ private String mProductIds = null;
+
+ @Override
+ protected void onCreate( Bundle savedInstanceState )
+ {
+ super.onCreate( savedInstanceState );
+
+ // 1. save StartNum, EndNum and ItemType passed by Intent
+ // ====================================================================
+ Intent intent = getIntent();
+
+ if( intent != null && intent.getExtras() != null
+ && intent.getExtras().containsKey("ProductIds") )
+ {
+ Bundle extras = intent.getExtras();
+ mProductIds = extras.getString("ProductIds");
+ mShowErrorDialog = extras.getBoolean( "ShowErrorDialog", true );
+ Log.d(TAG, "onCreate: mProductIds [" + mProductIds + "]");
+ }
+ else
+ {
+ Toast.makeText( this,
+ R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase,
+ Toast.LENGTH_LONG ).show();
+
+ // Set error to notify result to third-party application
+ // ----------------------------------------------------------------
+ mErrorVo.setError( HelperDefine.IAP_ERROR_COMMON,
+ getString(R.string.mids_sapps_pop_an_invalid_value_has_been_provided_for_samsung_in_app_purchase) );
+ // ----------------------------------------------------------------
+
+ finish();
+ return;
+ }
+ // ====================================================================
+
+ // 2. If IAP package is installed and valid,
+ // bind to IAPService to load item list.
+ // ====================================================================
+ if( checkAppsPackage() == true )
+ {
+ bindIapService();
+ }
+ // ====================================================================
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ super.preDestory();
+ Log.d(TAG, "onDestroy: ");
+ OnGetProductsDetailsListener onProductsDetailsListener
+ = HelperListenerManager.getInstance().getOnGetProductsDetailsListener();
+ HelperListenerManager.getInstance().setOnGetProductsDetailsListener(null);
+ if( null != onProductsDetailsListener )
+ {
+ onProductsDetailsListener.onGetProducts(mErrorVo, mProductsDetails);
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ switch(requestCode) {
+ case HelperDefine.REQUEST_CODE_IS_ENABLE_BILLING:
+ if(checkAppsPackage()) {
+ bindIapService();
+ }
+ break;
+ }
+ }
+
+ /**
+ * If binding to IAPService is successful, this method is invoked.
+ * This method loads the item list through IAPService.
+ */
+ protected void succeedBind()
+ {
+ mIapHelper.safeGetProductsDetails( ProductActivity.this,
+ mProductIds,
+ mShowErrorDialog );
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperDefine.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperDefine.java
new file mode 100644
index 0000000..ffcdbd9
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperDefine.java
@@ -0,0 +1,159 @@
+package com.samsung.android.sdk.iap.lib.helper;
+
+/**
+ * Created by sangbum7.kim on 2017-07-17.
+ */
+
+public class HelperDefine {
+ protected static final int HONEYCOMB_MR1 = 12;
+ protected static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32;
+
+ // IAP Signature HashCode - Used to validate IAP package
+ // ========================================================================
+ public static final int APPS_SIGNATURE_HASHCODE = 0x79998D13;
+ public static final int APPS_PACKAGE_VERSION = 421400000;
+
+ // ========================================================================
+
+ // Name of IAP Package and Service
+ // ========================================================================
+ public static final String GALAXY_PACKAGE_NAME = "com.sec.android.app.samsungapps";//"android.samsung.com.myapplication";//"com.samsung.android.iap";
+ public static final String IAP_PACKAGE_NAME = "com.samsung.android.iap";
+ public static final String IAP_SERVICE_NAME =
+ "com.samsung.android.iap.service.IAPService";
+ // ========================================================================
+
+ // result code for binding to IAPService
+ // ========================================================================
+ public static final int IAP_RESPONSE_RESULT_OK = 0;
+ public static final int IAP_RESPONSE_RESULT_UNAVAILABLE = 2;
+ // ========================================================================
+
+ // BUNDLE KEY
+ // ========================================================================
+ public static final String KEY_NAME_THIRD_PARTY_NAME = "THIRD_PARTY_NAME";
+ public static final String KEY_NAME_STATUS_CODE = "STATUS_CODE";
+ public static final String KEY_NAME_ERROR_STRING = "ERROR_STRING";
+ public static final String KEY_NAME_IAP_UPGRADE_URL = "IAP_UPGRADE_URL";
+ public static final String KEY_NAME_ITEM_GROUP_ID = "ITEM_GROUP_ID";
+ public static final String KEY_NAME_ITEM_ID = "ITEM_ID";
+ public static final String KEY_NAME_PASSTHROUGH_ID = "PASSTHROUGH_ID";
+ public static final String KEY_NAME_RESULT_LIST = "RESULT_LIST";
+ public static final String KEY_NAME_OPERATION_MODE = "OPERATION_MODE";
+ public static final String KEY_NAME_RESULT_OBJECT = "RESULT_OBJECT";
+ public static final String NEXT_PAGING_INDEX = "NEXT_PAGING_INDEX";
+ // ========================================================================
+
+ // Item Type
+ // ------------------------------------------------------------------------
+ // Consumable : 00
+ // Non Consumable : 01
+ // Subscription : 02
+ // All : 10
+ // ========================================================================
+ public static final String ITEM_TYPE_CONSUMABLE = "00";
+ public static final String ITEM_TYPE_NON_CONSUMABLE = "01";
+ public static final String ITEM_TYPE_SUBSCRIPTION = "02";
+ public static final String ITEM_TYPE_AUTO_RECURRING_SUBSCRIPTIONS = "03";
+ public static final String ITEM_TYPE_ALL = "10";
+ // ========================================================================
+ public static final String PRODUCT_TYPE_ITEM = "item";
+ public static final String PRODUCT_TYPE_SUBSCRIPTION = "subscription";
+ public static final String PRODUCT_TYPE_ALL = "all";
+
+ // Define request code to IAPService.
+ // ========================================================================
+ public static final int REQUEST_CODE_IS_IAP_PAYMENT = 1;
+ public static final int REQUEST_CODE_IS_ACCOUNT_CERTIFICATION = 2;
+ public static final int REQUEST_CODE_IS_ENABLE_BILLING = 3;
+ // ========================================================================
+
+ // Define request parameter to IAPService
+ // ========================================================================
+ public static final int PASSTHROGUH_MAX_LENGTH = 255;
+ // ========================================================================
+
+ // Define status code notify to 3rd-party application
+ // ========================================================================
+ /** Success */
+ final public static int IAP_ERROR_NONE = 0;
+
+ /** Payment is cancelled */
+ final public static int IAP_PAYMENT_IS_CANCELED = 1;
+
+ /** IAP initialization error */
+ final public static int IAP_ERROR_INITIALIZATION = -1000;
+
+ /** IAP need to be upgraded */
+ final public static int IAP_ERROR_NEED_APP_UPGRADE = -1001;
+
+ /** Common error */
+ final public static int IAP_ERROR_COMMON = -1002;
+
+ /** Repurchase NON-CONSUMABLE item */
+ final public static int IAP_ERROR_ALREADY_PURCHASED = -1003;
+
+ /** When PaymentMethodList Activity is called without Bundle data */
+ final public static int IAP_ERROR_WHILE_RUNNING = -1004;
+
+ /** does not exist item or item group id */
+ final public static int IAP_ERROR_PRODUCT_DOES_NOT_EXIST = -1005;
+
+ /**
+ * After purchase request not received the results can not be determined
+ * whether to buy. So, the confirmation of purchase list is needed.
+ */
+ final public static int IAP_ERROR_CONFIRM_INBOX = -1006;
+
+ /** Error when item group id does not exist */
+ public static final int IAP_ERROR_ITEM_GROUP_DOES_NOT_EXIST = -1007;
+
+ /** Error when network is not available */
+ public static final int IAP_ERROR_NETWORK_NOT_AVAILABLE = -1008;
+
+ /**IOException*/
+ public static final int IAP_ERROR_IOEXCEPTION_ERROR = -1009;
+
+ /**SocketTimeoutException*/
+ public static final int IAP_ERROR_SOCKET_TIMEOUT = -1010;
+
+ /**ConnectTimeoutException*/
+ public static final int IAP_ERROR_CONNECT_TIMEOUT = -1011;
+
+ /** The Item is not for sale in the country */
+ public static final int IAP_ERROR_NOT_EXIST_LOCAL_PRICE = -1012;
+
+ /** IAP is not serviced in the country */
+ public static final int IAP_ERROR_NOT_AVAILABLE_SHOP = -1013;
+ // ========================================================================
+
+ // IAP Mode
+ // ========================================================================
+ /** Test mode for development. Always return true. */
+ final public static int IAP_MODE_TEST = 1;
+
+ /** Test mode for development. Always return failed. */
+ final public static int IAP_MODE_TEST_FAILURE = -1;
+
+ /** Production mode. Set mode to this to charge for your item. */
+ final public static int IAP_MODE_PRODUCTION = 0;
+
+
+
+ /** initial state */
+ protected static final int STATE_TERM = 0;
+
+ /** state of bound to IAPService successfully */
+ protected static final int STATE_BINDING = 1;
+
+ /** state of InitIapTask successfully finished */
+ protected static final int STATE_READY = 2; //
+ // ========================================================================
+
+ public enum OperationMode{
+ OPERATION_MODE_TEST_FAILURE,
+ OPERATION_MODE_PRODUCTION,
+ OPERATION_MODE_TEST
+ };
+
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperListenerManager.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperListenerManager.java
new file mode 100644
index 0000000..073c5b2
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperListenerManager.java
@@ -0,0 +1,113 @@
+package com.samsung.android.sdk.iap.lib.helper;
+
+import android.content.Context;
+
+import com.samsung.android.sdk.iap.lib.helper.task.ConsumePurchasedItemsTask;
+import com.samsung.android.sdk.iap.lib.helper.task.GetOwnedListTask;
+import com.samsung.android.sdk.iap.lib.helper.task.GetProductsDetailsTask;
+import com.samsung.android.sdk.iap.lib.listener.OnConsumePurchasedItemsListener;
+import com.samsung.android.sdk.iap.lib.listener.OnGetOwnedListListener;
+import com.samsung.android.sdk.iap.lib.listener.OnGetProductsDetailsListener;
+import com.samsung.android.sdk.iap.lib.listener.OnPaymentListener;
+
+/**
+ * Created by sangbum7.kim on 2017-08-29.
+ */
+
+public class HelperListenerManager {
+ private static HelperListenerManager mInstance = null;
+
+ private OnGetProductsDetailsListener mOnGetProductsDetailsListener = null;
+ private OnGetOwnedListListener mOnGetOwnedListListener = null;
+ private OnConsumePurchasedItemsListener mOnConsumePurchasedItemsListener = null;
+ private OnPaymentListener mOnPaymentListener = null;
+
+ /**
+ * HelperListenerManager singleton reference method
+ */
+ public static HelperListenerManager getInstance( )
+ {
+ if( mInstance == null)
+ mInstance = new HelperListenerManager();
+ return mInstance;
+ }
+
+ public static void destroy()
+ {
+ mInstance = null;
+ }
+
+ /**
+ * HelperListenerManager constructor
+ */
+ private HelperListenerManager( )
+ {
+ mOnGetProductsDetailsListener = null;
+ mOnGetOwnedListListener = null;
+ mOnConsumePurchasedItemsListener = null;
+ mOnPaymentListener = null;
+ }
+
+ /**
+ * Register {@link OnGetProductsDetailsListener} callback interface to be invoked
+ * when {@link GetProductsDetailsTask} has been finished.
+ * @param _onGetProductsDetailsListener
+ */
+ public void setOnGetProductsDetailsListener( OnGetProductsDetailsListener _onGetProductsDetailsListener )
+ {
+ mOnGetProductsDetailsListener = _onGetProductsDetailsListener;
+ }
+
+ public OnGetProductsDetailsListener getOnGetProductsDetailsListener( )
+ {
+ return mOnGetProductsDetailsListener;
+ }
+
+
+ /**
+ * Register {@link OnGetOwnedListListener} callback interface to be invoked
+ * when {@link GetOwnedListTask} has been finished.
+ * @param _onGetOwnedListListener
+ */
+ public void setOnGetOwnedListListener( OnGetOwnedListListener _onGetOwnedListListener )
+ {
+ mOnGetOwnedListListener = _onGetOwnedListListener;
+ }
+
+ public OnGetOwnedListListener getOnGetOwnedListListener( )
+ {
+ return mOnGetOwnedListListener;
+ }
+
+
+ /**
+ * Register {@link OnConsumePurchasedItemsListener} callback interface to be invoked
+ * when {@link ConsumePurchasedItemsTask} has been finished.
+ * @param _onConsumePurchasedItemsListener
+ */
+ public void setOnConsumePurchasedItemsListener( OnConsumePurchasedItemsListener _onConsumePurchasedItemsListener )
+ {
+ mOnConsumePurchasedItemsListener = _onConsumePurchasedItemsListener;
+ }
+
+ public OnConsumePurchasedItemsListener getOnConsumePurchasedItemsListener( )
+ {
+ return mOnConsumePurchasedItemsListener;
+ }
+
+
+ /**
+ * Register a callback interface to be invoked
+ * when Purchase Process has been finished.
+ * @param _onPaymentListener
+ */
+ public void setOnPaymentListener( OnPaymentListener _onPaymentListener )
+ {
+ mOnPaymentListener = _onPaymentListener;
+ }
+
+ public OnPaymentListener getOnPaymentListener()
+ {
+ return mOnPaymentListener;
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperUtil.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperUtil.java
new file mode 100644
index 0000000..4962004
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperUtil.java
@@ -0,0 +1,241 @@
+package com.samsung.android.sdk.iap.lib.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+import android.net.Uri;
+import android.os.Build;
+import android.util.Log;
+
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+
+/**
+ * Created by sangbum7.kim on 2017-08-17.
+ */
+
+public class HelperUtil {
+ private static final String TAG = HelperUtil.class.getSimpleName();
+ /**
+ * show dialog
+ * @param _title
+ * @param _message
+ */
+ public static void showIapDialogIfNeeded
+ (
+ final Activity _activity,
+ String _title,
+ String _message,
+ final boolean _finishActivity,
+ final Runnable _onClickRunable,
+ boolean _showDialog
+ )
+ {
+ if( _showDialog == false )
+ {
+ if( _finishActivity == true )
+ {
+ try{ _activity.finish(); }
+ catch( Exception _e ){ _e.printStackTrace(); }
+ }
+
+ return;
+ }
+
+ AlertDialog.Builder alert = new AlertDialog.Builder( _activity );
+
+ alert.setTitle( _title );
+ alert.setMessage( _message );
+
+ alert.setPositiveButton( android.R.string.ok,
+ new DialogInterface.OnClickListener()
+ {
+ @Override
+ public void onClick( DialogInterface _dialog, int _which )
+ {
+ if( null != _onClickRunable )
+ {
+ _onClickRunable.run();
+ }
+
+ _dialog.dismiss();
+
+ if( true == _finishActivity )
+ {
+ _activity.finish();
+ }
+ }
+ } );
+
+ if( true == _finishActivity )
+ {
+ alert.setOnCancelListener( new DialogInterface.OnCancelListener()
+ {
+ @Override
+ public void onCancel( DialogInterface dialog )
+ {
+ _activity.finish();
+ }
+ });
+ }
+
+ try
+ {
+ alert.show();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Check that Apps package is installed
+ * @param _context Context
+ * @return If it is true Billing package is installed. otherwise, not installed.
+ */
+ static public boolean isInstalledAppsPackage( Context _context )
+ {
+ PackageManager pm = _context.getPackageManager();
+ try
+ {
+ //// TODO: 2017-08-16 Make sure the packageInfo is normal and set the version code
+ PackageInfo packageInfo = pm.getPackageInfo(HelperDefine.GALAXY_PACKAGE_NAME, PackageManager.GET_META_DATA);
+ Log.d(TAG, "isInstalledAppsPackage: versionCode " + packageInfo.versionCode);
+ return packageInfo.versionCode >= HelperDefine.APPS_PACKAGE_VERSION;
+
+ }
+ catch( PackageManager.NameNotFoundException e )
+ {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ static public boolean isEnabledAppsPackage(Context context) {
+ //// TODO: 2017-08-16 Make sure the status is normal
+ int status = context.getPackageManager().getApplicationEnabledSetting(HelperDefine.GALAXY_PACKAGE_NAME);
+ Log.d(TAG, "isEnabledAppsPackage: status " + status);
+ return !((status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) || (status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER));
+ }
+
+
+ /**
+ * check validation of installed Billing package in your device
+ * @param _context
+ * @return If it is true Billing package is valid. otherwise, is not valid.
+ */
+ static public boolean isValidAppsPackage( Context _context )
+ {
+ boolean result = true;
+ try
+ {
+ Signature[] sigs = _context.getPackageManager().getPackageInfo(
+ HelperDefine.GALAXY_PACKAGE_NAME,
+ PackageManager.GET_SIGNATURES ).signatures;
+ Log.d(TAG, "isValidAppsPackage: HASHCODE : " + sigs[0].hashCode());
+ if( sigs[0].hashCode() != HelperDefine.APPS_SIGNATURE_HASHCODE )
+ {
+ result = false;
+ }
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ result = false;
+ }
+
+ return result;
+ }
+
+ /**
+ * SamsungAccount authentication
+ * @param _activity
+ */
+ static public void startAccountActivity( final Activity _activity )
+ {
+ ComponentName com = new ComponentName( HelperDefine.GALAXY_PACKAGE_NAME,
+ HelperDefine.IAP_PACKAGE_NAME + ".activity.AccountActivity" );
+ Context context = _activity.getApplicationContext();
+
+ Intent intent = new Intent();
+ intent.setComponent( com );
+
+ if(intent.resolveActivity(context.getPackageManager()) != null)
+ {
+ _activity.startActivityForResult(intent,
+ HelperDefine.REQUEST_CODE_IS_ACCOUNT_CERTIFICATION);
+ }
+ }
+
+ /**
+ * go to about page of SamsungApps in order to install IAP package.
+ */
+ static public void installAppsPackage( final BaseActivity _activity )
+ {
+ // 1. When user click the OK button on the dialog,
+ // go to SamsungApps IAP Detail page
+ // ====================================================================
+
+ Runnable OkBtnRunnable = new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ Context context = _activity.getApplicationContext();
+
+ // Link of SamsungApps for IAP install
+ // ------------------------------------------------------------
+ Uri appsDeepLink = Uri.parse(
+ "samsungapps://StoreVersionInfo/");
+ // ------------------------------------------------------------
+
+ Intent intent = new Intent();
+ intent.setData( appsDeepLink );
+
+ if( Build.VERSION.SDK_INT >= HelperDefine.HONEYCOMB_MR1 )
+ {
+ intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK |
+ Intent.FLAG_ACTIVITY_CLEAR_TOP |
+ HelperDefine.FLAG_INCLUDE_STOPPED_PACKAGES );
+ }
+ else
+ {
+ intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK |
+ Intent.FLAG_ACTIVITY_CLEAR_TOP );
+ }
+
+ if(intent.resolveActivity(context.getPackageManager()) != null) {
+ context.startActivity(intent);
+ }
+ }
+ };
+ // ====================================================================
+
+ // 2. Set error in order to notify result to third-party application.
+ // ====================================================================
+ ErrorVo errorVo = new ErrorVo();
+ _activity.setErrorVo( errorVo );
+
+ errorVo.setError( HelperDefine.IAP_PAYMENT_IS_CANCELED,
+ _activity.getString(R.string.mids_sapps_pop_payment_canceled) );
+ // ====================================================================
+
+ // 3. Show information dialog
+ // ====================================================================
+ HelperUtil.showIapDialogIfNeeded( _activity,
+ _activity.getString( R.string.mids_sapps_header_update_galaxy_apps ),
+ _activity.getString( R.string.mids_sapps_pop_a_new_version_is_available_galaxy_apps_will_be_updated_to_the_latest_version_to_complete_this_purchase ),
+ true,
+ OkBtnRunnable,
+ true );
+ // ====================================================================
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/IapHelper.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/IapHelper.java
new file mode 100644
index 0000000..9052db0
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/IapHelper.java
@@ -0,0 +1,631 @@
+package com.samsung.android.sdk.iap.lib.helper;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.AsyncTask.Status;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Base64;
+import android.util.Log;
+
+import com.samsung.android.iap.IAPConnector;
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.activity.ConsumePurchasedItemsActivity;
+import com.samsung.android.sdk.iap.lib.activity.OwnedProductActivity;
+import com.samsung.android.sdk.iap.lib.activity.PaymentActivity;
+import com.samsung.android.sdk.iap.lib.activity.ProductActivity;
+import com.samsung.android.sdk.iap.lib.helper.task.ConsumePurchasedItemsTask;
+import com.samsung.android.sdk.iap.lib.helper.task.GetOwnedListTask;
+import com.samsung.android.sdk.iap.lib.helper.task.GetProductsDetailsTask;
+import com.samsung.android.sdk.iap.lib.listener.OnConsumePurchasedItemsListener;
+import com.samsung.android.sdk.iap.lib.listener.OnGetOwnedListListener;
+import com.samsung.android.sdk.iap.lib.listener.OnGetProductsDetailsListener;
+import com.samsung.android.sdk.iap.lib.listener.OnIapBindListener;
+import com.samsung.android.sdk.iap.lib.listener.OnPaymentListener;
+
+public class IapHelper extends HelperDefine
+{
+ private static final String TAG = IapHelper.class.getSimpleName();
+
+ /**
+ * When you release a application,
+ * this Mode must be set to {@link HelperDefine#IAP_MODE_PRODUCTION}
+ * Please double-check this mode before release.
+ */
+ private int mMode = HelperDefine.IAP_MODE_PRODUCTION;
+ // ========================================================================
+
+ private Context mContext = null;
+
+ private IAPConnector mIapConnector = null;
+ private ServiceConnection mServiceConn = null;
+
+ // AsyncTask for API
+ // ========================================================================
+ private GetProductsDetailsTask mGetProductsDetailsTask = null;
+ private GetOwnedListTask mGetOwnedListTask = null;
+ private ConsumePurchasedItemsTask mConsumePurchasedItemsTask = null;
+ // ========================================================================
+
+ // API listener
+ private HelperListenerManager mListenerInstance = null;
+
+ private static IapHelper mInstance = null;
+
+ // State of IAP Service
+ // ========================================================================
+ private int mState = HelperDefine.STATE_TERM;
+ private final static Object mOperationLock = new Object();
+ static boolean mOperationRunningFlag = false;
+
+
+ // ########################################################################
+ // ########################################################################
+ // 1. SamsungIAPHeler object create and reference
+ // ########################################################################
+ // ########################################################################
+
+ /**
+ * IapHelper constructor
+ * @param _context
+ */
+ private IapHelper(Context _context )
+ {
+ _setContextAndMode( _context );
+ _setListenerInstance();
+ }
+
+ /**
+ * IapHelper singleton reference method
+ * @param _context Context
+ */
+ public static IapHelper getInstance(Context _context )
+ {
+ if( null == mInstance )
+ {
+ Log.d(TAG, "getInstance new: mContext " + _context );
+ mInstance = new IapHelper( _context );
+ }
+ else
+ {
+ Log.d(TAG, "getInstance old: mContext " + _context );
+ mInstance._setContextAndMode( _context );
+ }
+
+ return mInstance;
+ }
+
+ public void setOperationMode(OperationMode _mode)
+ {
+ if(_mode == OperationMode.OPERATION_MODE_TEST)
+ mMode = HelperDefine.IAP_MODE_TEST;
+ else if(_mode == OperationMode.OPERATION_MODE_TEST_FAILURE)
+ mMode = HelperDefine.IAP_MODE_TEST_FAILURE;
+ else
+ mMode = HelperDefine.IAP_MODE_PRODUCTION;
+ }
+
+ private void _setContextAndMode( Context _context )
+ {
+ mContext = _context.getApplicationContext();
+ }
+
+ private void _setListenerInstance()
+ {
+ if(mListenerInstance != null) {
+ mListenerInstance.destroy();
+ mListenerInstance = null;
+ }
+ mListenerInstance = HelperListenerManager.getInstance();
+ }
+
+
+ // ########################################################################
+ // ########################################################################
+ // 2. Binding for IAPService
+ // ########################################################################
+ // ########################################################################
+
+ /**
+ * bind to IAPService
+ *
+ * @param _listener The listener that receives notifications
+ * when bindIapService method is finished.
+ */
+ public void bindIapService( final OnIapBindListener _listener )
+ {
+ // exit If already bound
+ // ====================================================================
+ if( mState >= HelperDefine.STATE_BINDING )
+ {
+ if( _listener != null )
+ {
+ _listener.onBindIapFinished( HelperDefine.IAP_RESPONSE_RESULT_OK );
+ }
+
+ return;
+ }
+ // ====================================================================
+
+ // Connection to IAP service
+ // ====================================================================
+ mServiceConn = new ServiceConnection()
+ {
+ @Override
+ public void onServiceDisconnected( ComponentName _name )
+ {
+ Log.d( TAG, "IAP Service Disconnected..." );
+
+ mState = HelperDefine.STATE_TERM;
+ mIapConnector = null;
+ mServiceConn = null;
+ }
+
+ @Override
+ public void onServiceConnected
+ (
+ ComponentName _name,
+ IBinder _service
+ )
+ {
+ mIapConnector = IAPConnector.Stub.asInterface( _service );
+
+ if( _listener != null ) {
+ if (mIapConnector != null) {
+ mState = HelperDefine.STATE_BINDING;
+
+ _listener.onBindIapFinished(HelperDefine.IAP_RESPONSE_RESULT_OK);
+ } else {
+ mState = HelperDefine.STATE_TERM;
+
+ _listener.onBindIapFinished(
+ HelperDefine.IAP_RESPONSE_RESULT_UNAVAILABLE);
+ }
+ }
+ }
+ };
+ // ====================================================================
+ Intent serviceIntent = new Intent();
+ serviceIntent.setComponent(new ComponentName(HelperDefine.GALAXY_PACKAGE_NAME, HelperDefine.IAP_SERVICE_NAME));
+// IAP_PACKAGE_NAME + ".service.IAPService"));
+ // bind to IAPService
+ // ====================================================================
+ mContext.bindService( serviceIntent,
+ mServiceConn,
+ Context.BIND_AUTO_CREATE );
+ // ====================================================================
+ }
+
+
+ /* ########################################################################
+ * ########################################################################
+ * 3. Method using IAP APIs.
+ * ( GetProductsDetailsTask, GetProductsDetailsTask, getInbox )
+ * ########################################################################
+ * ##################################################################### */
+ ///////////////////////////////////////////////////////////////////////////
+ // 3.1) getProductsDetails ///////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////
+ /**
+ *
+ * This load item list by starting productActivity in this library,
+ * and the result will be sent to {@link OnGetProductsDetailsListener} Callback interface.
+ * To do that, {@link ProductActivity} must be described in AndroidManifest.xml of third-party application
+ * as below.
+ *
+ * <activity android:name="com.sec.android.iap.lib.activity.productActivity"
+ * android:theme="@style/Theme.Empty"
+ * android:configChanges="orientation|screenSize"/>
+ *
+ *
+ * @param _productIds
+ * @param _onGetProductsDetailsListener
+ */
+ public void getProductsDetails
+ (
+ String _productIds,
+ OnGetProductsDetailsListener _onGetProductsDetailsListener
+ )
+ {
+ try
+ {
+ IapStartInProgressFlag();
+ if( null == _onGetProductsDetailsListener )
+ {
+ throw new Exception( "_onGetProductsDetailsListener is null" );
+ }
+
+ mListenerInstance.setOnGetProductsDetailsListener( _onGetProductsDetailsListener );
+
+ Intent intent = new Intent( mContext, ProductActivity.class );
+ intent.putExtra( "ProductIds", _productIds );
+ intent.putExtra( "ShowErrorDialog", true );
+ intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
+
+ mContext.startActivity( intent );
+ }
+ catch (IapInProgressException e) {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * execute GetProductsDetailsTask
+ */
+ public void safeGetProductsDetails
+ (
+ BaseActivity _activity,
+ String _productIDs,
+ boolean _showErrorDialog
+ )
+ {
+ try
+ {
+ if( mGetProductsDetailsTask != null &&
+ mGetProductsDetailsTask.getStatus() != Status.FINISHED )
+ {
+ mGetProductsDetailsTask.cancel( true );
+ }
+
+ mGetProductsDetailsTask = new GetProductsDetailsTask( _activity,
+ mIapConnector,
+ _productIDs,
+ _showErrorDialog,
+ mMode);
+ mGetProductsDetailsTask.execute();
+ }
+ catch( Exception e )
+ {
+ if( null != _activity )
+ {
+ _activity.finish();
+ }
+
+ e.printStackTrace();
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // 3.2) getOwnedList ///////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////
+ /**
+ *
+ * This load owned product list by starting OwnedListActivity in this library,
+ * and the result will be sent to {@link OnGetOwnedListListener} Callback interface.
+ * To do that, {@link OwnedProductActivity} must be described in AndroidManifest.xml of third-party application
+ * as below.
+ *
+ * <activity android:name="com.sec.android.iap.lib.activity.OwnedProductActivity"
+ * android:theme="@style/Theme.Empty"
+ * android:configChanges="orientation|screenSize"/>
+ *
+ *
+ * @param _productType
+ * @param _onGetOwnedListListener
+ */
+ public void getOwnedList
+ (
+ String _productType,
+ OnGetOwnedListListener _onGetOwnedListListener
+ )
+ {
+ try
+ {
+ IapStartInProgressFlag();
+ if( null == _onGetOwnedListListener )
+ {
+ throw new Exception( "_onGetOwnedListListener is null" );
+ }
+
+ mListenerInstance.setOnGetOwnedListListener( _onGetOwnedListListener );
+
+ Log.d(TAG, "getOwnedList: " + mContext);
+ Intent intent = new Intent( mContext, OwnedProductActivity.class );
+
+ if(_productType==null)
+ intent.putExtra( "ProductType", "");
+ else
+ intent.putExtra( "ProductType", _productType );
+ intent.putExtra( "ShowErrorDialog", true );
+ intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
+
+ mContext.startActivity( intent );
+ }
+ catch (IapInProgressException e)
+ {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * execute GetOwnedListTask
+ */
+ public void safeGetOwnedList
+ (
+ BaseActivity _activity,
+ String _productType,
+ boolean _showErrorDialog
+ )
+ {
+ try
+ {
+ if( mGetOwnedListTask != null &&
+ mGetOwnedListTask.getStatus() != Status.FINISHED )
+ {
+ mGetOwnedListTask.cancel( true );
+ }
+
+ mGetOwnedListTask = new GetOwnedListTask( _activity,
+ mIapConnector,
+ _productType,
+ _showErrorDialog,
+ mMode);
+ mGetOwnedListTask.execute();
+ }
+ catch( Exception e )
+ {
+ if( null != _activity )
+ {
+ _activity.finish();
+ }
+
+ e.printStackTrace();
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // 3.3) consumePurchasedItems ///////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////
+ /**
+ *
+ * This load item list by starting OwnedListActivity in this library,
+ * and the result will be sent to {@link OnConsumePurchasedItemsListener} Callback interface.
+ * To do that, {@link OwnedProductActivity} must be described in AndroidManifest.xml of third-party application
+ * as below.
+ *
+ * <activity android:name="com.sec.android.iap.lib.activity.OwnedListActivity"
+ * android:theme="@style/Theme.Empty"
+ * android:configChanges="orientation|screenSize"/>
+ *
+ *
+ * @param _purchaseIds
+ * @param _onConsumePurchasedItemsListener
+ */
+ public void consumePurchasedItems
+ (
+ String _purchaseIds,
+ OnConsumePurchasedItemsListener _onConsumePurchasedItemsListener
+ )
+ {
+ try
+ {
+ IapStartInProgressFlag();
+ if( null == _onConsumePurchasedItemsListener )
+ {
+ throw new Exception( "_onConsumePurchasedItemsListener is null" );
+ }
+ if( null == _purchaseIds ) throw new Exception( "_purchaseIds is null" );
+ if( _purchaseIds.length() == 0 ) throw new Exception( "_purchaseIds is empty" );
+
+
+ mListenerInstance.setOnConsumePurchasedItemsListener( _onConsumePurchasedItemsListener );
+
+ Intent intent = new Intent( mContext, ConsumePurchasedItemsActivity.class );
+
+ intent.putExtra( "PurchaseIds", _purchaseIds );
+ intent.putExtra( "ShowErrorDialog", true );
+
+ intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
+
+ mContext.startActivity( intent );
+ }
+ catch (IapInProgressException e)
+ {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * execute ConsumePurchasedItemsTask
+ */
+ public void safeConsumePurchasedItems
+ (
+ BaseActivity _activity,
+ String _purchaseIds,
+ boolean _showErrorDialog
+ )
+ {
+ try
+ {
+ if( mConsumePurchasedItemsTask != null &&
+ mConsumePurchasedItemsTask.getStatus() != Status.FINISHED )
+ {
+ mConsumePurchasedItemsTask.cancel( true );
+ }
+
+ mConsumePurchasedItemsTask = new ConsumePurchasedItemsTask( _activity,
+ mIapConnector,
+ _purchaseIds,
+ _showErrorDialog,
+ mMode);
+ mConsumePurchasedItemsTask.execute();
+ }
+ catch( Exception e )
+ {
+ if( null != _activity )
+ {
+ _activity.finish();
+ }
+
+ e.printStackTrace();
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // 3.2) startPurchase / ///////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////
+ /**
+ *
+ * Start payment process by starting {@link PaymentActivity} in this library,
+ * and result will be sent to {@link OnPaymentListener} interface.
+ * To do that, PaymentActivity must be described in AndroidManifest.xml of third-party application
+ * as below.
+ *
+ * <activity android:name="com.sec.android.iap.lib.activity.PaymentActivity"
+ * android:theme="@style/Theme.Empty"
+ * android:configChanges="orientation|screenSize"/>
+ *
+ *
+ * @param _itemId
+ * @param _passThroughParam
+ * @param _showSuccessDialog If it is true, dialog of payment success is
+ * shown. otherwise it will not be shown.
+ * @param _onPaymentListener
+ */
+ public void startPayment
+ (
+ String _itemId,
+ String _passThroughParam,
+ boolean _showSuccessDialog,
+ OnPaymentListener _onPaymentListener
+ )
+ {
+ try
+ {
+ IapStartInProgressFlag();
+ if( null == _onPaymentListener )
+ {
+ throw new Exception( "OnPaymentListener is null" );
+ }
+ if( _passThroughParam != null && _passThroughParam.getBytes().length > HelperDefine.PASSTHROGUH_MAX_LENGTH )
+ throw new Exception( "PassThroughParam length exceeded (MAX " + HelperDefine.PASSTHROGUH_MAX_LENGTH +")" );
+ mListenerInstance.setOnPaymentListener( _onPaymentListener );
+
+ Intent intent = new Intent( mContext, PaymentActivity.class );
+ intent.putExtra( "ItemId", _itemId );
+ String encodedPassThroughParam = "";
+ if(_passThroughParam!=null)
+ encodedPassThroughParam = Base64.encodeToString(_passThroughParam.getBytes(),0);
+ intent.putExtra( "PassThroughParam", encodedPassThroughParam);
+ intent.putExtra( "ShowSuccessDialog", _showSuccessDialog );
+ intent.putExtra( "ShowErrorDialog", true );
+ intent.putExtra( "OperationMode", mMode );
+ Log.d(TAG, "startPayment: " + mMode);
+
+ intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
+
+ mContext.startActivity( intent );
+ }
+ catch (IapInProgressException e)
+ {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+
+ // ########################################################################
+ // ########################################################################
+ // 4. etc
+ // ########################################################################
+ // ########################################################################
+
+ /**
+ * Stop running task, {@link GetProductsDetailsTask}, {@link ConsumePurchasedItemsTask}
+ * or {@link GetOwnedListTask} } before dispose().
+ */
+ private void stopTasksIfNotFinished()
+ {
+ if( mGetProductsDetailsTask != null )
+ {
+ if ( mGetProductsDetailsTask.getStatus() != Status.FINISHED )
+ {
+ Log.e(TAG, "stopTasksIfNotFinished: mGetProductsDetailsTask Status > " + mGetProductsDetailsTask.getStatus());
+ mGetProductsDetailsTask.cancel( true );
+ }
+ }
+
+ if( mGetOwnedListTask != null )
+ {
+ if ( mGetOwnedListTask.getStatus() != Status.FINISHED )
+ {
+ Log.e(TAG, "stopTasksIfNotFinished: mGetOwnedListTask Status > "+ mGetOwnedListTask.getStatus());
+ mGetOwnedListTask.cancel( true );
+ }
+ }
+
+ if( mConsumePurchasedItemsTask != null )
+ {
+ if ( mConsumePurchasedItemsTask.getStatus() != Status.FINISHED )
+ {
+ Log.e(TAG, "stopTasksIfNotFinished: mConsumePurchasedItemsTask Status > " + mConsumePurchasedItemsTask.getStatus());
+ mConsumePurchasedItemsTask.cancel( true );
+ }
+ }
+ }
+
+ /**
+ * Unbind from IAPService and release used resources.
+ */
+ public void dispose()
+ {
+ stopTasksIfNotFinished();
+
+ if( mContext != null && mServiceConn != null )
+ {
+ mContext.unbindService( mServiceConn );
+ }
+
+ mState = HelperDefine.STATE_TERM;
+ mServiceConn = null;
+ mIapConnector = null;
+ IapEndInProgressFlag();
+ }
+
+ void IapStartInProgressFlag() throws IapInProgressException {
+ Log.d(TAG, "IapStartInProgressFlag: ");
+ synchronized (mOperationLock)
+ {
+ if(mOperationRunningFlag)
+ {
+ throw new IapInProgressException("another operation is running");
+ }
+ mOperationRunningFlag = true;
+
+ }
+ }
+ void IapEndInProgressFlag() {
+ Log.d(TAG, "IapEndInProgressFlag: ");
+ synchronized (mOperationLock)
+ {
+ mOperationRunningFlag = false;
+ }
+ }
+
+ public static class IapInProgressException extends Exception {
+ public IapInProgressException( String message ) {
+ super(message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/BaseTask.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/BaseTask.java
new file mode 100644
index 0000000..38880cb
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/BaseTask.java
@@ -0,0 +1,159 @@
+package com.samsung.android.sdk.iap.lib.helper.task;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.samsung.android.iap.IAPConnector;
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.helper.HelperUtil;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+
+/**
+ * Created by sangbum7.kim on 2017-09-01.
+ */
+
+public class BaseTask extends AsyncTask
+{
+ private static final String TAG = BaseTask.class.getSimpleName();
+
+ protected BaseActivity mActivity = null;
+ protected IAPConnector mIapConnector = null;
+ protected int mMode = HelperDefine.IAP_MODE_PRODUCTION;
+ protected boolean mShowErrorDialog = true;
+
+ protected ErrorVo mErrorVo = new ErrorVo();
+
+ public BaseTask(BaseActivity _activity,
+ IAPConnector _iapConnector,
+ boolean _showErrorDialog,
+ int _mode)
+ {
+
+ mActivity = _activity;
+ mIapConnector = _iapConnector;
+ mShowErrorDialog = _showErrorDialog;
+ mMode = _mode;
+
+ mActivity.setErrorVo( mErrorVo );
+ }
+
+ @Override
+ protected Boolean doInBackground( String... params ) {
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute( Boolean _result )
+ {
+ // 1. If result is true
+ // ================================================================
+ if( true == _result )
+ {
+ // 1) If list of product is successfully loaded
+ // ============================================================
+ if( mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NONE )
+ {
+ // finish Activity in order to notify the result to
+ // third-party application immediately.
+ // --------------------------------------------------------
+ if( mActivity != null )
+ {
+ mActivity.finish();
+ }
+ // --------------------------------------------------------
+ }
+ // ============================================================
+ // 2) If the IAP package needs to be upgraded
+ // ============================================================
+ else if( mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NEED_APP_UPGRADE )
+ {
+ // a) When user click the OK button on the dialog,
+ // go to SamsungApps IAP Detail page.
+ // --------------------------------------------------------
+ Runnable OkBtnRunnable = new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ if( true == TextUtils.isEmpty(
+ mErrorVo.getExtraString() ) )
+ {
+ return;
+ }
+
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+
+ intent.setData(
+ Uri.parse( mErrorVo.getExtraString() ) );
+
+ intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
+
+ try
+ {
+ mActivity.startActivity( intent );
+ }
+ catch( ActivityNotFoundException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ };
+ // --------------------------------------------------------
+
+ // b) Pop-up shows that the IAP package needs to be updated.
+ // --------------------------------------------------------
+ HelperUtil.showIapDialogIfNeeded( mActivity,
+ mActivity.getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mErrorVo.getErrorString(),
+ true,
+ OkBtnRunnable,
+ true );
+ // --------------------------------------------------------
+
+ Log.e( TAG, mErrorVo.getErrorString() );
+ }
+ // ============================================================
+ // 3) If error is occurred during loading list of product
+ // ============================================================
+ else
+ {
+ HelperUtil.showIapDialogIfNeeded( mActivity,
+ mActivity.getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mErrorVo.getErrorString(),
+ true,
+ null,
+ mShowErrorDialog );
+
+ Log.e( TAG, mErrorVo.getErrorString() );
+ }
+ // ============================================================
+ }
+ // ================================================================
+ // 2. If result is false
+ // ================================================================
+ else
+ {
+ HelperUtil.showIapDialogIfNeeded( mActivity,
+ mActivity.getString( R.string.mids_sapps_header_samsung_in_app_purchase_abb ),
+ mActivity.getString( R.string.mids_sapps_pop_unknown_error_occurred )
+ + "[Lib_ProductsDetails]",
+ true,
+ null,
+ mShowErrorDialog );
+ }
+ // ================================================================
+ }
+
+ @Override
+ protected void onCancelled()
+ {
+ Log.e(TAG, "onCancelled: task cancelled" );
+ mActivity.finish();
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/ConsumePurchasedItemsTask.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/ConsumePurchasedItemsTask.java
new file mode 100644
index 0000000..c6b4f59
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/ConsumePurchasedItemsTask.java
@@ -0,0 +1,120 @@
+package com.samsung.android.sdk.iap.lib.helper.task;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import com.samsung.android.iap.IAPConnector;
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.vo.ConsumeVo;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+
+import java.util.ArrayList;
+
+/**
+ * Asynchronized Task to load a list of items
+ */
+public class ConsumePurchasedItemsTask extends BaseTask
+{
+ private static final String TAG = GetOwnedListTask.class.getSimpleName();
+ private String mPurchaseIds = "";
+
+ ArrayList mConsumeList = new ArrayList();
+
+ public ConsumePurchasedItemsTask
+ (
+ BaseActivity _activity,
+ IAPConnector _iapConnector,
+ String _purchaseIds,
+ boolean _showErrorDialog,
+ int _mode
+ )
+ {
+ super(_activity,_iapConnector,_showErrorDialog,_mode);
+ mPurchaseIds = _purchaseIds;
+
+ mActivity.setConsumeList(mConsumeList);
+ }
+
+ @Override
+ protected Boolean doInBackground( String... params )
+ {
+ try
+ {
+ // 1) call getItemList() method of IAPService
+ // ============================================================
+ Bundle bundle = mIapConnector.consumePurchasedItems(
+ mActivity.getPackageName(),
+ mPurchaseIds,
+ mMode );
+ // ============================================================
+
+ // 2) save status code, error string and extra String.
+ // ============================================================
+ if (bundle != null) {
+ mErrorVo.setError(bundle.getInt(HelperDefine.KEY_NAME_STATUS_CODE),
+ bundle.getString(HelperDefine.KEY_NAME_ERROR_STRING));
+
+ mErrorVo.setExtraString(bundle.getString(
+ HelperDefine.KEY_NAME_IAP_UPGRADE_URL));
+ } else {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred ) );
+ }
+ // ============================================================
+
+ // 3) If item list is loaded successfully,
+ // make item list by Bundle data
+ // ============================================================
+ // ============================================================
+
+ // 3) If item list is loaded successfully,
+ // make item list by Bundle data
+ // ============================================================
+ if( mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NONE )
+ {
+ if(bundle != null) {
+ Log.d(TAG, "doInBackground: success");
+ ArrayList consumePurchasedItemsStringList =
+ bundle.getStringArrayList( HelperDefine.KEY_NAME_RESULT_LIST );
+
+ if( consumePurchasedItemsStringList != null )
+ {
+ for( String consumePurchasedItemString : consumePurchasedItemsStringList )
+ {
+ ConsumeVo consumeVo = new ConsumeVo( consumePurchasedItemString );
+ mConsumeList.add( consumeVo );
+ }
+ }
+ else
+ {
+ Log.d( TAG, "Bundle Value 'RESULT_LIST' is null." );
+ }
+ }
+ }
+ // ============================================================
+ // 4) If failed, print log.
+ // ============================================================
+ else
+ {
+ Log.d( TAG, mErrorVo.getErrorString() );
+ }
+ // ============================================================
+ }
+ catch( Exception e )
+ {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred ) );
+
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetOwnedListTask.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetOwnedListTask.java
new file mode 100644
index 0000000..27388f2
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetOwnedListTask.java
@@ -0,0 +1,120 @@
+package com.samsung.android.sdk.iap.lib.helper.task;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import com.samsung.android.iap.IAPConnector;
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.vo.OwnedProductVo;
+
+import java.util.ArrayList;
+
+/**
+ * Asynchronized Task to load a list of items
+ */
+public class GetOwnedListTask extends BaseTask
+{
+ private static final String TAG = GetOwnedListTask.class.getSimpleName();
+ private String mProductType = "";
+
+ ArrayList mOwnedList = new ArrayList();
+
+ public GetOwnedListTask
+ (
+ BaseActivity _activity,
+ IAPConnector _iapConnector,
+ String _productType,
+ boolean _showErrorDialog,
+ int _mode
+ )
+ {
+ super(_activity,_iapConnector,_showErrorDialog,_mode);
+ mProductType = _productType;
+
+ mActivity.setOwnedList( mOwnedList );
+ }
+
+ @Override
+ protected Boolean doInBackground( String... params )
+ {
+ Log.d(TAG, "doInBackground: start");
+ try
+ {
+ int pagingIndex = 1;
+ do {
+ Log.d(TAG, "doInBackground: pagingIndex = " + pagingIndex);
+ // 1) call getItemList() method of IAPService
+ // ============================================================
+ Bundle bundle = mIapConnector.getOwnedList(
+ mActivity.getPackageName(),
+ mProductType,
+ pagingIndex,
+ mMode);
+ // ============================================================
+
+ // 2) save status code, error string and extra String.
+ // ============================================================
+ if (bundle != null) {
+ mErrorVo.setError(bundle.getInt(HelperDefine.KEY_NAME_STATUS_CODE),
+ bundle.getString(HelperDefine.KEY_NAME_ERROR_STRING));
+
+ mErrorVo.setExtraString(bundle.getString(
+ HelperDefine.KEY_NAME_IAP_UPGRADE_URL));
+ } else {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred));
+ }
+ // ============================================================
+
+ // 3) If item list is loaded successfully,
+ // make item list by Bundle data
+ // ============================================================
+ if (mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NONE) {
+ if (bundle != null) {
+ String nextPagingIndex = bundle.getString(HelperDefine.NEXT_PAGING_INDEX);
+ if (nextPagingIndex != null && nextPagingIndex.length() > 0)
+ pagingIndex = Integer.parseInt(nextPagingIndex);
+ else
+ pagingIndex = -1;
+
+ ArrayList ownedProductStringList =
+ bundle.getStringArrayList(HelperDefine.KEY_NAME_RESULT_LIST);
+
+ if (ownedProductStringList != null) {
+ for (String ownedProductString : ownedProductStringList) {
+ OwnedProductVo ownedPrroductVo = new OwnedProductVo(ownedProductString);
+ mOwnedList.add(ownedPrroductVo);
+ }
+ } else {
+ Log.d(TAG, "Bundle Value 'RESULT_LIST' is null.");
+ }
+ }
+ }
+ // ============================================================
+ // 4) If failed, print log.
+ // ============================================================
+ else {
+ Log.d(TAG, mErrorVo.getErrorString());
+ return true;
+ }
+ // ============================================================
+ } while (pagingIndex > 0);
+ }
+ catch( Exception e )
+ {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred ) );
+
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetProductsDetailsTask.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetProductsDetailsTask.java
new file mode 100644
index 0000000..582f516
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetProductsDetailsTask.java
@@ -0,0 +1,122 @@
+package com.samsung.android.sdk.iap.lib.helper.task;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import com.samsung.android.iap.IAPConnector;
+import com.samsung.android.sdk.iap.lib.R;
+import com.samsung.android.sdk.iap.lib.activity.BaseActivity;
+import com.samsung.android.sdk.iap.lib.helper.HelperDefine;
+import com.samsung.android.sdk.iap.lib.vo.ProductVo;
+
+import java.util.ArrayList;
+
+/**
+ * Asynchronized Task to load a list of items
+ */
+public class GetProductsDetailsTask extends BaseTask
+{
+ private static final String TAG = GetProductsDetailsTask.class.getSimpleName();
+ private String mProductIds = "";
+ ArrayList mProductsDetails = new ArrayList();
+
+ public GetProductsDetailsTask
+ (
+ BaseActivity _activity,
+ IAPConnector _iapConnector,
+ String _productIDs,
+ boolean _showErrorDialog,
+ int _mode
+ )
+ {
+ super(_activity,_iapConnector,_showErrorDialog,_mode);
+ mProductIds = _productIDs;
+
+ mActivity.setProductsDetails( mProductsDetails );
+ }
+
+ @Override
+ protected Boolean doInBackground( String... params )
+ {
+ try
+ {
+ int pagingIndex = 1;
+ do {
+ // 1) call getProductsDetails() method of IAPService
+ // ---- Order Priority ----
+ // 1. if productIds is not empty, the infomations abouts products included in the productIds are returned
+ // 2. if productIds is empty, the infomations about all products in this package are returned on a page by page
+ // ============================================================
+ Bundle bundle = mIapConnector.getProductsDetails(
+ mActivity.getPackageName(),
+ mProductIds,
+ pagingIndex,
+ mMode);
+ // ============================================================
+
+ // 2) save status code, error string and extra String.
+ // ============================================================
+ if (bundle != null) {
+ mErrorVo.setError(bundle.getInt(HelperDefine.KEY_NAME_STATUS_CODE),
+ bundle.getString(HelperDefine.KEY_NAME_ERROR_STRING));
+
+ mErrorVo.setExtraString(bundle.getString(
+ HelperDefine.KEY_NAME_IAP_UPGRADE_URL));
+ } else {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred));
+ }
+ // ============================================================
+
+ // 3) If item list is loaded successfully,
+ // make item list by Bundle data
+ // ============================================================
+ if (mErrorVo.getErrorCode() == HelperDefine.IAP_ERROR_NONE) {
+ if (bundle != null) {
+ String nextPagingIndex = bundle.getString(HelperDefine.NEXT_PAGING_INDEX);
+ if (nextPagingIndex != null && nextPagingIndex.length() > 0) {
+ pagingIndex = Integer.parseInt(nextPagingIndex);
+ Log.d(TAG,"PagingIndex = " + nextPagingIndex);
+ }
+ else
+ pagingIndex = -1;
+
+ ArrayList productStringList =
+ bundle.getStringArrayList(HelperDefine.KEY_NAME_RESULT_LIST);
+
+ if (productStringList != null) {
+ for (String productString : productStringList) {
+ ProductVo productVo = new ProductVo(productString);
+ mProductsDetails.add(productVo);
+ }
+ } else {
+ Log.d(TAG, "Bundle Value 'RESULT_LIST' is null.");
+ }
+ }
+ }
+ // ============================================================
+ // 4) If failed, print log.
+ // ============================================================
+ else {
+ Log.d(TAG, mErrorVo.getErrorString());
+ return true;
+ }
+ // ============================================================
+ }while (pagingIndex>0);
+ }
+ catch( Exception e )
+ {
+ mErrorVo.setError(
+ HelperDefine.IAP_ERROR_COMMON,
+ mActivity.getString(
+ R.string.mids_sapps_pop_unknown_error_occurred ) );
+
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnConsumePurchasedItemsListener.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnConsumePurchasedItemsListener.java
new file mode 100644
index 0000000..d181906
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnConsumePurchasedItemsListener.java
@@ -0,0 +1,22 @@
+package com.samsung.android.sdk.iap.lib.listener;
+
+import com.samsung.android.sdk.iap.lib.helper.task.GetOwnedListTask;
+import com.samsung.android.sdk.iap.lib.vo.ConsumeVo;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+
+import java.util.ArrayList;
+
+/**
+ * Callback Interface used with
+ * {@link GetOwnedListTask}
+ */
+public interface OnConsumePurchasedItemsListener
+{
+ /**
+ * Callback method to be invoked
+ * when {@link GetOwnedListTask} has been finished.
+ * @param _errorVO
+ * @param _consumeList
+ */
+ void onConsumePurchasedItems(ErrorVo _errorVO, ArrayList _consumeList);
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetOwnedListListener.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetOwnedListListener.java
new file mode 100644
index 0000000..2b82713
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetOwnedListListener.java
@@ -0,0 +1,22 @@
+package com.samsung.android.sdk.iap.lib.listener;
+
+import com.samsung.android.sdk.iap.lib.helper.task.GetOwnedListTask;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+import com.samsung.android.sdk.iap.lib.vo.OwnedProductVo;
+
+import java.util.ArrayList;
+
+/**
+ * Callback Interface used with
+ * {@link GetOwnedListTask}
+ */
+public interface OnGetOwnedListListener
+{
+ /**
+ * Callback method to be invoked
+ * when {@link GetOwnedListTask} has been finished.
+ * @param _errorVO
+ * @param _ownedList
+ */
+ void onGetOwnedProducts(ErrorVo _errorVO, ArrayList _ownedList);
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetProductsDetailsListener.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetProductsDetailsListener.java
new file mode 100644
index 0000000..495410b
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetProductsDetailsListener.java
@@ -0,0 +1,22 @@
+package com.samsung.android.sdk.iap.lib.listener;
+
+import com.samsung.android.sdk.iap.lib.helper.task.GetProductsDetailsTask;
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+import com.samsung.android.sdk.iap.lib.vo.ProductVo;
+
+import java.util.ArrayList;
+
+/**
+ * Callback Interface used with
+ * {@link GetProductsDetailsTask}
+ */
+public interface OnGetProductsDetailsListener
+{
+ /**
+ * Callback method to be invoked
+ * when {@link GetProductsDetailsTask} has been finished.
+ * @param _errorVO
+ * @param _productList
+ */
+ void onGetProducts(ErrorVo _errorVO, ArrayList _productList);
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnIapBindListener.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnIapBindListener.java
new file mode 100644
index 0000000..48f2a36
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnIapBindListener.java
@@ -0,0 +1,13 @@
+package com.samsung.android.sdk.iap.lib.listener;
+
+/**
+ * Callback Interface to be invoked when bind to IAPService has been finished.
+ */
+public interface OnIapBindListener
+{
+ /**
+ * Callback method to be invoked after binding to IAP service successfully.
+ * @param result
+ */
+ public void onBindIapFinished( int result );
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnPaymentListener.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnPaymentListener.java
new file mode 100644
index 0000000..36b53e5
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnPaymentListener.java
@@ -0,0 +1,16 @@
+package com.samsung.android.sdk.iap.lib.listener;
+
+import com.samsung.android.sdk.iap.lib.vo.ErrorVo;
+import com.samsung.android.sdk.iap.lib.vo.PurchaseVo;
+
+/**
+ * Callback Interface to be invoked when payment has been finished.
+ */
+public interface OnPaymentListener
+{
+ /**
+ * Callback method to be invoked when payment has been finished.
+ * There is return data for result of financial transaction whenever it was successful or failed.
+ */
+ void onPayment( ErrorVo _errorVO, PurchaseVo _purchaseVO );
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/BaseVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/BaseVo.java
new file mode 100644
index 0000000..699cfd5
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/BaseVo.java
@@ -0,0 +1,167 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.text.format.DateFormat;
+import android.util.Base64;
+
+public class BaseVo
+{
+ private String mItemId;
+ private String mItemName;
+ private Double mItemPrice;
+ private String mItemPriceString;
+ private String mCurrencyUnit;
+ private String mCurrencyCode;
+ private String mItemDesc;
+ private String mType;
+ private Boolean mIsConsumable;
+
+ public BaseVo(){}
+
+ public BaseVo( String _jsonString )
+ {
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ setItemId( jObject.optString( "mItemId" ) );
+ setItemName( jObject.optString( "mItemName" ) );
+ setItemPrice( jObject.optDouble("mItemPrice" ) );
+ setItemPriceString( jObject.optString( "mItemPriceString" ) );
+ setCurrencyUnit( jObject.optString( "mCurrencyUnit" ) );
+ setCurrencyCode(jObject.optString( "mCurrencyCode" ));
+ setItemDesc( jObject.optString( "mItemDesc" ) );
+ setType( jObject.optString( "mType" ) );
+ Boolean isConsumable = false;
+ if(jObject.optString( "mConsumableYN" )!=null && jObject.optString( "mConsumableYN" ).equals("Y"))
+ isConsumable = true;
+ setIsConsumable(isConsumable);
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getItemId()
+ {
+ return mItemId;
+ }
+
+ public void setItemId( String _itemId )
+ {
+ mItemId = _itemId;
+ }
+
+ public String getItemName()
+ {
+ return mItemName;
+ }
+
+ public void setItemName( String _itemName )
+ {
+ mItemName = _itemName;
+ }
+
+ public Double getItemPrice()
+ {
+ return mItemPrice;
+ }
+
+ public void setItemPrice( Double _itemPrice )
+ {
+ mItemPrice = _itemPrice;
+ }
+
+ public String getItemPriceString()
+ {
+ return mItemPriceString;
+ }
+
+ public void setItemPriceString( String _itemPriceString )
+ {
+ mItemPriceString = _itemPriceString;
+ }
+
+ public String getCurrencyUnit()
+ {
+ return mCurrencyUnit;
+ }
+
+ public void setCurrencyUnit( String _currencyUnit )
+ {
+ mCurrencyUnit = _currencyUnit;
+ }
+
+ public String getCurrencyCode() { return mCurrencyCode; }
+
+ public void setCurrencyCode( String _currencyCode )
+ {
+ mCurrencyCode = _currencyCode;
+ }
+
+ public String getItemDesc()
+ {
+ return mItemDesc;
+ }
+
+ public void setItemDesc( String _itemDesc )
+ {
+ mItemDesc = _itemDesc;
+ }
+
+ public String getType()
+ {
+ return mType;
+ }
+
+ public void setType( String _itemDesc )
+ {
+ mType = _itemDesc;
+ }
+
+ public Boolean getIsConsumable()
+ {
+ return mIsConsumable;
+ }
+
+ public void setIsConsumable( Boolean _consumableYN ) { mIsConsumable = _consumableYN; }
+
+
+ public String dump()
+ {
+ String dump = null;
+
+ dump = "ItemId : " + getItemId() + "\n" +
+ "ItemName : " + getItemName() + "\n" +
+ "ItemPrice : " + getItemPrice() + "\n" +
+ "ItemPriceString : " + getItemPriceString() + "\n" +
+ "ItemDesc : " + getItemDesc() + "\n" +
+ "CurrencyUnit : " + getCurrencyUnit() + "\n" +
+ "CurrencyCode : " + getCurrencyCode() + "\n" +
+ "IsConsumable : " + getIsConsumable() + "\n" +
+ "Type : " + getType();
+
+ return dump;
+ }
+
+ protected String getDateString( long _timeMills )
+ {
+ String result = "";
+ String dateFormat = "yyyy.MM.dd HH:mm:ss";
+
+ try
+ {
+ result = DateFormat.format( dateFormat, _timeMills ).toString();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ result = "";
+ }
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ConsumeVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ConsumeVo.java
new file mode 100644
index 0000000..675d3ff
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ConsumeVo.java
@@ -0,0 +1,80 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import android.util.Log;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class ConsumeVo
+{
+ private static final String TAG = ConsumeVo.class.getSimpleName();
+
+ private String mPurchaseId;
+ private String mStatusString;
+ private String mStatusCode;
+
+ public ConsumeVo(String _jsonString )
+ {
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ Log.i( TAG, jObject.toString(4) );
+
+ setPurchaseId( jObject.optString( "mPurchaseId" ) );
+ setStatusString( jObject.optString( "mStatusString" ) );
+ setStatusCode( jObject.optString( "mStatusCode" ) );
+
+ Log.i( TAG, dump() );
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getPurchaseId()
+ {
+ return mPurchaseId;
+ }
+
+ public void setPurchaseId( String _paymentId )
+ {
+ mPurchaseId = _paymentId;
+ }
+
+ public String getStatusString()
+ {
+ return mStatusString;
+ }
+
+ public void setStatusString( String _statusString )
+ {
+ mStatusString = _statusString;
+ }
+
+ public String getStatusCode()
+ {
+ return mStatusCode;
+ }
+
+ public void setStatusCode( String _statusCode )
+ {
+ mStatusCode = _statusCode;
+ }
+
+ public String dump()
+ {
+ String dump = null;
+
+ dump = "PurchaseId : " + getPurchaseId() + "\n" +
+ "StatusString : " + getStatusString() + "\n" +
+ "StatusCode : " + getStatusCode();
+
+ return dump;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ErrorVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ErrorVo.java
new file mode 100644
index 0000000..e580075
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ErrorVo.java
@@ -0,0 +1,45 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+public class ErrorVo
+{
+ private int mErrorCode = 0;
+ private String mErrorString = "";
+ private String mExtraString = "";
+
+ public int getErrorCode()
+ {
+ return mErrorCode;
+ }
+
+ public void setError( int _errorCode, String _errorString )
+ {
+ mErrorCode = _errorCode;
+ mErrorString = _errorString;
+ }
+
+ public String getErrorString()
+ {
+ return mErrorString;
+ }
+
+ public String getExtraString()
+ {
+ return mExtraString;
+ }
+
+ public void setExtraString( String _extraString )
+ {
+ mExtraString = _extraString;
+ }
+
+ public String dump()
+ {
+ String dump = "";
+
+ dump = "ErrorCode : " + getErrorCode() + "\n" +
+ "ErrorString : " + getErrorString() + "\n" +
+ "ExtraString : " + getExtraString();
+
+ return dump;
+ }
+}
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/OwnedProductVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/OwnedProductVo.java
new file mode 100644
index 0000000..4320c69
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/OwnedProductVo.java
@@ -0,0 +1,116 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import android.util.Base64;
+import android.util.Log;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class OwnedProductVo extends BaseVo
+{
+ private static final String TAG = OwnedProductVo.class.getSimpleName();
+
+ private String mPaymentId;
+ private String mPurchaseId;
+ private String mPurchaseDate;
+ private String mPassThroughParam;
+
+ // Expiration date for a item which is "subscription" type
+ // ========================================================================
+ private String mSubscriptionEndDate;
+ // ========================================================================
+
+ private String mJsonString = "";
+ public OwnedProductVo() { }
+
+ public OwnedProductVo(String _jsonString )
+ {
+ super( _jsonString );
+
+ setJsonString( _jsonString );
+ Log.i( TAG, mJsonString );
+
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ setPaymentId( jObject.optString( "mPaymentId" ) );
+ setPurchaseId( jObject.optString( "mPurchaseId" ) );
+ setPurchaseDate( getDateString( jObject.optLong( "mPurchaseDate" ) ) );
+ String decodedPassThroughParam = new String(Base64.decode(jObject.optString("mPassThroughParam"),0));
+ setPassThroughParam( decodedPassThroughParam);
+
+ setSubscriptionEndDate( getDateString( jObject.optLong( "mSubscriptionEndDate" ) ) );
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ Log.d(TAG, "OwnedProductVo: \n"+ this.dump());
+ }
+
+ public String getPaymentId() { return mPaymentId; }
+
+ public void setPaymentId( String _paymentId )
+ {
+ mPaymentId = _paymentId;
+ }
+
+ public String getPurchaseId() { return mPurchaseId; }
+
+ public void setPurchaseId( String _purchaseId )
+ {
+ mPurchaseId = _purchaseId;
+ }
+
+ public String getPurchaseDate()
+ {
+ return mPurchaseDate;
+ }
+
+ public void setPurchaseDate( String _purchaseDate ) { mPurchaseDate = _purchaseDate; }
+
+ public String getSubscriptionEndDate()
+ {
+ return mSubscriptionEndDate;
+ }
+
+ public void setSubscriptionEndDate( String _subscriptionEndDate )
+ {
+ mSubscriptionEndDate = _subscriptionEndDate;
+ }
+
+ public String getPassThroughParam()
+ {
+ return mPassThroughParam;
+ }
+
+ public void setPassThroughParam( String _passThroughParam )
+ {
+ mPassThroughParam = _passThroughParam;
+ }
+
+
+ public String getJsonString()
+ {
+ return mJsonString;
+ }
+
+ public void setJsonString( String _jsonString )
+ {
+ mJsonString = _jsonString;
+ }
+
+ public String dump()
+ {
+ String dump = super.dump() + "\n";
+
+ dump += "PaymentID : " + getPaymentId() + "\n" +
+ "PurchaseID : " + getPurchaseId() + "\n" +
+ "PurchaseDate : " + getPurchaseDate() + "\n" +
+ "PassThroughParam : " + getPassThroughParam() + "\n" +
+ "SubscriptionEndDate : " + getSubscriptionEndDate();
+
+ return dump;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ProductVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ProductVo.java
new file mode 100644
index 0000000..3077b87
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ProductVo.java
@@ -0,0 +1,128 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import android.util.Log;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class ProductVo extends BaseVo
+{
+ private static final String TAG = ProductVo.class.getSimpleName();
+
+ //Subscription data
+ private String mSubscriptionDurationUnit;
+ private String mSubscriptionDurationMultiplier;
+
+ private String mItemImageUrl;
+ private String mItemDownloadUrl;
+ private String mReserved1;
+ private String mReserved2;
+ private String mFreeTrialPeriod;
+
+// 미사용
+// private String mItemPricePSMS;
+
+ private String mJsonString;
+
+ public ProductVo(){}
+
+ public ProductVo(String _jsonString )
+ {
+ super( _jsonString );
+
+ setJsonString( _jsonString );
+ Log.i( TAG, mJsonString );
+
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ setSubscriptionDurationUnit( jObject.optString( "mSubscriptionDurationUnit" ) );
+
+ setSubscriptionDurationMultiplier( jObject.optString( "mSubscriptionDurationMultiplier" ) );
+
+ setItemImageUrl(jObject.optString( "mItemImageUrl" ));
+ setItemDownloadUrl(jObject.optString( "mItemDownloadUrl" ));
+ setReserved1(jObject.optString( "mReserved1" ));
+ setReserved2(jObject.optString( "mReserved2" ));
+ setFreeTrialPeriod(jObject.optString( "mFreeTrialPeriod" ));
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getSubscriptionDurationUnit()
+ {
+ return mSubscriptionDurationUnit;
+ }
+
+ public void setSubscriptionDurationUnit( String _subscriptionDurationUnit )
+ {
+ mSubscriptionDurationUnit = _subscriptionDurationUnit;
+ }
+
+ public String getSubscriptionDurationMultiplier()
+ {
+ return mSubscriptionDurationMultiplier;
+ }
+
+ public void setSubscriptionDurationMultiplier(
+ String _subscriptionDurationMultiplier )
+ {
+ mSubscriptionDurationMultiplier = _subscriptionDurationMultiplier;
+ }
+
+ public String getItemImageUrl() { return mItemImageUrl; }
+ public void setItemImageUrl( String _itemImageUrl )
+ {
+ mItemImageUrl = _itemImageUrl;
+ }
+
+ public String getItemDownloadUrl() { return mItemDownloadUrl; }
+ public void setItemDownloadUrl( String _itemDownloadUrl )
+ {
+ mItemDownloadUrl = _itemDownloadUrl;
+ }
+
+ public String getReserved1() { return mReserved1; }
+ public void setReserved1( String _reserved1 )
+ {
+ mReserved1 = _reserved1;
+ }
+
+ public String getReserved2() { return mReserved2; }
+ public void setReserved2( String _reserved2 )
+ {
+ mReserved2 = _reserved2;
+ }
+
+ public String getFreeTrialPeriod() { return mFreeTrialPeriod; }
+ public void setFreeTrialPeriod( String _freeTrialPeriod ){ mFreeTrialPeriod = _freeTrialPeriod; }
+
+ public String getJsonString()
+ {
+ return mJsonString;
+ }
+ public void setJsonString( String _jsonString )
+ {
+ mJsonString = _jsonString;
+ }
+
+ public String dump()
+ {
+ String dump = super.dump() + "\n";
+
+ dump += "SubscriptionDurationUnit : "
+ + getSubscriptionDurationUnit() + "\n" +
+ "SubscriptionDurationMultiplier : " +
+ getSubscriptionDurationMultiplier() + "\n" +
+ "ItemImageUrl : " + getItemImageUrl() + "\n" +
+ "ItemDownloadUrl : " + getItemDownloadUrl() + "\n" +
+ "Reserved1 : " + getReserved1() + "\n" +
+ "Reserved2 : " + getReserved2() + "\n" +
+ "FreeTrialPeriod : " + getFreeTrialPeriod();
+ return dump;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/PurchaseVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/PurchaseVo.java
new file mode 100644
index 0000000..07492a3
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/PurchaseVo.java
@@ -0,0 +1,159 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.util.Base64;
+import android.util.Log;
+
+public class PurchaseVo extends BaseVo
+{
+ private static final String TAG = PurchaseVo.class.getSimpleName();
+
+ private String mPaymentId;
+ private String mPurchaseId;
+ private String mPurchaseDate;
+ private String mVerifyUrl;
+ private String mPassThroughParam;
+
+ private String mItemImageUrl;
+ private String mItemDownloadUrl;
+ private String mReserved1;
+ private String mReserved2;
+
+ private String mJsonString;
+
+ public PurchaseVo( String _jsonString )
+ {
+ super( _jsonString );
+
+ setJsonString( _jsonString );
+ Log.i( TAG, mJsonString );
+
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ setPaymentId( jObject.optString( "mPaymentId" ) );
+ setPurchaseId( jObject.optString( "mPurchaseId" ) );
+ setPurchaseDate( getDateString( jObject.optLong( "mPurchaseDate" ) ) );
+ String decodedPassThroughParam = new String(Base64.decode(jObject.optString("mPassThroughParam"),0));
+ setPassThroughParam( decodedPassThroughParam);
+
+ setItemImageUrl(jObject.optString( "mItemImageUrl" ));
+ setItemDownloadUrl(jObject.optString( "mItemDownloadUrl" ));
+ setReserved1(jObject.optString( "mReserved1" ));
+ setReserved2(jObject.optString( "mReserved2" ));
+
+ setVerifyUrl( jObject.optString( "mVerifyUrl" ) );
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getPaymentId()
+ {
+ return mPaymentId;
+ }
+
+ public void setPaymentId( String _paymentId )
+ {
+ mPaymentId = _paymentId;
+ }
+
+ public String getPurchaseId()
+ {
+ return mPurchaseId;
+ }
+
+ public void setPurchaseId( String _purchaseId )
+ {
+ mPurchaseId = _purchaseId;
+ }
+
+ public String getPurchaseDate()
+ {
+ return mPurchaseDate;
+ }
+
+ public void setPurchaseDate( String _purchaseDate )
+ {
+ mPurchaseDate = _purchaseDate;
+ }
+
+ public String getVerifyUrl()
+ {
+ return mVerifyUrl;
+ }
+
+ public void setVerifyUrl(String _verifyUrl)
+ {
+ mVerifyUrl = _verifyUrl;
+ }
+
+ public String getPassThroughParam()
+ {
+ return mPassThroughParam;
+ }
+
+ public void setPassThroughParam( String _passThroughParam )
+ {
+ mPassThroughParam = _passThroughParam;
+ }
+
+ public String getItemImageUrl() { return mItemImageUrl; }
+ public void setItemImageUrl( String _itemImageUrl )
+ {
+ mItemImageUrl = _itemImageUrl;
+ }
+
+ public String getItemDownloadUrl() { return mItemDownloadUrl; }
+ public void setItemDownloadUrl( String _itemDownloadUrl )
+ {
+ mItemDownloadUrl = _itemDownloadUrl;
+ }
+
+ public String getReserved1() { return mReserved1; }
+ public void setReserved1( String _reserved1 )
+ {
+ mReserved1 = _reserved1;
+ }
+
+ public String getReserved2() { return mReserved2; }
+ public void setReserved2( String _reserved2 )
+ {
+ mReserved2 = _reserved2;
+ }
+
+
+
+
+ public String getJsonString()
+ {
+ return mJsonString;
+ }
+
+ public void setJsonString( String _jsonString )
+ {
+ mJsonString = _jsonString;
+ }
+
+ public String dump()
+ {
+ String dump = super.dump() + "\n";
+
+ dump += "PaymentID : " + getPaymentId() + "\n" +
+ "PurchaseId : " + getPurchaseId() + "\n" +
+ "PurchaseDate : " + getPurchaseDate() + "\n" +
+ "PassThroughParam : " + getPassThroughParam() + "\n" +
+ "VerifyUrl : " + getVerifyUrl() + "\n" +
+ "ItemImageUrl : " + getItemImageUrl() + "\n" +
+ "ItemDownloadUrl : " + getItemDownloadUrl() + "\n" +
+ "Reserved1 : " + getReserved1() + "\n" +
+ "Reserved2 : " + getReserved2();
+
+ return dump;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/VerificationVo.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/VerificationVo.java
new file mode 100644
index 0000000..0b76aa3
--- /dev/null
+++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/VerificationVo.java
@@ -0,0 +1,132 @@
+package com.samsung.android.sdk.iap.lib.vo;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.util.Log;
+
+public class VerificationVo
+{
+ private static final String TAG = VerificationVo.class.getSimpleName();
+
+ private String mItemId;
+ private String mItemName;
+ private String mItemDesc;
+ private String mPurchaseDate;
+ private String mPaymentId;
+ private String mPaymentAmount;
+ private String mStatus;
+
+ public VerificationVo( String _jsonString )
+ {
+ try
+ {
+ JSONObject jObject = new JSONObject( _jsonString );
+
+ Log.i( TAG, jObject.toString(4) );
+
+ setItemId( jObject.optString( "itemId" ) );
+ setItemName( jObject.optString( "itemName" ) );
+ setItemDesc( jObject.optString( "itemDesc" ) );
+ setPurchaseDate( jObject.optString( "purchaseDate" ) );
+ setPaymentId( jObject.optString( "paymentId" ) );
+ setPaymentAmount( jObject.optString( "paymentAmount" ) );
+ setStatus( jObject.optString( "status" ) );
+
+ Log.i( TAG, dump() );
+ }
+ catch( JSONException e )
+ {
+ e.printStackTrace();
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getItemId()
+ {
+ return mItemId;
+ }
+
+ public void setItemId( String _itemId )
+ {
+ mItemId = _itemId;
+ }
+
+ public String getItemName()
+ {
+ return mItemName;
+ }
+
+ public void setItemName( String _itemName )
+ {
+ mItemName = _itemName;
+ }
+
+ public String getItemDesc()
+ {
+ return mItemDesc;
+ }
+
+ public void setItemDesc( String _itemDesc )
+ {
+ mItemDesc = _itemDesc;
+ }
+
+ public String getPurchaseDate()
+ {
+ return mPurchaseDate;
+ }
+
+ public void setPurchaseDate( String _purchaseDate )
+ {
+ mPurchaseDate = _purchaseDate;
+ }
+
+ public String getPaymentId()
+ {
+ return mPaymentId;
+ }
+
+ public void setPaymentId( String _paymentId )
+ {
+ mPaymentId = _paymentId;
+ }
+
+ public String getPaymentAmount()
+ {
+ return mPaymentAmount;
+ }
+
+ public void setPaymentAmount( String _paymentAmount )
+ {
+ mPaymentAmount = _paymentAmount;
+ }
+
+ public String getStatus()
+ {
+ return mStatus;
+ }
+
+ public void setStatus( String _status )
+ {
+ mStatus = _status;
+ }
+
+ public String dump()
+ {
+ String dump = null;
+
+ dump = "ItemId : " + getItemId() + "\n" +
+ "ItemName : " + getItemName() + "\n" +
+ "ItemDesc : " + getItemDesc() + "\n" +
+ "PurchaseDate : " + getPurchaseDate() + "\n" +
+ "PaymentId : " + getPaymentId() + "\n" +
+ "PaymentAmount : " + getPaymentAmount() + "\n" +
+ "Status : " + getStatus();
+
+ return dump;
+ }
+}
\ No newline at end of file
diff --git a/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_effect_holo_light.png
new file mode 100644
index 0000000..f8e90af
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_effect_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_holo_light.png b/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_holo_light.png
new file mode 100644
index 0000000..981e898
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_effect_holo_light.png
new file mode 100644
index 0000000..f8e90af
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_effect_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_holo_light.png b/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_holo_light.png
new file mode 100644
index 0000000..981e898
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_effect_holo_light.png
new file mode 100644
index 0000000..2960eb0
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_effect_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_holo_light.png b/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_holo_light.png
new file mode 100644
index 0000000..67f5018
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_effect_holo_light.png
new file mode 100644
index 0000000..7e4cdec
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_effect_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_holo_light.png b/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_holo_light.png
new file mode 100644
index 0000000..540d26c
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable/dialog_full_holo_light.9.png b/IAP5Helper/src/main/res/drawable/dialog_full_holo_light.9.png
new file mode 100644
index 0000000..e134c41
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable/dialog_full_holo_light.9.png differ
diff --git a/IAP5Helper/src/main/res/drawable/progressbar_middle.xml b/IAP5Helper/src/main/res/drawable/progressbar_middle.xml
new file mode 100644
index 0000000..0dd4e41
--- /dev/null
+++ b/IAP5Helper/src/main/res/drawable/progressbar_middle.xml
@@ -0,0 +1,19 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png
new file mode 100644
index 0000000..f8e90af
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_holo_light.png b/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_holo_light.png
new file mode 100644
index 0000000..981e898
Binary files /dev/null and b/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_holo_light.png differ
diff --git a/IAP5Helper/src/main/res/layout/progress_dialog.xml b/IAP5Helper/src/main/res/layout/progress_dialog.xml
new file mode 100644
index 0000000..77e87a3
--- /dev/null
+++ b/IAP5Helper/src/main/res/layout/progress_dialog.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IAP5Helper/src/main/res/values-ar/strings.xml b/IAP5Helper/src/main/res/values-ar/strings.xml
new file mode 100644
index 0000000..ebf5ea3
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ar/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ حدث خطأ غير معلوم.
+
+ عملية الشراء من داخل التطبيقات من Samsung
+
+ يتعذر إجراء عملية شراء من داخل تطبيق Samsung. انتقل إلى الأذونات، ثم اسمح بالأذونات المطلوبة وحاول مجدداً.
+
+ لشراء العناصر، يلزم تثبيت تطبيق تم شراؤه من Samsung. هل تريد التثبيت؟
+
+ تم تقديم قيمة غير صالحة لخدمة الشراء من داخل التطبيقات من Samsung.
+
+ جارٍ الانتظار\u2026
+
+ تم إلغاء عملية الدفع.
+
+ تحديث Galaxy Apps
+
+ يتوفر إصدار جديد. سيتم تحديث Galaxy Apps إلى أحدث إصدار لإكمال عملية الشراء هذه.
+
diff --git a/IAP5Helper/src/main/res/values-as/strings.xml b/IAP5Helper/src/main/res/values-as/strings.xml
new file mode 100644
index 0000000..8b23d71
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-as/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ অজ্ঞাত ত্ৰুটি ঘটিছে৷
+
+ চেমচাং ইন-এপ ক্ৰয়
+
+ চেমচাং ইন-এপ ক্ৰয় খোলাত অক্ষম। অনুমতিলৈ যাওক, তাৰপিছত আৱশ্যকীয় অনুমতি অনুমোদন কৰক আৰু পুনঃচেষ্টা কৰক।
+
+ আইটেমসমূহ ক্ৰয় কৰিবলৈ, আপুনি চেমচাং ইন-এপ পাৰচেজ ইনষ্টল কৰাটো প্ৰয়োজন। ইনষ্টল কৰিবনে?
+
+ চেমচাং ইন-এপ ক্ৰয়ৰ বাবে এটা অমান্য মান প্ৰদান কৰা হৈছে৷
+
+ অপেক্ষাৰত\u2026
+
+ পৰিশোধ বাতিল কৰা হৈছে৷
+
+ Galaxy Apps আপডেট কৰক
+
+ এটা নতুন সংস্কৰণ উপলব্ধ। এই ক্ৰয় সম্পূৰ্ণ কৰিবলৈ Galaxy Apps-ক শেহতীয়া সংস্কৰণলৈ আপডেট কৰা হ\'ব।
+
diff --git a/IAP5Helper/src/main/res/values-az-rAZ/strings.xml b/IAP5Helper/src/main/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..6e8ba36
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-az-rAZ/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Naməlum səhv baş verdi.
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase-i açmaq olmadı. İcazələrə keçin və tələb edilən icazələri verib yenidən cəhd edin.
+
+ Elementləri satın almaq üçün Samsung In-App Purchase quraşdırmalısınız. Quraşdırılsın?
+
+ Samsung In-App Purchase üçün yalnış vahid təmin edilmişdir.
+
+ Gözləyir\u2026
+
+ Ödəniş ləğv edildi.
+
+ Galaxy Apps yenilə
+
+ Yeni versiya mövcuddur. Bu satınalmanın tamamlanması üçün Galaxy Apps ən son versiyasına yenilənəcək.
+
diff --git a/IAP5Helper/src/main/res/values-be-rBY/strings.xml b/IAP5Helper/src/main/res/values-be-rBY/strings.xml
new file mode 100644
index 0000000..8f8c1a0
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-be-rBY/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Адбылася невядомая памылка.
+
+ Samsung In-App Purchase
+
+ Немагчыма адкрыць Samsung In-App Purchase. Перайдзіце ў Дазволы, затым дайце неабходныя дазволы і паўтарыце спробу.
+
+ Каб набываць тавары, вам неабходна ўсталяваць Samsung In-App Purchase. Усталяваць?
+
+ Няправільнае значэнне было пададзена для Samsung In-App Purchase.
+
+ Чаканне\u2026
+
+ Аплата скасавана.
+
+ Абнавіць Galaxy Apps
+
+ Даступна новая версія. Для завяршэння гэтай пакупкі Galaxy Apps будуць абноўлены да апошняй версіі.
+
diff --git a/IAP5Helper/src/main/res/values-bg/strings.xml b/IAP5Helper/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..94add26
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-bg/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Възникна неизвестна грешка.
+
+ Покупка от прил. на Samsung
+
+ Не може да се отвори „Покупка от приложение на Samsung“. Отидете на „Разрешения“, след което позволете необходимите разрешения и опитайте отново.
+
+ За да закупите елементи, трябва да инсталирате Покупка от приложение на Samsung. Инсталиране?
+
+ Предоставена е невалидна стойност за Покупка от приложение на Samsung.
+
+ Изчакване\u2026
+
+ Плащането е отменено.
+
+ Актуализиране на Galaxy Apps
+
+ Налична е нова версия. Galaxy Apps ще се актуализира с последната версия, за да се завърши тази покупка.
+
diff --git a/IAP5Helper/src/main/res/values-bn-rBD/strings.xml b/IAP5Helper/src/main/res/values-bn-rBD/strings.xml
new file mode 100644
index 0000000..2f3bb84
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-bn-rBD/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ অজানা ত্রুটি ঘটেছে।
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase খুলতে অক্ষম৷ ‘অনুমতি’-তে যান, তারপর প্রয়োজনীয় অনুমতিগুলো দিয়ে আবার চেষ্টা করুন৷
+
+ আইটেম কেনার জন্য, আপনাকে Samsung In-App Purchase ইনস্টল করতে হবে৷ ইনস্টল করবেন?
+
+ Samsung In-App Purchase-এর জন্য একটি অকার্যকর মান দেয়া হয়েছে৷
+
+ অপেক্ষমাণ\u2026
+
+ পেমেন্ট বাতিল হয়েছে৷
+
+ Galaxy Apps আপডেট করুন
+
+ একটি নতুন সংস্করণ আছে৷ এই ক্রয় সম্পন্ন করতে Galaxy Apps সর্বসাম্প্রতিক সংস্করণে আপডেট করা হবে।
+
diff --git a/IAP5Helper/src/main/res/values-bn-rIN/strings.xml b/IAP5Helper/src/main/res/values-bn-rIN/strings.xml
new file mode 100644
index 0000000..04acd55
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-bn-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ অজানা ত্রুটি ঘটেছে।
+
+ স্যামসাং ইন-অ্যাপ পারচেস
+
+ স্যামসাং ইন-অ্যাপ পারচেজ খুলতে অক্ষম। অনুমতিগুলিতে যান, তারপর প্রয়োজনীয় অনুমতিগুলি মঞ্জুর করুন এবং আবার চেষ্টা করুন।
+
+ আইটেমগুলি কিনতে আপনার স্যামসাং ইন-অ্যাপ ক্রয় ইনস্টল করা প্রয়োজন৷ ইনস্টল করবেন?
+
+ স্যামসাং ইন-অ্যাপ ক্রয়ের জন্য একটি অবৈধ মান সরবরাহিত হয়েছে।
+
+ অপেক্ষা করা হচ্ছে\u2026
+
+ প্রদান বাতিল হয়েছে।
+
+ Galaxy Apps আপডেট করুন
+
+ একটি নতুন সংস্করণ সুলভ। এই কেনাকাটা সম্পূর্ণ করতে, Galaxy Apps সাম্প্রতিকতম সংস্করণে আপডেট হবে।
+
diff --git a/IAP5Helper/src/main/res/values-bo/strings.xml b/IAP5Helper/src/main/res/values-bo/strings.xml
new file mode 100644
index 0000000..f8fefc0
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-bo/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ རྒྱུས་མེད་ནོར་འཁྲུལ་བྱུང༌།
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchaseཁ་ཕྱེ་མི་ཐུབ།༼དབང་ཚད་༽ནང་ཞུགས་དགོས།དེ་རྗེས་གཤམ་གྱི་དབང་ཚད་སྤྲད་ནས་བསྐྱར་ཚོད་བྱེད་དགོས།
+
+ གལ་ཏེ་ཉོ་སྒྲུབ་ཚོང་ཟོག།ཁྱེད་ནས་Samsung In-App Purchaseསྒྲིག་འཇུག་བྱེད་དགོས།སྒྲིག་འཇུག་བྱེད་དམ།
+
+ Samsung In-App Purchaseལ་ཕན་མེད་གྲངས་ཞིག་ཐོབ་ཡོད།
+
+ 请稍候\u2026
+
+ དངུལ་སྤྲོད་བྲིས་སུབ་གཏོང་བ།
+
+ Galaxy་ཉེར་སྤྱོད་ཚོང་ཁང་གསར་སྒྱུར་བྱེད།
+
+ པར་གཞི་གསར་བ་འདུགGalaxy་ཉེར་སྤྱོད་ཚོང་ཁང་གིས་པར་གཞི་གསར་ཤོས་སུ་གསར་སྒྱུར་བྱས་ནས་ཐེངས་འདིའི་དངོས་ཉོ་འགྲུབ་པར་བྱེད།
+
diff --git a/IAP5Helper/src/main/res/values-bs/strings.xml b/IAP5Helper/src/main/res/values-bs/strings.xml
new file mode 100644
index 0000000..3ac8455
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-bs/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Čekanje\u2026
+
+ Payment cancelled.
+
+ Ažuriraj Galaxy Apps
+
+ Dostupna je nova verzija. Prodavnica Galaxy Apps će se ažurirati na najnoviju verziju da bi se dovršila ova kupovina.
+
diff --git a/IAP5Helper/src/main/res/values-ca/strings.xml b/IAP5Helper/src/main/res/values-ca/strings.xml
new file mode 100644
index 0000000..e270a1a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ca/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ S\'ha produït un error desconegut
+
+ Samsung In-App Purchase
+
+ No es pot obrir Samsung In-App Purchase. Vagi a Permisos i, a continuació, permeti els permisos necessaris i torni-ho a intentar.
+
+ Per comprar elements, cal que instal·li Samsung In-App Purchase. Instal·lar?
+
+ S\'ha proporcionat un valor no vàlid per a In-App Purchase de Samsung
+
+ En espera\u2026
+
+ Pagament cancel·lat
+
+ Actualitzar Galaxy Apps
+
+ Hi ha una versió nova disponible. S\'actualitzarà Galaxy Apps a l\'última versió per completar aquesta compra.
+
diff --git a/IAP5Helper/src/main/res/values-cs/strings.xml b/IAP5Helper/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..cc2a0d6
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-cs/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Došlo k neznámé chybě.
+
+ Nákup z aplikace Samsung
+
+ Nepodařilo se spustit Nákup z aplikace Samsung. Přejděte na Oprávnění a potom povolte požadovaná oprávnění a opakujte akci.
+
+ Chcete-li nakupovat, musíte nainstalovat modul nákupu z aplikace od společnosti Samsung. Instalovat?
+
+ Byla poskytnuta neplatná hodnota pro nákup z aplikace Samsung.
+
+ Čekám\u2026
+
+ Platba byla zrušena.
+
+ Aktualizovat Galaxy Apps
+
+ K dispozici je nová verze. Aby byl dokončen tento nákup, aplikace Galaxy Apps bude aktualizována na nejnovější verzi.
+
diff --git a/IAP5Helper/src/main/res/values-da/strings.xml b/IAP5Helper/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..8e1360e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-da/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ukendt fejl opstod.
+
+ Køb for. via Samsung-app
+
+ Kan ikke åbne Køb foretaget via Samsung-app. Gå til Tilladelser, aktiver de krævede tilladelser, og prøv igen.
+
+ For at købe elementer skal du installere Køb foretaget via Samsung-app. Installer?
+
+ Der er angivet en ugyldig værdi for Køb foretaget via Samsung-app.
+
+ Venter \u2026
+
+ Betaling annulleret.
+
+ Opdater Galaxy Apps
+
+ En ny version er tilgængelig. Galaxy Apps vil blive opdateret til den nyeste version, så du kan gennemføre dette køb.
+
diff --git a/IAP5Helper/src/main/res/values-de/strings.xml b/IAP5Helper/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..9ab6611
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-de/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unbekannter Fehler aufgetreten
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase kann nicht geöffnet werden. Wechseln Sie zu „Berechtigungen“, erteilen Sie die erforderlichen Berechtigungen und versuchen Sie es anschließend erneut.
+
+ Wenn Sie Artikel kaufen möchten, müssen Sie Samsung In-App-Kauf installieren. Installieren?
+
+ Es wurde ein ungültiger Wert für Samsung In-App Purchase angegeben.
+
+ Warten\u2026
+
+ Zahlung abgebrochen
+
+ Aktualisieren von Galaxy Apps
+
+ Eine neue Version ist verfügbar. Galaxy Apps wird auf die neueste Version aktualisiert, um diesen Kauf abzuschließen.
+
diff --git a/IAP5Helper/src/main/res/values-el/strings.xml b/IAP5Helper/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..e5547ce
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-el/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Παρουσιάστηκε άγνωστο σφάλμα.
+
+ Samsung In-App Purchase
+
+ Δεν είναι δυνατό το άνοιγμα του Samsung In-App Purchase. Μεταβείτε στα Δικαιώματα, παραχωρήστε τα παρακάτω δικαιώματα και, στη συνέχεια, δοκιμάστε ξανά.
+
+ Πρέπει να εγκαταστήσετε το εργαλείο αγοράς εντός εφαρμογής της Samsung για να αγοράσετε στοιχεία. Να εγκατασταθεί;
+
+ Δόθηκε μη έγκυρη τιμή για την αγορά εντός της εφαρμογής Samsung.
+
+ Αναμονή\u2026
+
+ Η πληρωμή ακυρώθηκε.
+
+ Ενημέρωση Galaxy Apps
+
+ Υπάρχει διαθέσιμη νέα έκδοση. Για την ολοκλήρωση αυτής της αγοράς, το Galaxy Apps θα ενημερωθεί στην πιο πρόσφατη έκδοση.
+
diff --git a/IAP5Helper/src/main/res/values-en-rCA/strings.xml b/IAP5Helper/src/main/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000..c5dbd6e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-en-rCA/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install it?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-en-rPH/strings.xml b/IAP5Helper/src/main/res/values-en-rPH/strings.xml
new file mode 100644
index 0000000..0bf8492
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-en-rPH/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment canceled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-en-rUS/strings.xml b/IAP5Helper/src/main/res/values-en-rUS/strings.xml
new file mode 100644
index 0000000..82f1225
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-en-rUS/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-en-rZG/strings.xml b/IAP5Helper/src/main/res/values-en-rZG/strings.xml
new file mode 100644
index 0000000..82f1225
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-en-rZG/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-en/strings.xml b/IAP5Helper/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..82f1225
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-en/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-es-rES/strings.xml b/IAP5Helper/src/main/res/values-es-rES/strings.xml
new file mode 100644
index 0000000..42ee5d2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-es-rES/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Error desconocido.
+
+ Samsung In-App Purchase
+
+ No se puede abrir Samsung In-App Purchase. Ve a Permisos y, a continuación, concede los permisos necesarios e inténtalo de nuevo.
+
+ Para comprar elementos, debes instalar Samsung In-App Purchase. ¿Instalar?
+
+ Se ha proporcionado un valor no válido para Samsung In-App Purchase.
+
+ Esperando\u2026
+
+ Pago cancelado.
+
+ Actualizar Galaxy Apps
+
+ Hay una versión nueva disponible. Se actualizará Galaxy Apps a la versión más reciente para completar esta compra.
+
diff --git a/IAP5Helper/src/main/res/values-es-rUS/strings.xml b/IAP5Helper/src/main/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..7fd5dce
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-es-rUS/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Error desconocido.
+
+ Compra en aplic. Samsung
+
+ No es posible abrir Compra desde la aplicación Samsung. Vaya a Permisos, otorgue los permisos necesarios e inténtelo de nuevo.
+
+ Para comprar estos elementos, debe instalar Compra desde la aplicación Samsung. ¿Instalar?
+
+ Se proporcionó un valor no válido para Compra desde la aplicación Samsung.
+
+ Esperando\u2026
+
+ Pago cancelado.
+
+ Actualizar Galaxy Apps
+
+ Hay una versión nueva disponible. Galaxy Apps se actualizará a la versión más reciente para finalizar la compra.
+
diff --git a/IAP5Helper/src/main/res/values-et-rEE/strings.xml b/IAP5Helper/src/main/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..de77849
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-et-rEE/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ilmnes tundmatu torge.
+
+ Samsung In-App Purchase
+
+ Rakendust Samsung In-App Purchase ei saa avada. Avage menüü Õigused, seejärel kinnitage vajalikud õigused ja proovige uuesti.
+
+ Üksuste ostmiseks peate installima rakenduse Samsung In-App Purchase. Kas installida?
+
+ Rakenduse Samsung In-App Purchase jaoks on sisestatud vale vaartus.
+
+ Ootel\u2026
+
+ Makse on tühistatud.
+
+ Rakenduse Galaxy Apps värskendamine
+
+ Saadaval on uus versioon. Rakendus Galaxy Apps värskendatakse selle ostu sooritamiseks uusimale versioonile.
+
diff --git a/IAP5Helper/src/main/res/values-eu-rES/strings.xml b/IAP5Helper/src/main/res/values-eu-rES/strings.xml
new file mode 100644
index 0000000..56f3bc0
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-eu-rES/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Errore ezezaguna gertatu da
+
+ Samsung In-App Purchase
+
+ Ezin da Samsung In-App Purchase ireki. Joan Baimenak atalera, onartu beharrezko baimenak eta saiatu berriz.
+
+ Elementuak erosteko, Samsung In-App Erosketa instalatu behar duzu. Instalatu?
+
+ Balio baliogabea eman da Samsung In-App erosketan
+
+ Itxaroten\u2026
+
+ Ordainketa utzita
+
+ Eguneratu Galaxy Apps
+
+ Bertsio berri bat dago erabilgarri. Galaxy Apps bertsio berrienera eguneratuko da erosketa hau osatzearren.
+
diff --git a/IAP5Helper/src/main/res/values-fa/strings.xml b/IAP5Helper/src/main/res/values-fa/strings.xml
new file mode 100644
index 0000000..9991c0a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-fa/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ خطای نامشخصی رخ داد.
+
+ خرید درون برنامه سامسونگ
+
+ باز کردن خرید درون برنامه سامسونگ ممکن نیست. به مجوزها بروید، سپس به مجوزهای مورد نیاز اجازه داده و دوباره امتحان کنید.
+
+ برای خرید موارد، باید خرید درون برنامه سامسونگ را نصب کنید. نصب شود؟
+
+ یک مقدار نادرست برای خرید درون برنامه سامسونگ ارائه شده است.
+
+ در انتظار\u2026
+
+ پرداخت لغو شد.
+
+ بهروزرسانی Galaxy Apps
+
+ نسخه جدیدی در دسترس است. برای تکمیل این خرید، Galaxy Apps به جدیدترین نسخه بهروزرسانی خواهد شد.
+
diff --git a/IAP5Helper/src/main/res/values-fi/strings.xml b/IAP5Helper/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..df617f2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-fi/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Tuntematon virhe
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchasea ei voi avata. Valitse Käyttöoikeudet, myönnä tarvittavat oikeudet ja yritä uudelleen.
+
+ Samsung In-App Purchase on asennettava tuotteiden ostamista varten. Asennetaanko?
+
+ Samsung In-App Purchaselle on annettu virheellinen arvo.
+
+ Odotetaan\u2026
+
+ Maksu on peruutettu.
+
+ Päivitä Galaxy Apps
+
+ Uusi versio saatavilla. Galaxy Apps päivitetään uusimpaan versioon tämän ostoksen viimeistelemiseksi.
+
diff --git a/IAP5Helper/src/main/res/values-fr-rCA/strings.xml b/IAP5Helper/src/main/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..aef119a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-fr-rCA/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Une erreur inconnue est survenue.
+
+ Samsung In-App Purchase
+
+ Impossible d\'ouvrir Samsung In-App Purchase. Accédez à Autorisations, puis accordez les autorisations requises et réessayez.
+
+ Pour acheter des articles, vous devez installer le système Achat dans l\'application Samsung. Installer ?
+
+ Une valeur non valide a été fournie pour Achat dans l\'application Samsung.
+
+ Patientez\u2026
+
+ Paiement annulé.
+
+ Mise à jour de Galaxy Apps
+
+ Une nouvelle version est disponible. L\'application Galaxy Apps va être mise à jour vers la dernière version pour terminer cet achat.
+
diff --git a/IAP5Helper/src/main/res/values-fr/strings.xml b/IAP5Helper/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..801ad8d
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-fr/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Une erreur inconnue est survenue.
+
+ Samsung In-App Purchase
+
+ Impossible d\'ouvrir Samsung In-App Purchase. Accédez à Autorisations, puis accordez les autorisations requises et réessayez.
+
+ Pour acheter des articles, vous devez installer l\'application Samsung In-App Purchase. Installer ?
+
+ Une valeur non valide a été fournie dans Samsung In-App Purchase.
+
+ Patientez\u2026
+
+ Paiement annulé
+
+ Mise à jour de Galaxy Apps
+
+ Une nouvelle version est disponible. L\'application Galaxy Apps va être mise à jour vers la dernière version pour terminer cet achat.
+
diff --git a/IAP5Helper/src/main/res/values-ga/strings.xml b/IAP5Helper/src/main/res/values-ga/strings.xml
new file mode 100644
index 0000000..6c3b337
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ga/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Tharla earráid anaithnid
+
+ Ceann. i bhF.chlár Samsung
+
+ Ní féidir Ceannach i bhFeidhmchlár Samsung a oscailt. Gabh chuig Ceadanna, ansin ceadaigh na ceadanna atá de dhíth agus triail arís.
+
+ Tá Samsung In-App Purchase de dhíth ort le míreanna a cheannach. Suiteáil?
+
+ Soláthraíodh luach neamhbhailí do Cheannach i bhFeidhmchlár Samsung
+
+ Ag feitheamh\u2026
+
+ Íocaíocht curtha ar ceal.
+
+ Nuashonraigh Galaxy Apps
+
+ Tá leagan nua ar fáil. Nuashonrófar Galaxy Apps chuig an leagan is déanaí leis an gceannachán seo a chur i gcrích.
+
diff --git a/IAP5Helper/src/main/res/values-gl-rES/strings.xml b/IAP5Helper/src/main/res/values-gl-rES/strings.xml
new file mode 100644
index 0000000..62852c2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-gl-rES/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Houbo un erro descoñecido
+
+ Samsung In-App Purchase
+
+ Non se pode abrir Samsung In-App Purchase. Vai a Permisos e, a continuación, concede os permisos necesarios e téntao outra vez.
+
+ Para mercar elementos, precisas instalar Compra de aplicacións interna de Samsung. Desexas instalalo?
+
+ Forneceuse un valor non válido para Samsung In-App Purchase
+
+ Esperando\u2026
+
+ Pagamento cancelado
+
+ Actualizar Galaxy Apps
+
+ Hai unha nova versión dispoñible. Galaxy Apps actualizarase á versión máis recente para completar esta compra.
+
diff --git a/IAP5Helper/src/main/res/values-gu-rIN/strings.xml b/IAP5Helper/src/main/res/values-gu-rIN/strings.xml
new file mode 100644
index 0000000..1c8de71
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-gu-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ અજ્ઞાત ભૂલ થઈ છે.
+
+ સેમસંગ ઇન-એપ ખરીદી
+
+ સેમસંગ ઇન-એપ ખરીદી ખોલવામાં અસમર્થ. પરવાનગીઓ પર જાઓ, પછી નીચે આપેલ પરવાનગીઓની મંજૂરી આપો અને ફરી પ્રયાસ કરો.
+
+ વસ્તુઓ ખરીદવા માટે, તમને સેમસંગ ઇન-એપ્લિકેશન પરચેઝ સ્થાપિત કરવાની આવશ્યકતા છે. સ્થાપિત કરીએ?
+
+ સેમસંગ ઇન-એપ ખરીદી માટે એક અમાન્ય મૂલ્ય પ્રદાન કરવામાં આવ્યું છે.
+
+ પ્રતીક્ષા કરી રહ્યું છે\u2026
+
+ ચૂકવણી રદ કરી.
+
+ Galaxy Apps અપડેટ કરો
+
+ એક નવું સંસ્કરણ ઉપલબ્ધ છે. આ ખરીદી પૂર્ણ કરવા માટે Galaxy Apps ને નવીનતમ સંસ્કરણમાં અપડેટ કરવામાં આવશે.
+
diff --git a/IAP5Helper/src/main/res/values-hi/strings.xml b/IAP5Helper/src/main/res/values-hi/strings.xml
new file mode 100644
index 0000000..d149d45
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-hi/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ अज्ञात त्रुटि पाई गई
+
+ सैमसंग इन-एप खरीद
+
+ सैमसंग इन-एप खरीदारी खोलने में असमर्थ। अनुमतियाँ पर जाएँ, फिर आवश्यक अनुमतियों को अनुमति दें और फिर से प्रयास करें।
+
+ मदें खरीदने के लिए, आपको सैमसंग इन-एप परचेस़ स्थापित करना आवश्यक हैं। स्थापित करें?
+
+ सैमसंग इन-एप परचेज के लिए कोई अमान्य मान प्रदान किया गया है।
+
+ प्रतीक्षा कर रहा है\u2026
+
+ भुगतान रद्द किया गया।
+
+ Galaxy Apps अपडेट करें
+
+ एक नया संस्करण उपलब्ध है। यह खरीदारी पूर्ण करने के लिए Galaxy Apps को नवीनतम संस्करण पर अपडेट किया जाएगा।
+
diff --git a/IAP5Helper/src/main/res/values-hr/strings.xml b/IAP5Helper/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000..8fbb9cf
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-hr/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Nepoznata greška
+
+ Samsung kup. unutar apl.
+
+ Nije moguće otvoriti Samsung kupnju unutar aplikacije. Idite na Dopuštenja, a zatim dajte potrebna dopuštenja i pokušajte ponovno.
+
+ Da biste kupili stavke, morate instalirati Samsung kupnju unutar aplikacije. Instalirati?
+
+ Pružena je neispravna vrijednost za Samsung kupnju unutar aplikacije.
+
+ Čekajte\u2026
+
+ Plaćanje otkazano.
+
+ Aktualizacija trgovine Galaxy Apps
+
+ Dostupna je nova verzija. Za dovršetak kupnje trgovina Galaxy Apps aktualizirat će se na najnoviju verziju.
+
diff --git a/IAP5Helper/src/main/res/values-hu/strings.xml b/IAP5Helper/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..fd4084a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-hu/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ismeretlen eredetű hiba történt.
+
+ Samsung Beépített bolt
+
+ Nem lehet megnyitni a Samsung Beépített bolt alkalmazást. Lépjen be az Engedélyek menüpontba, adja meg a szükséges engedélyeket, majd próbálja újra.
+
+ Vásárláshoz telepítenie kell a Samsung beépített bolt alkalmazást. Telepíti?
+
+ Érvénytelen érték lett megadva a Samsung Beépített bolt számára.
+
+ Várakozás\u2026
+
+ Fizetés megszakítva.
+
+ Galaxy Apps frissítése
+
+ Rendelkezésre áll egy új verzió. A vásárlás befejezéséhez a rendszer a legújabb verzióra frissíti a Galaxy Apps alkalmazást.
+
diff --git a/IAP5Helper/src/main/res/values-hy-rAM/strings.xml b/IAP5Helper/src/main/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..d65fd87
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-hy-rAM/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Անհայտ սխալ տեղի ունեցավ:
+
+ Samsung In-App Purchase
+
+ Անհնար է բացել Samsung In-App Purchase-ը: Գնացեք «Թույլտվություններ», տվեք պահանջվող թույլտվությունները և նորից փորձեք:
+
+ Տարրեր գնելու համար հարկավոր է տեղադրել Samsung In-App Purchase. Տեղադրե՞լ:
+
+ Անվավեր արժեք է տրամադրվել Samsung In-App Purchase-ի համար:
+
+ Սպասում է\u2026
+
+ Վճարումը դադարեցվեց:
+
+ Թարմացնել Galaxy Apps-ը
+
+ Նոր վարկած է մատչելի: Galaxy Apps-ը կթարմացվի ամենավերջին վարկածով՝ այս գնումը կատարելու համար:
+
diff --git a/IAP5Helper/src/main/res/values-in/strings.xml b/IAP5Helper/src/main/res/values-in/strings.xml
new file mode 100644
index 0000000..c1eaed0
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-in/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Terjadi kesalahan tak dikenal.
+
+ Samsung In-App Purchase
+
+ Tidak dapat membuka Pembelian dalam Aplikasi Samsung. Buka Izin, lalu perbolehkan izin berikut dan coba lagi.
+
+ Untuk membeli item, Anda perlu menginstal Samsung In-App Purchase. Instal?
+
+ Nilai tidak valid dimasukkan ke Samsung In-App Purchase.
+
+ Menunggu\u2026
+
+ Pembayaran dibatalkan.
+
+ Perbarui Galaxy Apps
+
+ Versi baru tersedia. Galaxy Apps akan diperbarui ke versi terbaru untuk menyelesaikan pembelian ini.
+
diff --git a/IAP5Helper/src/main/res/values-is-rIS/strings.xml b/IAP5Helper/src/main/res/values-is-rIS/strings.xml
new file mode 100644
index 0000000..736cfbb
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-is-rIS/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Óþekkt villa kom upp.
+
+ Samsung kaup í forriti
+
+ Ekki er hægt að opna Samsung kaup í forriti. Opnaðu „Heimildir“, veittu síðan nauðsynlegar heimildir og reyndu aftur.
+
+ Þú þarft að setja upp Samsung In-App Purchase til að kaupa atriði. Viltu setja það upp?
+
+ Ógilt gildi var gefið upp fyrir Samsung kaup í forriti.
+
+ Í bið\u2026
+
+ Hætt við greiðslu.
+
+ Uppfæra Galaxy Apps
+
+ Ný útgáfa er í boði. Galaxy Apps verður uppfært í nýjustu útgáfu til að ljúka við þessi kaup.
+
diff --git a/IAP5Helper/src/main/res/values-it/strings.xml b/IAP5Helper/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..54a72a7
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-it/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Si è verificato un errore sconosciuto.
+
+ Acquisti in-app Samsung
+
+ Impossibile aprire Acquisti in-app Samsung. Andate in Autorizzazioni, quindi concedete le autorizzazioni necessarie e riprovate.
+
+ Per acquistare degli elementi, è necessario installare l\'applicazione Acquisti in-app Samsung. Installare?
+
+ È stato fornito un valore non valido per l\'applicazione Acquisti in-app Samsung.
+
+ In attesa\u2026
+
+ Pagamento annullato.
+
+ Aggiorna Galaxy Apps
+
+ È disponibile una nuova versione. Per completare l\'acquisto, Galaxy Apps verrà aggiornato alla versione più recente.
+
diff --git a/IAP5Helper/src/main/res/values-iw/strings.xml b/IAP5Helper/src/main/res/values-iw/strings.xml
new file mode 100644
index 0000000..86a6ef7
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-iw/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ ארעה שגיאה לא ידועה.
+
+ Samsung In-App Purchase
+
+ לא ניתן לפתוח את Samsung In-App Purchase. עבור אל \'הרשאות\', אשר את ההרשאות הנדרשות ונסה שוב.
+
+ כדי לרכוש פריטים, עליך להתקין את \'רכישה מתוך היישום של Samsung\'. להתקין?
+
+ סופק ערך לא תקין עבור רכישה מתוך היישום של Samsung.
+
+ ממתין\u2026
+
+ התשלום בוטל.
+
+ עדכן את Galaxy Apps
+
+ גרסה חדשה זמינה. כדי להשלים רכישה זו, Galaxy Apps יעודכן לגרסה החדשה ביותר.
+
diff --git a/IAP5Helper/src/main/res/values-ja/strings.xml b/IAP5Helper/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..2115d13
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ja/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ 不明なエラーが発生しました。
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchaseを起動できません。[権限]に移動し、必要な権限を許可してから再度実行してください。
+
+ アイテムを購入するには、Samsung In-App Purchaseをインストールする必要があります。インストールしますか?
+
+ 無効な値がSamsung In-App Purchaseに提供されています。
+
+ 待機中\u2026
+
+ 支払いがキャンセルされました。
+
+ Galaxy Appsを更新
+
+ 新しいバージョンが利用可能です。購入手続きを完了するために、Galaxy Appsを最新バージョンに更新します。
+
diff --git a/IAP5Helper/src/main/res/values-ka-rGE/strings.xml b/IAP5Helper/src/main/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..435ac91
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ka-rGE/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ მოხდა უცნობი შეცდომა.
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase-ს გახსნა შეუძლებელია. გახსენით „ნებართვები“, შემდეგ კი დართეთ საჭირო ნებართვები და ისევ სცადეთ.
+
+ ელემენტების შესაძენად უნდა დააინსტალიროთ Samsung In-App Purchase. დაინსტალირდეს?
+
+ არასწორი მნიშვნელობაა მითითებული Samsung In-App Purchase სისტემაში.
+
+ ელოდება\u2026
+
+ გადახდა გაუქმდა.
+
+ Galaxy Apps-ის განახლება
+
+ გამოვიდა ახალი ვერსია. Galaxy Apps განახლდება უახლესი ვერსიით, რომ შესრულდეს ეს შეძენა.
+
diff --git a/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml b/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml
new file mode 100644
index 0000000..8f98457
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Белгісіз қате пайда болды.
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase ашу мүмкін болмады. “Рұқсаттар” бөліміне өтіп, қажетті рұқсаттарды беріңіз, кейін әрекетті қайталаңыз.
+
+ Элементтерді сатып алу үшін Samsung In-App Purchase бағдарламасын орнату керек. Орнату керек пе?
+
+ Samsung In-App Purchase бағдарламасы үшін жарамсыз мән көрсетілген.
+
+ Күтуде\u2026
+
+ Төлемнен бас тартылды.
+
+ Galaxy Apps қолданбасын жаңарту
+
+ Жаңа нұсқа қолжетімді. Осы сатып алуды аяқтау үшін, Galaxy Apps қолданбасы ең соңғы нұсқаға жаңартылады.
+
diff --git a/IAP5Helper/src/main/res/values-km-rKH/strings.xml b/IAP5Helper/src/main/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..bd56ddb
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-km-rKH/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ កំហុសមិនស្គាល់បានកើតឡើង។
+
+ Samsung In-App Purchase
+
+ មិនអាចបើក Samsung In-App Purchase។ ចូលទៅការអនុញ្ញាត រួចផ្ដល់ការអនុញ្ញាតដែលត្រូវការ ហើយសាកល្បងម្ដងទៀត។
+
+ ដើម្បីទិញធាតុនានា អ្នកចាំបាច់ត្រូវដំឡើង Samsung In-App Purchase។ ដំឡើង?
+
+ បានផ្ដល់តម្លៃអសុពលភាពសម្រាប់ការទិញក្នុងកម្មវិធី Samsung។
+
+ កំពុងរង់ចាំ\u2026
+
+ បានបោះបង់ការបង់ប្រាក់។
+
+ អាប់ដេត Galaxy Apps
+
+ មានកំណែថ្មី។ Galaxy Apps នឹងត្រូវបានអាប់ដេតទៅកំណែថ្មីបំផុត ដើម្បីបញ្ចប់ការទិញនេះ។
+
diff --git a/IAP5Helper/src/main/res/values-kn-rIN/strings.xml b/IAP5Helper/src/main/res/values-kn-rIN/strings.xml
new file mode 100644
index 0000000..fa334f0
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-kn-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ ಅಜ್ಞಾತ ದೋಷ ಸಂಭವಿಸಿದೆ.
+
+ ಸ್ಯಾಮ್ಸಂಗ್ ಇನ್-ಅನ್ವಯಿಸುವಿಕೆ ಖರೀದಿ
+
+ Samsung ಇನ್-ಅನ್ವಯಿಸುವಿಕೆ ಖರೀದಿಯನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಅನುಮತಿಗಳಿಗೆ ಹೋಗಿ, ನಂತರ ಕೆಳಗಿನ ಅನುಮತಿಗಳನ್ನು ಅನುಮತಿಸಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.
+
+ ಅಂಶಗಳನ್ನು ಖರೀದಿಸಲು, ನೀವು ಸ್ಯಾಮ್ಸಂಗ್ ಇನ್-ಆಪ್ ಪರ್ಚೇಸ್ ಅನ್ನು ಸ್ಥಾಪಿಸುವುದು ಅಗತ್ಯವಾಗಿರುತ್ತದೆ. ಸ್ಥಾಪಿಸುವುದೇ?
+
+ ಸ್ಯಾಮ್ಸಂಗ್ ಇನ್-ಅನ್ವಹಿಸುವಿಕೆ ಖರೀದಿಗಾಗಿ ಅಮಾನ್ಯ ಮೌಲ್ಯವನ್ನು ಒದಗಿಸಲಾಗಿದೆ.
+
+ ನಿರೀಕ್ಷಿಸುತ್ತಿದೆ\u2026
+
+ ಪಾವತಿಸುವಿಕೆ ರದ್ದಾಗಿದೆ.
+
+ Galaxy Apps ನವೀಕರಿಸಿ
+
+ ಒಂದು ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ. ಈ ಖರೀದಿಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು Galaxy Appsನ್ನು ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗೆ ನವೀಕರಿಸಲಾಗುತ್ತದೆ.
+
diff --git a/IAP5Helper/src/main/res/values-ko/strings.xml b/IAP5Helper/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..ce3fc0d
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ko/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ 알 수 없는 오류가 발생했습니다.
+
+ 삼성 인앱결제
+
+ 삼성 인앱결제를 실행할 수 없습니다. [권한]에서 다음 권한을 허용한 후 다시 시도하세요.
+
+ 상품을 구매하려면 [삼성 인앱결제]이 필요합니다. 설치할까요?
+
+ 삼성 인앱결제에 입력한 값이 바르지 않습니다.
+
+ 대기 중\u2026
+
+ 결제를 취소합니다.
+
+ Galaxy Apps 업데이트
+
+ Galaxy Apps의 새 버전이 있습니다. 구매를 완료하기 위해 Galaxy Apps를 최신 버전으로 업데이트합니다.
+
diff --git a/IAP5Helper/src/main/res/values-ky-rKG/strings.xml b/IAP5Helper/src/main/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..e31b0ee
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ky-rKG/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Белгисиз ката пайда болду
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase\'ди ачуу мүмкүн эмес. Уруксаттарга барыңыз, андан соң төмөнкүлөргө уруксат берип, дагы аракеттениңиз.
+
+ Нерселерди сатып алуу үчүн, сизге Samsung In-App Purchase орнотуу керек. Орнотуубу?
+
+ Samsung In-App Purchase үчүн орунсуз нарк берилди
+
+ Күтүүдө\u2026
+
+ Төлөм токтотулду
+
+ Galaxy Apps\'ты жаңыртуу
+
+ Жаңы нуска жеткиликтүү. Galaxy Apps эң акыркы нускасына жаңыланып, бул сатып алууну аяктайт.
+
diff --git a/IAP5Helper/src/main/res/values-lo-rLA/strings.xml b/IAP5Helper/src/main/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..b9e0a75
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-lo-rLA/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ ເກີດຄວາມຜິດພາດບໍ່ຮູ້ຈັກຂຶ້ນ.
+
+ Samsung In-App Purchase
+
+ ບໍ່ສາມາດເປີດ Samsung In-App Purchase. ໄປທີ່ການອະນຸຍາດ, ຈາກນັ້ນອະນຸຍາດການອະນຸຍາດທີ່ຕ້ອງການ ແລະລອງໃໝ່ອີກ.
+
+ ເພື່ອຊື້ລາຍການຕ່າງໆ, ທ່ານຈໍາເປັນຕ້ອງຕິດຕັ້ງການຊື້ແອບຢູ່ໃນຊໍາຊູງ. ຕິດຕັ້ງບໍ?
+
+ ຄ່າທີ່ໃຫ້ກັບການຊື້ແອັບໃນຊໍາຊຸງໃຊ້ບໍ່ໄດ້.
+
+ ກໍາລັງລໍຖ້າ\u2026
+
+ ການຊໍາລະຖືກຍົກເລີກ.
+
+ ອັບເດດ Galaxy Apps
+
+ ລຸ້ນໃໝ່ມີຢູ່. Galaxy Apps ຈະຖືກອັບເດດເປັນລຸ້ນຫຼ້າສຸດ ເພື່ອຊື້ອັນນີ້ໃຫ້ສໍາເລັດ.
+
diff --git a/IAP5Helper/src/main/res/values-lt/strings.xml b/IAP5Helper/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..882b012
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-lt/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Įvyko nežinoma klaida.
+
+ Samsung In-App Purchase
+
+ Negalima atidaryti „Samsung In-App Purchase“. Eikite į „Leidimai“, tada suteikite reikiamus leidimus ir bandykite dar kartą.
+
+ Norėdami įsigyti elementų, turite įdiegti „Samsung In-App Purchase“. Įdiegti?
+
+ „Samsung In-App Purchase“ buvo pateikta neteisinga reikšmė.
+
+ Laukiama\u2026
+
+ Mokėjimas atšauktas.
+
+ Naujinti „Galaxy Apps“
+
+ Yra nauja versija. Siekiant užbaigti šį pirkimą, „Galaxy Apps“ bus atnaujinta į naujausią versiją.
+
diff --git a/IAP5Helper/src/main/res/values-lv/strings.xml b/IAP5Helper/src/main/res/values-lv/strings.xml
new file mode 100644
index 0000000..fb75c98
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-lv/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Radās nezināma kļūda.
+
+ Samsung In-App Purchase
+
+ Nevar atvērt Samsung In-App Purchase. Izvēlieties Atļaujas, pēc tam aktivizējiet nepieciešamās atļaujas un mēģiniet vēlreiz.
+
+ Lai iegādātos objektus, ir jāinstalē Samsung In-App Purchase. Vai instalēt?
+
+ Izmantojot Samsung In-App Purchase funkciju, tika norādīta nederīga vērtība.
+
+ Gaida\u2026
+
+ Maksājums ir atcelts.
+
+ Atjaunināt Galaxy Apps
+
+ Pieejama jauna versija. Lai veiktu šo pirkumu, programma Galaxy Apps tiks atjaunināta uz jaunāko versiju.
+
diff --git a/IAP5Helper/src/main/res/values-mg/strings.xml b/IAP5Helper/src/main/res/values-mg/strings.xml
new file mode 100644
index 0000000..82f1225
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-mg/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Unknown error occurred.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Waiting\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-mk-rMK/strings.xml b/IAP5Helper/src/main/res/values-mk-rMK/strings.xml
new file mode 100644
index 0000000..8a9842a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-mk-rMK/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Дојде до непозната грешка.
+
+ Samsung In-App Purchase
+
+ Не може да се отвори Samsung In-App Purchase. Одете во Дозволи, а потоа овозможете ги бараните дозволи и обидете се повторно.
+
+ За да купувате ставки, треба да го инсталирате Samsung купување во апликација. Да се инсталира?
+
+ Дадена е неважечка вредност за Samsung In-App Purchase.
+
+ Се чека\u2026
+
+ Плаќањето е одложено.
+
+ Ажурирање на Galaxy Apps
+
+ Достапна е нова верзија. Galaxy Apps ќе се ажурира на најновата верзија за да го завршите купувањево.
+
diff --git a/IAP5Helper/src/main/res/values-ml-rIN/strings.xml b/IAP5Helper/src/main/res/values-ml-rIN/strings.xml
new file mode 100644
index 0000000..cf0b675
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ml-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ അജ്ഞാത പിശക് സംഭവിച്ചു.
+
+ സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ
+
+ സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ തുറക്കാനാവില്ല. അനുമതികൾ എന്നതിലേക്ക് പോവുക, തുടർന്ന് ആവശ്യമായ അനുമതികൾ അനുവദിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.
+
+ ഇനങ്ങള് വാങ്ങുന്നതിന്, നിങ്ങള് സാംസംഗ് ഇന്-ആപ്ലിക്കേഷന് പര്ച്ചെയ്സ് ഇന്സ്റ്റാള് ചെയ്യേണ്ടതുണ്ട്. ഇന്സ്റ്റാള് ചെയ്യണോ?
+
+ സാംസംഗ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങലിന് ലഭ്യമാക്കിയത് അസാധുവായ ഒരു മൂല്യമാണ്.
+
+ കാക്കുന്നു\u2026
+
+ പണമടയ്ക്കല് റദ്ദാക്കി.
+
+ Galaxy Apps അപ്ഡേറ്റ് ചെയ്യുക
+
+ പുതിയൊരു പതിപ്പ് ലഭ്യമാണ്. ഈ വാങ്ങൽ പൂർത്തിയാക്കുന്നതിനായി Galaxy Apps ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യപ്പെടും.
+
diff --git a/IAP5Helper/src/main/res/values-mn-rMN/strings.xml b/IAP5Helper/src/main/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..258d5cc
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-mn-rMN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Үл мэдэх алдаа гарав
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase-г нээх боломжгүй. Зөвшөөрөл рүү ороод шаардлагатай зөвшөөрлийг олгоод дахин оролд.
+
+ Зүйлс худалдан авахын тулд, та Samsung In-App Purchase суулгах шаардлагатай. Суулгах уу?
+
+ Samsung In-App Purchase-д хүчингүй утга өгөгдсөн
+
+ Хүлээж байна\u2026
+
+ Төлбөр цуцалсан.
+
+ Galaxy Apps шинэчлэх
+
+ Шинэ хувилбар боломжтой. Энэ худалдан авалтыг дуусгахын тулд Galaxy Apps-г сүүлийн хувилбарт шинэчлэнэ.
+
diff --git a/IAP5Helper/src/main/res/values-mr-rIN/strings.xml b/IAP5Helper/src/main/res/values-mr-rIN/strings.xml
new file mode 100644
index 0000000..9a289ee
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-mr-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ अज्ञात त्रुटी आली.
+
+ सॅमसंग इन-ऍप खरेदी
+
+ सॅमसंग इन-ऍप पर्चेस उघडण्यात अक्षम. परवानग्यांवर जा, नंतर आवश्यक परवानग्यांना अनुमती द्या आणि पुन्हा प्रयत्न करा.
+
+ आयटेम्स खरेदी करण्यासाठी, आपण सॅमसंग इन-ऍप पर्चेस इन्स्टॉल करणे गरजेचे आहे. इन्स्टॉल करायचे?
+
+ सॅमसंग इन-ऍप पर्चेससाठी एक अग्राह्य मूल्य पुरवले गेले आहे.
+
+ प्रतीक्षा करत आहे\u2026
+
+ देय रद्द केलेले.
+
+ Galaxy Apps अद्ययावत करा
+
+ नवीन आवृत्ती उपलब्ध आहे. ही खरेदी पूर्ण करण्या साठी Galaxy Apps नवीनतम आवृत्तीत अद्ययावत केले जाईल.
+
diff --git a/IAP5Helper/src/main/res/values-ms-rMY/strings.xml b/IAP5Helper/src/main/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..d302bab
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ms-rMY/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ralat tidak diketahui berlaku.
+
+ Samsung In-App Purchase
+
+ Tidak dapat membuka Samsung In-App Purchase. Pergi ke Kebenaran, kemudian berikan kebenaran yang diperlukan dan cuba lagi.
+
+ Untuk membeli item, anda perlu memasang Belian Dalam Aplikasi Samsung. Pasang?
+
+ Nilai tidak sah telah disediakan untuk Samsung In-App Purchase.
+
+ Menunggu\u2026
+
+ Pembayaran dibatalkan.
+
+ Kemas kini Galaxy Apps
+
+ Versi baru tersedia. Galaxy Apps akan dikemas kini ke versi terkini untuk menyelesaikan pembelian ini.
+
diff --git a/IAP5Helper/src/main/res/values-my-rMM/strings.xml b/IAP5Helper/src/main/res/values-my-rMM/strings.xml
new file mode 100644
index 0000000..81396fa
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-my-rMM/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ မသိသော အမှား ဖြစ်သွားသည်။
+
+ Samsung In-App ဝယ်ယူမှု
+
+ Samsung In-App ဝယ်ယူမှုကို ဖွင့်၍မရနိုင်ပါ။ ခွင့်ပြုချက်များသို့သွားပြီးနောက် လိုအပ်သည့် ခွင့်ပြုချက်များကို ခွင့်ပြုပြီး ထပ်မံကြိုးစားပါ။
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ စောင့်နေဆဲ\u2026
+
+ ပေးချေမှု ပယ်ဖျက်ထားသည်။
+
+ Galaxy Apps ကို အပ်ဒိတ်လုပ်ပါ
+
+ ဗားရှင်း အသစ်တစ်ခု အရန်သင့် ရနိုင်ပါသည်။ ဤဝယ်ယူမှု ပြီးမြောက်စေရန် Galaxy Apps ကို နောက်ဆုံးထုတ် ဗားရှင်းသို့ အပ်ဒိတ်လုပ်ပါလိမ့်မည်။
+
diff --git a/IAP5Helper/src/main/res/values-my-rZG/strings.xml b/IAP5Helper/src/main/res/values-my-rZG/strings.xml
new file mode 100644
index 0000000..c409b18
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-my-rZG/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ မသိရေသာ အမွား ျဖစ္ပြားသည္။
+
+ Samsung In-App ဝယ္ယူမႈ
+
+ Samsung In-App ဝယ္ယူမႈကို ဖြင့္၍မရႏိုင္ပါ။ ခြင့္ျပဳခ်က္မ်ားသို႔သြားၿပီးေနာက္ လိုအပ္သည့္ ခြင့္ျပဳခ်က္မ်ားကို ခြင့္ျပဳၿပီး ထပ္မံႀကိဳးစားပါ။
+
+ ပစၥည္းမ်ား ဝယ္ရန္ Samsung In-App ဝယ္ယူမႈ တပ္ဆင္ဖို႔ လိုသည္။ တပ္ဆင္မည္လား?
+
+ Samsung In-App ဝယ္ယူမႈအတြက္ အက်ဳံးမဝင္ေသာ တန္ဖိုးတစ္ခု ေပးထားသည္။
+
+ ေစာင့္ေနဆဲ\u2026
+
+ ေပးေခ်မႈ ပယ္ဖ်က္ထားသည္။
+
+ Galaxy Apps ကုိ အပ္ဒိတ္လုပ္ပါ
+
+ ဗားရွင္း အသစ္တစ္ခု အရန္သင့္ ရႏိုင္ပါသည္။ ဤဝယ္ယူမႈ ၿပီးေျမာက္ေစရန္ Galaxy Apps ကို ေနာက္ဆုံးထုတ္ ဗားရွင္းသို႔ အပ္ဒိတ္လုပ္ပါလိမ့္မည္။
+
diff --git a/IAP5Helper/src/main/res/values-nb/strings.xml b/IAP5Helper/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000..cdfc49e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-nb/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ukjent feil oppstod.
+
+ Samsung In-App Purchase
+
+ Kan ikke åpne Samsung In-App Purchase. Gå til Tillatelser, tillat de nødvendige tillatelsene, og prøv igjen.
+
+ Du må installere Samsung In-App Purchase før du kan kjøpe noe. Installere?
+
+ Det har blitt oppgitt en ugyldig verdi for Samsung In-App Purchase.
+
+ Venter\u2026
+
+ Betaling avbrutt.
+
+ Oppdater Galaxy Apps
+
+ En ny versjon er tilgjengelig. Galaxy Apps blir oppdatert til den nyeste versjonen for å fullføre dette kjøpet.
+
diff --git a/IAP5Helper/src/main/res/values-ne-rNP/strings.xml b/IAP5Helper/src/main/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..0a80722
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ne-rNP/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ अज्ञात त्रुटि देखियो।
+
+ सैमसंग इन-एप खरिद
+
+ सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्।
+
+ वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने?
+
+ सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ।
+
+ प्रतीक्षा गर्दै\u2026
+
+ भुक्तानी रद्द गरियो।
+
+ Galaxy Apps लाई अपडेट गर्नुहोस्
+
+ एउटा नयाँ संस्करण उपलब्ध छ। यो खरिद पूरा गर्न Galaxy Apps लाई नवीनतम संस्करणमा अपडेट गरिने छ।
+
diff --git a/IAP5Helper/src/main/res/values-ne/strings.xml b/IAP5Helper/src/main/res/values-ne/strings.xml
new file mode 100644
index 0000000..0a80722
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ne/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ अज्ञात त्रुटि देखियो।
+
+ सैमसंग इन-एप खरिद
+
+ सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्।
+
+ वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने?
+
+ सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ।
+
+ प्रतीक्षा गर्दै\u2026
+
+ भुक्तानी रद्द गरियो।
+
+ Galaxy Apps लाई अपडेट गर्नुहोस्
+
+ एउटा नयाँ संस्करण उपलब्ध छ। यो खरिद पूरा गर्न Galaxy Apps लाई नवीनतम संस्करणमा अपडेट गरिने छ।
+
diff --git a/IAP5Helper/src/main/res/values-nl/strings.xml b/IAP5Helper/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..59dca90
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-nl/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Onbekende netwerkfout opgetreden
+
+ Samsung Kopen in app
+
+ Kan Samsung Kopen in app niet openen. Ga naar Machtigingen, sta de vereiste machtigingen toe en probeer het opnieuw.
+
+ Als u artikelen wilt kopen, moet u Samsung Kopen in app installeren. Installeren?
+
+ Er is een ongeldige waarde opgegeven voor Samsung Kopen in app.
+
+ Wachten\u2026
+
+ Betaling geannuleerd.
+
+ Galaxy Apps bijwerken
+
+ Er is een nieuwe versie beschikbaar. Galaxy Apps wordt bijgewerkt tot de laatste versie om deze aankoop te voltooien.
+
diff --git a/IAP5Helper/src/main/res/values-or/strings.xml b/IAP5Helper/src/main/res/values-or/strings.xml
new file mode 100644
index 0000000..b512502
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-or/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ ଅଜଣା ତ୍ରୁଟି ଘଟିଛି।
+
+ ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ
+
+ ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ ଖୋଲିବାକୁ ଅସମର୍ଥ। ଅନୁମତିଗୁଡିକୁ ଯାଆନ୍ତୁ, ତାପରେ ଆବଶ୍ୟକୀୟ ଅନୁମତିଗୁଡିକ ଅନୁମତି ଦିଅନ୍ତୁ ଏବଂ ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ।
+
+ ଆଇଟମ୍ କ୍ରୟ କରିବାକୁ, ଆପଣ ସାମ୍ସଙ୍ଗ ଇନ୍-ଆପ୍ କ୍ରୟସଂସ୍ଥାପନ କରିବା ଆବଶ୍ୟକ କରନ୍ତି। ସଂସ୍ଥାପନ କରିବେ?
+
+ Samsung In-App Purchase ପାଇଁ ଏକ ଅବୈଧ ମୂଲ୍ୟ ପ୍ରଦାନ କରାଯାଇଛି।
+
+ ଅପେକ୍ଷା କରୁଛି\u2026
+
+ ଦେୟ ବାତିଲ୍ ହୋଇଛି।
+
+ Galaxy Apps ଅପଡେଟ୍ କରନ୍ତୁ
+
+ ଏକ ନୂତନ ସଂସ୍କରଣ ଉପଲବ୍ଧ। Galaxy Apps ଏହି କ୍ରୟ ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ନବୀନତ୍ତମ ସଂସ୍କରଣକୁ ଅପଡେଟ୍ ହେବ।
+
diff --git a/IAP5Helper/src/main/res/values-pa-rIN/strings.xml b/IAP5Helper/src/main/res/values-pa-rIN/strings.xml
new file mode 100644
index 0000000..86cec7c
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-pa-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ ਅਗਿਆਤ ਤਰੁੱਟੀ ਉਤਪੰਨ ਹੋਈ।
+
+ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਖਰੀਦਦਾਰੀ
+
+ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਭੁਗਤਾਨ ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਮਰੱਥ। ਅਨੁਮਤੀਆਂ ਤੇ ਜਾਉ, ਫਿਰ ਲੋੜੀਂਦੀਆਂ ਅਨੁਮਤੀਆਂ ਨੂੰ ਆਗਿਆ ਦਿਉ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।
+
+ ਆਈਟਮ ਖਰੀਦਣ ਦੇ ਲਈ, ਤੁਹਾਨੂੰ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਸਥਾਪਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਸਥਾਪਿਤ ਕਰੋ?
+
+ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਦੇ ਲਈ ਇੱਕ ਅਵੈਧ ਮਾਨ ਪ੍ਰਦਾਨ ਕੀਤਾ ਗਿਆ ਹੈ।
+
+ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ\u2026
+
+ ਭੁਗਤਾਨ ਰੱਦ ਕੀਤੀ ਗਈ।
+
+ Galaxy Apps ਨੂੰ ਅਪਡੇਟ ਕਰੋ
+
+ ਇੱਕ ਨਵਾਂ ਸੰਸਕਰਣ ਉਪਲਬਧ ਹੈ। ਇਸ ਖਰੀਦਦਾਰੀ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ Galaxy Apps ਨੂੰ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਤੇ ਅਪਡੇਟ ਕੀਤਾ ਜਾਵੇਗਾ।
+
diff --git a/IAP5Helper/src/main/res/values-pl-rSP/strings.xml b/IAP5Helper/src/main/res/values-pl-rSP/strings.xml
new file mode 100644
index 0000000..f976668
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-pl-rSP/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Zaszeł niyznany feler
+
+ Sprowōnki rajn apl. Samsung
+
+ Niy idzie ôdewrzić aplikacyji Sprŏwōnki we strzodku aplikacyji fyrmy Samsung. Przelyź do Uprŏwniyń, a potym załōncz wymŏgane uprŏwniynia i badnij drugi rŏz.
+
+ Cobyś poradziōł kupować elemynty, trza zainsztalować usuga Zakupy w aplikacyji gyszeftu Samsung. Zainsztalować?
+
+ Do usugi Zakupy w aplikacyji gyszeftu Samsung dostarczōno niyprawŏ wartość.
+
+ Czekanie…
+
+ Płat pociepany.
+
+ Uaktualniynie Galaxy Apps
+
+ Do chycynio je nowo wersyjo. Aplikacyjo Galaxy Apps bydzie uaktualniōno do nojnowszyj wersyji coby zrobić tyn sprŏwōnek.
+
diff --git a/IAP5Helper/src/main/res/values-pl/strings.xml b/IAP5Helper/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..20ded52
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-pl/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Wystąpił nieznany błąd.
+
+ Zakupy wewn. apl. Samsung
+
+ Nie można otworzyć aplikacji Zakupy wewnątrz aplikacji firmy Samsung. Przejdź do Uprawnień, a następnie włącz wymagane uprawnienia i spróbuj ponownie.
+
+ Aby móc kupować elementy, musisz zainstalować usługę Zakupy wewnątrz aplikacji firmy Samsung. Zainstalować?
+
+ Do usługi Zakupy wewnątrz aplikacji firmy Samsung dostarczono nieprawidłową wartość.
+
+ Oczekiwanie\u2026
+
+ Płatność anulowana.
+
+ Aktualizacja Galaxy Apps
+
+ Dostępna jest nowa wersja. Aplikacja Galaxy Apps zostanie zaktualizowana do najnowszej wersji w celu dokonania tego zakupu.
+
diff --git a/IAP5Helper/src/main/res/values-pt-rBR/strings.xml b/IAP5Helper/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..54b6d4e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ocorreu erro desconhecido.
+
+ Compra no aplic. Samsung
+
+ Não é possível abrir Compra no aplicativo Samsung. Vá para Permissões, autorize as permissões necessárias e tente novamente.
+
+ Para comprar itens, é necessário instalar o Compra no Aplicativo Samsung. Instalar?
+
+ Um valor inválido foi fornecido para a Compra no aplicativo Samsung.
+
+ Aguardando\u2026
+
+ Pagamento cancelado.
+
+ Atualizar o Galaxy Apps
+
+ Uma nova versão está disponível. O Galaxy Apps será atualizado para a versão mais recente para concluir esta compra.
+
diff --git a/IAP5Helper/src/main/res/values-pt-rPT/strings.xml b/IAP5Helper/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..31b3cdb
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ocorreu erro desconhecido.
+
+ Samsung In-App Purchase
+
+ Impossível abrir a Samsung In-App Purchase. Aceda a Permissões, autorize as permissões necessárias e tente novamente.
+
+ Para comprar itens, tem de instalar a Samsung In-App Purchase. Instalar?
+
+ Foi fornecido um valor inválido para Samsung In-App Purchase.
+
+ A aguardar\u2026
+
+ Pagamento cancelado.
+
+ Actualizar Galaxy Apps
+
+ Está disponível uma nova versão. A Galaxy Apps será actualizada para a versão mais recente, para concluir esta compra.
+
diff --git a/IAP5Helper/src/main/res/values-ro/strings.xml b/IAP5Helper/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..3ee6923
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ro/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ A avut loc o eroare necunoscută.
+
+ Achiz. Samsung din apl.
+
+ Nu se poate deschide Achiziţionare Samsung din cadrul aplicaţiilor. Accesaţi Permisiuni, apoi acordaţi permisiunile necesare şi încercaţi din nou.
+
+ Pentru a achiziţiona elemente, trebuie să instalaţi Achiziţionarea Samsung din cadrul aplicaţiilor. Instalaţi?
+
+ A fost furnizată o valoare nevalidă pentru Achiziţionarea Samsung din cadrul aplicaţiilor.
+
+ Se aşteaptă\u2026
+
+ Plată anulată
+
+ Actualizare Galaxy Apps
+
+ Este disponibilă o nouă versiune. Galaxy Apps se va actualiza la cea mai recentă versiune pentru a finaliza achiziția.
+
diff --git a/IAP5Helper/src/main/res/values-ru/strings.xml b/IAP5Helper/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..768df9a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ru/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Возникла неизвестная ошибка.
+
+ Samsung In-App Purchase
+
+ Невозможно открыть Samsung In-App Purchase. Перейдите в “Разрешения” и повторите попытку, предоставив необходимые разрешения.
+
+ Для покупки необходимо установить Samsung In-App Purchase. Установить?
+
+ Указано недопустимое значение для Samsung In-App Purchase.
+
+ Ожидание\u2026
+
+ Платеж отменен.
+
+ Обновление Galaxy Apps
+
+ Доступна новая версия Galaxy Apps. Для завершения покупки приложение будет обновлено до последней версии.
+
diff --git a/IAP5Helper/src/main/res/values-si-rLK/strings.xml b/IAP5Helper/src/main/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..2c217e2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-si-rLK/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ නොදන්නා දෝෂයක් ඇතිවිය.
+
+ සැම්සුං අ.-යෙදුම් මි. ගැ.
+
+ සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න.
+
+ අයිතම මිල දී ගැනීමට ඔබ Samsung Apps-තුළ මිලදී ගැනීම ස්ථාපනය කරගත යුතුය. ස්ථාපනය කරන්නද?
+
+ Samsung Apps-තුළ මිලදී ගැනීම් සඳහා අවලංගු අගයක් සපයා ඇත.
+
+ රැඳී සිටිමින්\u2026
+
+ ගෙවීම අවලංගු විය.
+
+ Galaxy Apps යාවත්කාලය
+
+ නව අනුවාදයක් ඇත. මෙම මිලට ගැනුම සම්පූර්ණ කිරීමට Galaxy Apps නවතම අනුවාදයට යාවත්කාල වනු ඇත.
+
diff --git a/IAP5Helper/src/main/res/values-si/strings.xml b/IAP5Helper/src/main/res/values-si/strings.xml
new file mode 100644
index 0000000..2c217e2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-si/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ නොදන්නා දෝෂයක් ඇතිවිය.
+
+ සැම්සුං අ.-යෙදුම් මි. ගැ.
+
+ සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න.
+
+ අයිතම මිල දී ගැනීමට ඔබ Samsung Apps-තුළ මිලදී ගැනීම ස්ථාපනය කරගත යුතුය. ස්ථාපනය කරන්නද?
+
+ Samsung Apps-තුළ මිලදී ගැනීම් සඳහා අවලංගු අගයක් සපයා ඇත.
+
+ රැඳී සිටිමින්\u2026
+
+ ගෙවීම අවලංගු විය.
+
+ Galaxy Apps යාවත්කාලය
+
+ නව අනුවාදයක් ඇත. මෙම මිලට ගැනුම සම්පූර්ණ කිරීමට Galaxy Apps නවතම අනුවාදයට යාවත්කාල වනු ඇත.
+
diff --git a/IAP5Helper/src/main/res/values-sk/strings.xml b/IAP5Helper/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..a23c22e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-sk/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Vyskytla sa neznáma chyba.
+
+ Nákup v aplik. Samsung
+
+ Aplikácia Nákup v aplikáciách Samsung sa nedá otvoriť. Prejdite do menu Povolenia, udeľte potrebné povolenia a skúste to znova.
+
+ Ak si chcete kúpiť nejaké položky, musíte si nainštalovať aplikáciu Samsung nákup v aplikáciách. Nainštalovať?
+
+ Pre službu Nákup v aplikáciách Samsung bola poskytnutá neplatná hodnota.
+
+ Čaká sa\u2026
+
+ Platba bola zrušená.
+
+ Galaxy Apps – aktualizácia
+
+ K dispozícii je nová verzia. Aplikácia Galaxy Apps sa aktualizuje na najnovšiu verziu, aby ste mohli dokončiť tento nákup.
+
diff --git a/IAP5Helper/src/main/res/values-sl/strings.xml b/IAP5Helper/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..3ebed4a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-sl/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Prišlo je do neznane napake.
+
+ Nakup v aplikaciji Samsung
+
+ Aplikacije Samsung In-App Purchase ni mogoče odpreti. Pojdite v meni Dovoljenja, nato pa omogočite zahtevana dovoljenja in poskusite znova.
+
+ Če želite kupiti izdelke, morate namestiti aplikacijo Samsung nakup v aplikaciji. Jo želite namestiti?
+
+ Podana je neveljavna vrednost za nakup v aplikaciji Samsung.
+
+ Čakanje \u2026
+
+ Plačilo je preklicano.
+
+ Posodobite aplikacijo Galaxy Apps
+
+ Na voljo je nova različica. Za dokončanje tega nakupa bo aplikacija Galaxy Apps posodobljena na najnovejšo različico.
+
diff --git a/IAP5Helper/src/main/res/values-sq-rAL/strings.xml b/IAP5Helper/src/main/res/values-sq-rAL/strings.xml
new file mode 100644
index 0000000..63e6485
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-sq-rAL/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Ndodhi gabim i panjohur.
+
+ Blerja nga app-i Samsung
+
+ Nuk mund të hap Blerjen që nga aplikacioni Samsung. Shko te Lejet, pastaj jep lejet e nevojshme dhe provo sërish.
+
+ Për të blerë gjëra, duhet të instalosh Blerjen që nga aplikacionet Samsung. Ta instaloj?
+
+ Është futur një vlerë e pavlefshme për Blerjen që nga aplikacionet Samsung.
+
+ Duke pritur\u2026
+
+ Pagesa u anulua.
+
+ Përditëso Galaxy Apps
+
+ Ka një version të ri. Për ta përfunduar këtë blerje, Galaxy Apps do të përditësohet në versionin më të fundit.
+
diff --git a/IAP5Helper/src/main/res/values-sr/strings.xml b/IAP5Helper/src/main/res/values-sr/strings.xml
new file mode 100644
index 0000000..86389e3
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-sr/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Došlo je do nepoznate greške.
+
+ Samsung In-App Purchase
+
+ Nije moguće otvoriti aplikaciju Samsung In-App Purchase. Idite na Dozvole, a zatim dozvolite potrebne dozvole i pokušajte ponovo.
+
+ Da bi kupio/la stavke, moraš da instaliraš Samsung kupovinu iz aplikacije. Instalirati?
+
+ Neispravna vrednost je obezbeđena za uslugu Samsung In-App Purchase.
+
+ Čekanje\u2026
+
+ Plaćanje je otkazano.
+
+ Ažurirajte Galaxy Apps
+
+ Nova verzija je dostupna. Galaxy Apps će se ažurirati na najnoviju verziju kako bi se dovršila ova kupovina.
+
diff --git a/IAP5Helper/src/main/res/values-sv/strings.xml b/IAP5Helper/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..b1537a4
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-sv/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Okänt fel inträffade.
+
+ Samsung-pr. f. köp i pr.
+
+ Det går inte att öppna Samsung-appen för att köpa i appar. Öppna Behörigheter och tillåt sedan de nödvändiga behörigheterna innan du försöker igen.
+
+ Om du vill köpa objekt måste du installera Samsung-appen för att köpa i appar. Vill du installera?
+
+ Ett ogiltigt värde har tillhandahållits för Samsung-appen för att köpa i appar.
+
+ Väntar \u2026
+
+ Betalningen avbröts.
+
+ Uppdatera Galaxy Apps
+
+ En ny version är tillgänglig. Galaxy Apps uppdateras till den senaste versionen så att du kan slutföra köpet.
+
diff --git a/IAP5Helper/src/main/res/values-ta-rIN/strings.xml b/IAP5Helper/src/main/res/values-ta-rIN/strings.xml
new file mode 100644
index 0000000..294eafa
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ta-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ தெரியாத பிழை ஏற்பட்டுள்ளது.
+
+ சாம்சங் இன்-ஆப் வாங்குதல்
+
+ சாம்சங் இன்-ஆப் வாங்குதலை திறக்க இயலவில்லை. அனுமதிகள் என்பதற்குச் சென்று, பிறகு தேவையான அனுமதிகளை அனுமதித்து, மீண்டும் முயலவும்.
+
+ உருப்படிகளை வாங்க சாம்சங் உள்-ப.பாட்டு வாங்குதலை நீங்கள் நிறுவ வேண்டும். நிறுவவா?
+
+ சாம்சங் பயன்பாட்டுக்கு உள்ளான வாங்குதலுக்கு ஒரு தவறான மதிப்பு வழங்கப்பட்டது.
+
+ காத்திருக்கிறது\u2026
+
+ கட்டணத்தொகை ரத்து செய்யப்பட்டது.
+
+ Galaxy Apps-ஐ புதுப்பிக்கவும்
+
+ புதிய பதிப்பு கிடைக்கிறது. இந்த வாங்குதலை முடிப்பதற்காக Galaxy Apps அதன் சமீபத்திய பதிப்பிற்குப் புதுப்பிக்கப்படும்.
+
diff --git a/IAP5Helper/src/main/res/values-te-rIN/strings.xml b/IAP5Helper/src/main/res/values-te-rIN/strings.xml
new file mode 100644
index 0000000..39a2075
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-te-rIN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ తెలియని లోపం ఏర్పడింది.
+
+ స్యామ్సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు
+
+ స్యామ్సంగ్ ఇన్-యాప్ కొనుగోలును తెరవడం సాధ్యం కాదు. అనుమతులకు వెళ్లి, ఆపై అవసరమైన అనుమతులను అనుమతించి, మళ్లీ ప్రయత్నించండి.
+
+ ఐటెమ్లను కొనుగోలు చేయడానికి, మీరు స్యామ్సంగ్ ఇన్-యాప్ కొనుగోలును వ్యవస్థాపించాలి. వ్యవస్థాపించాలా?
+
+ స్యామ్సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు కోసం చెల్లని విలువ అందించబడింది.
+
+ వేచి ఉంది\u2026
+
+ చెల్లింపు విఫలమైంది.
+
+ Galaxy Appsని అప్డేట్ చేయి
+
+ కొత్త వెర్షన్ అందుబాటులో ఉంది. ఈ కొనుగోలును పూర్తి చేయడం కోసం Galaxy Apps ఇటీవలి వెర్షన్కు అప్డేట్ చేయబడుతుంది.
+
diff --git a/IAP5Helper/src/main/res/values-tg/strings.xml b/IAP5Helper/src/main/res/values-tg/strings.xml
new file mode 100644
index 0000000..5f2684e
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-tg/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Хатогии номаълум ба амал омад
+
+ Samsung In-App Purchase
+
+ Кушодани Samsung In-App Purchase ғайриимкон аст. Ба Иҷозатҳо гузашта, иҷозатҳои лозимро бидиҳед ва кӯшишро такрор кунед.
+
+ Барои харидани ин ҷузъҳо шумо бояд Samsung In-App Purchase-ро насб кунед. Насб мекунед?
+
+ Барои Samsung In-App Purchase қимати нодуруст пешниҳод карда шуд
+
+ Интизорӣ\u2026
+
+ Пардохт бекор карда шуд
+
+ Навсозии Galaxy Apps
+
+ Версияи нав дастрас аст. Барои анҷом додани харид Galaxy Apps то версияи охирин навсозӣ карда мешавад.
+
diff --git a/IAP5Helper/src/main/res/values-th/strings.xml b/IAP5Helper/src/main/res/values-th/strings.xml
new file mode 100644
index 0000000..666993a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-th/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ เกิดข้อผิดพลาดที่ไม่รู้จัก
+
+ การสั่งซื้อในแอพของ Samsung
+
+ ไม่สามารถเปิดการสั่งซื้อในแอพของ Samsung ได้ ไปที่การอนุญาต แล้วให้อนุญาตดังต่อไปนี้แล้วลองอีกครั้ง:
+
+ ในการซื้อรายการต่างๆ คุณต้องติดตั้งการสั่งซื้อในแอพของ Samsung ติดตั้ง?
+
+ มีการระบุค่าไม่ถูกต้อง สำหรับการสั่งซื้อในแอพของ Samsung
+
+ กำลังรอ\u2026
+
+ การชำระเงินถูกยกเลิก
+
+ อัพเดท Galaxy Apps
+
+ มีเวอร์ชั่นใหม่พร้อมใช้งาน Galaxy Apps จะถูกอัพเดทเป็นเวอร์ชั่นล่าสุด เพื่อทำการซื้อครั้งนี้ให้เสร็จสิ้น
+
diff --git a/IAP5Helper/src/main/res/values-tk/strings.xml b/IAP5Helper/src/main/res/values-tk/strings.xml
new file mode 100644
index 0000000..9784924
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-tk/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Bilinmedik näsazlygy bar
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase-i açyp bolmaýar. Rugsatlar-a baryp, gerekli rugsatlary beriň we täzeden synanyşyň.
+
+ Elementleri satyn almak üçin Samsung Gollanmada Satyn almany guruň. Gurulsynmy?
+
+ Samsung Gollanmada Satyn alma üçin ýalňyş ulylyk berildi
+
+ Garaşylýar\u2026
+
+ Töleg ýatyryldy
+
+ Galaxy Apps-y täzele
+
+ Täze wersiýa elýeterli. Bu satyn alşy tamamlamak üçin, Galaxy Apps-yň iň täze wersiýasy gurnalar.
+
diff --git a/IAP5Helper/src/main/res/values-tl/strings.xml b/IAP5Helper/src/main/res/values-tl/strings.xml
new file mode 100644
index 0000000..b66e743
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-tl/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ May naganap na hindi alam na error.
+
+ Samsung In-App Purchase
+
+ Hindi mabuksan ang Samsung In-App Purchase. Pumunta sa Permissions, tapos payagan ang mga kailangang pahintulot at subukang muli.
+
+ Upang bumili ng mga item, kailangan mong i-install ang Samsung In-App Purchase. I-install?
+
+ May ibinigay na hindi tamang halaga para sa Samsung In-App Purchase.
+
+ Naghihintay\u2026
+
+ Kinansela ang pagbabayad.
+
+ I-update ang Galaxy Apps
+
+ May bagong bersiyon na magagamit. Ia-update ang Galaxy Apps sa pinakabagong bersiyon para tapusin ang pagbili na ito.
+
diff --git a/IAP5Helper/src/main/res/values-tr/strings.xml b/IAP5Helper/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000..f02cd9c
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-tr/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Bilinmeyen hata oluştu.
+
+ Samsung In-App Satın Alma
+
+ Samsung In-App Satın Alma açılamıyor. İzinler bölümüne gidin, ardından gerekli izinleri verip tekrar deneyin.
+
+ Ögeleri satın almak için Samsung In-App Satın alma\'yı kurmanız gerekir. Kurulsun mu?
+
+ Samsung In-App Satın Alımı için geçersiz bir değer sağlandı.
+
+ Bekliyor\u2026
+
+ Ödeme iptal edildi.
+
+ Galaxy Apps\'i güncelle
+
+ Yeni bir sürüm mevcut. Bu satın alma işlemini tamamlamak için Galaxy Apps en son sürüme güncellenecek.
+
diff --git a/IAP5Helper/src/main/res/values-uk/strings.xml b/IAP5Helper/src/main/res/values-uk/strings.xml
new file mode 100644
index 0000000..33513ed
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-uk/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Сталася невідома помилка.
+
+ Samsung In-App Purchase
+
+ Неможливо відкрити Samsung In-App Purchase. Перейдіть до «Дозволи» і повторіть спробу, надавши необхідні дозволи.
+
+ Для придбання об\'єктів потрібно встановити Samsung In-App Purchase. Установити?
+
+ Для Samsung In-App Purchase вказано хибне значення.
+
+ Очікування\u2026
+
+ Платіж скасовано.
+
+ Оновлення Galaxy Apps
+
+ Доступна нова версія Galaxy Apps. Для завершення покупки програму буде оновлено до останньої версії.
+
diff --git a/IAP5Helper/src/main/res/values-ur-rPK/strings.xml b/IAP5Helper/src/main/res/values-ur-rPK/strings.xml
new file mode 100644
index 0000000..49ddf43
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-ur-rPK/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ نامعلوم غلطی واقع ہوگئی
+
+ Samsung In-App خریداری
+
+ Samsung In-App خریداری کھولنے سے قاصر۔ اجازتوں پر جائیں، پھر درکار اجازتوں کی اجازت دیں اور دوبارہ کوشش کریں۔
+
+ اشیا خریداری کرنے کے لئے، آپ کو Samsung In-App خریداری نصب کرنے کی ضرورت ہے۔ نصب کریں؟
+
+ Samsung In-App خریداری کے لئے ایک غیرمجاز قیمت فراہم کی گئی ہے
+
+ انتظار کررہا ہے\u2026
+
+ ادائیگی منسوخ ہوگئی۔
+
+ Galaxy Apps اپ ڈیٹ کریں
+
+ ایک نیا ورژن دستیاب ہے۔ یہ خریداری مکمل کرنے کے لیے Galaxy Apps کو تازہ ترین ورژن میں اپ ڈیٹ کیا جائے گا۔
+
diff --git a/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml b/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml
new file mode 100644
index 0000000..d323ee2
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Noma’lum xato yuz berdi.
+
+ Samsung In-App Purchase
+
+ Samsung In-App Purchase’ni ochib bo‘lmaydi. Ruxsatlarga o‘ting, so‘ngra quyidagi ruxsatlarga ijozat bering va qayta urinib ko‘ring.
+
+ Elementlarni xarid qilish uchun Samsung In-App Purchase-ni o‘rnating. O‘rnatilsinmi?
+
+ Samsung In-App Purchase uchun mumkin bo‘lmagan qiymat taqdim etilgan.
+
+ Kutilmoqda\u2026
+
+ To‘lov bekor qilindi.
+
+ Galaxy Apps’ni yangilash
+
+ Yangi versiya mavjud. Ushbu xaridni nihoyasiga yetkazish uchun Galaxy Apps eng oxirgi versiyaga yangilanadi.
+
diff --git a/IAP5Helper/src/main/res/values-vi/strings.xml b/IAP5Helper/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..1229d4a
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-vi/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Xảy ra lỗi.
+
+ Mua hàng trong ứ.dụng Samsung
+
+ Không thể mở Mua hàng trong ứng dụng Samsung. Đi đến Quyền, rồi cho phép các quyền cần thiết và thử lại.
+
+ Để mua hàng, bạn cần cài đặt Mua hàng trong ứng dụng Samsung. Cài đặt?
+
+ Đã cung cấp một giá trị không hợp lệ cho hình thức Mua hàng trong ứng dụng Samsung.
+
+ Đang chờ\u2026
+
+ Đã hủy thanh toán.
+
+ Cập nhật Galaxy Apps
+
+ Đã có phiên bản mới. Galaxy Apps sẽ được cập nhật lên phiên bản mới nhất để hoàn tất giao dịch mua này.
+
diff --git a/IAP5Helper/src/main/res/values-xh/strings.xml b/IAP5Helper/src/main/res/values-xh/strings.xml
new file mode 100644
index 0000000..a35d420
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-xh/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Kwenzeke impazamo engaziwayo.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Ilindile\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values-zh-rCN/strings.xml b/IAP5Helper/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..c3fd712
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ 未知错误产生
+
+ Samsung In-App Purchase
+
+ 无法打开 Samsung In-App Purchase。请进入【权限】,然后允许以下权限并重试。
+
+ 若要购买商品,您需要安装 Samsung In-App Purchase。是否安装?
+
+ Samsung In-App Purchase 已获取一个无效值。
+
+ 请稍候\u2026
+
+ 支付已取消。
+
+ 更新三星应用商店
+
+ 有新版本可用。三星应用商店将更新至最新版本以完成本次购物。
+
diff --git a/IAP5Helper/src/main/res/values-zh-rHK/strings.xml b/IAP5Helper/src/main/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..8b6dd2d
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-zh-rHK/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ 發生未知錯誤。
+
+ Samsung In-App Purchase
+
+ 無法開啟 Samsung In-App Purchase。請前往 [權限],然後允許權限並重試。
+
+ 若要購買項目,需安裝 Samsung In-App Purchase。安裝嗎?
+
+ 提供給 Samsung In-App Purchase 的值無效。
+
+ 請稍候\u2026
+
+ 付款已取消。
+
+ 更新 Galaxy Apps
+
+ 已有新版本可用。Galaxy Apps 將更新至最新版本以完成此購買。
+
diff --git a/IAP5Helper/src/main/res/values-zh-rTW/strings.xml b/IAP5Helper/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..b8f1f94
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ 已發生未知錯誤。
+
+ Samsung In-App Purchase
+
+ 無法開啟 [三星應用程式內購買]。請前往 [權限],然後允許所需權限並重試。
+
+ 若要購買項目,需安裝 Samsung In-App Purchase。安裝嗎?
+
+ 提供給 Samsung In-App Purchase 的值無效。
+
+ 等待中\u2026
+
+ 付款已取消。
+
+ 更新 Galaxy Apps
+
+ 有可用的新版本。Galaxy Apps 將更新至最新版本以完成此筆購買。
+
diff --git a/IAP5Helper/src/main/res/values-zu/strings.xml b/IAP5Helper/src/main/res/values-zu/strings.xml
new file mode 100644
index 0000000..5aa5031
--- /dev/null
+++ b/IAP5Helper/src/main/res/values-zu/strings.xml
@@ -0,0 +1,39 @@
+
+
+
+
+ Kuvule iphutha elingaziwa.
+
+ Samsung In-App Purchase
+
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+ An invalid value has been provided for Samsung In-App Purchase.
+
+ Ilindile\u2026
+
+ Payment cancelled.
+
+ Update Galaxy Apps
+
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+
diff --git a/IAP5Helper/src/main/res/values/dimen.xml b/IAP5Helper/src/main/res/values/dimen.xml
new file mode 100644
index 0000000..a0f08c4
--- /dev/null
+++ b/IAP5Helper/src/main/res/values/dimen.xml
@@ -0,0 +1,4 @@
+
+
+ 15dp
+
\ No newline at end of file
diff --git a/IAP5Helper/src/main/res/values/strings.xml b/IAP5Helper/src/main/res/values/strings.xml
new file mode 100644
index 0000000..53cfc04
--- /dev/null
+++ b/IAP5Helper/src/main/res/values/strings.xml
@@ -0,0 +1,19 @@
+
+
+ Unknown error occurred.
+ Samsung In-App Purchase
+ Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again.
+ An invalid value has been provided for Samsung In-App Purchase.
+ Payment cancelled.
+ Update Galaxy Apps
+ A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase.
+ Waiting...
+
+
+ "An invalid installation of In-App Purchase has been detected. Check and try again."
+ The payment was successful
+
+
+ To purchase items, you need to install Samsung In-App Purchase. Install?
+
+
\ No newline at end of file
diff --git a/IAP5Helper/src/main/res/values/styles.xml b/IAP5Helper/src/main/res/values/styles.xml
new file mode 100644
index 0000000..3f39454
--- /dev/null
+++ b/IAP5Helper/src/main/res/values/styles.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 3f464a4..5704bb5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -42,10 +42,18 @@ android {
}
buildTypes {
release {
- minifyEnabled false
+ minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+ flavorDimensions "platform"
+ productFlavors {
+ standard {}
+ samsung {
+ applicationId "com.wbrawner.simplemarkdown.samsung"
+ minSdkVersion 21
+ }
+ }
dexOptions {
jumboMode true
}
@@ -61,29 +69,38 @@ ext {
}
dependencies {
- testCompile 'junit:junit:4.12'
- compile fileTree(dir: 'libs', include: ['*.jar'])
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
- compile "com.android.support:appcompat-v7:$support_version"
- compile 'com.android.support.constraint:constraint-layout:1.0.2'
- compile "com.android.support:design:$support_version"
- compile "com.android.support:support-v13:$support_version"
- compile 'com.commonsware.cwac:anddown:0.3.0'
- compile 'com.google.dagger:dagger:2.11'
- compile 'com.jakewharton:butterknife:8.7.0'
- compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
- compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'
- compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
- compile 'io.reactivex.rxjava2:rxjava:2.1.0'
- testImplementation "org.robolectric:robolectric:3.6.1"
- androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1'
- androidTestCompile 'com.android.support.test:runner:1.0.1'
- androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
+
annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
- compile('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
+
+ testImplementation 'junit:junit:4.12'
+ testImplementation "org.robolectric:robolectric:3.6.1"
+
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
+ exclude group: 'com.android.support', module: 'support-annotations'
+ })
+
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
+ androidTestImplementation 'com.android.support.test:runner:1.0.1'
+ androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
+
+ implementation "com.android.support:appcompat-v7:$support_version"
+ implementation 'com.android.support.constraint:constraint-layout:1.0.2'
+ implementation "com.android.support:design:$support_version"
+ implementation "com.android.support:support-v13:$support_version"
+ implementation 'com.commonsware.cwac:anddown:0.3.0'
+ implementation 'com.google.dagger:dagger:2.11'
+ implementation 'com.jakewharton:butterknife:8.7.0'
+ implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
+ implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'
+ implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
+ implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
+
+ samsungImplementation project(":IAP5Helper")
+
+ implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') {
transitive = true
}
}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 4581c5f..3cf3306 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -23,3 +23,8 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
+
+### Crashlytics ###
+-keepattributes *Annotation*
+-keepattributes SourceFile,LineNumberTable
+### End Crashlytics ###
\ No newline at end of file
diff --git a/app/src/samsung/AndroidManifest.xml b/app/src/samsung/AndroidManifest.xml
new file mode 100644
index 0000000..8d2f382
--- /dev/null
+++ b/app/src/samsung/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index e7b4def..6d5f6c6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,2 @@
include ':app'
+include ':IAP5Helper'
\ No newline at end of file