diff --git a/IAP5Helper/build.gradle b/IAP5Helper/build.gradle new file mode 100644 index 0000000..4febbb5 --- /dev/null +++ b/IAP5Helper/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.android.library' +android { + compileSdkVersion 28 + buildToolsVersion '28.0.3' + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 28 + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } +} + +dependencies { +} \ No newline at end of file diff --git a/IAP5Helper/proguard-rules.pro b/IAP5Helper/proguard-rules.pro new file mode 100644 index 0000000..41afecb --- /dev/null +++ b/IAP5Helper/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in D:\Android\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/IAP5Helper/src/main/AndroidManifest.xml b/IAP5Helper/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3eb4fe3 --- /dev/null +++ b/IAP5Helper/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + \ No newline at end of file diff --git a/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPConnector.aidl b/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPConnector.aidl new file mode 100644 index 0000000..cb379bc --- /dev/null +++ b/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPConnector.aidl @@ -0,0 +1,17 @@ +package com.samsung.android.iap; + +import com.samsung.android.iap.IAPServiceCallback; + +interface IAPConnector { + + boolean requestCmd(IAPServiceCallback callback, in Bundle bundle); + + boolean unregisterCallback(IAPServiceCallback callback); + + ///////////////////////////// IAP 5.0 + Bundle getProductsDetails(String packageName, String itemIds, int pagingIndex, int mode); + + Bundle getOwnedList(String packageName, String itemType, int pagingIndex, int mode); + + Bundle consumePurchasedItems(String packageName, String purchaseIds, int mode); +} diff --git a/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPServiceCallback.aidl b/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPServiceCallback.aidl new file mode 100644 index 0000000..c371233 --- /dev/null +++ b/IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPServiceCallback.aidl @@ -0,0 +1,7 @@ +package com.samsung.android.iap; + +import android.os.Bundle; + +interface IAPServiceCallback { + oneway void responseCallback(in Bundle bundle); +} \ No newline at end of file diff --git a/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/BaseActivity.java b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/BaseActivity.java new file mode 100644 index 0000000..dd8858d --- /dev/null +++ b/IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/BaseActivity.java @@ -0,0 +1,272 @@ +package com.samsung.android.sdk.iap.lib.activity; + +import java.util.ArrayList; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.Signature; +import android.net.Uri; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; + +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.HelperUtil; +import com.samsung.android.sdk.iap.lib.helper.IapHelper; +import com.samsung.android.sdk.iap.lib.listener.OnIapBindListener; +import com.samsung.android.sdk.iap.lib.vo.ConsumeVo; +import com.samsung.android.sdk.iap.lib.vo.ErrorVo; +import com.samsung.android.sdk.iap.lib.vo.OwnedProductVo; +import com.samsung.android.sdk.iap.lib.vo.ProductVo; +import com.samsung.android.sdk.iap.lib.vo.PurchaseVo; + + +public abstract class BaseActivity extends Activity +{ + private static final String TAG = BaseActivity.class.getSimpleName(); + + protected ErrorVo mErrorVo = new ErrorVo(); + protected PurchaseVo mPurchaseVo = null; + protected ArrayList mProductsDetails = null; + protected ArrayList mOwnedList = null; + protected ArrayList mConsumeList = null; + private Dialog mProgressDialog = null; + + /** + * Helper Class between IAPService and 3rd Party Application + */ + IapHelper mIapHelper = null; + + /** Flag value to show successful pop-up. Error pop-up appears whenever it fails or not. */ + protected boolean mShowSuccessDialog = true; + protected boolean mShowErrorDialog = true; + + @Override + protected void onCreate( Bundle savedInstanceState ) + { + // 1. Store IapMode passed by Intent + // ==================================================================== + Intent intent = getIntent(); + + // ==================================================================== + + // 2. IapHelper Instance creation + // To test on development, set mode to test mode using + // use IapHelper.IAP_MODE_TEST_SUCCESS or + // IapHelper.IAP_MODE_TEST_FAIL constants. + // ==================================================================== + mIapHelper = IapHelper.getInstance( this ); + // ==================================================================== + + // 3. This activity is invisible excepting progress bar as default. + // ==================================================================== + try + { + if( mProgressDialog != null ) + { + mProgressDialog.dismiss(); + mProgressDialog = null; + } + mProgressDialog = new Dialog(this, R.style.Theme_Empty); + mProgressDialog.setContentView(R.layout.progress_dialog); + mProgressDialog.setCancelable(false); + mProgressDialog.show(); + } + catch( Exception e ) + { + e.printStackTrace(); + } + // ==================================================================== + + super.onCreate( savedInstanceState ); + } + + public void setProductsDetails(ArrayList _productsDetails ) + { + mProductsDetails = _productsDetails; + } + + public void setOwnedList(ArrayList _ownedList ) + { + mOwnedList = _ownedList; + } + + public void setPurchaseVo( PurchaseVo _purchaseVo ) + { + mPurchaseVo = _purchaseVo; + } + + public void setConsumeList( ArrayList _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..b2b4c84 --- /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..df34719 --- /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..9f65577 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ar/strings.xml @@ -0,0 +1,38 @@ + + + + حدث خطأ غير معلوم. + + عملية الشراء من داخل التطبيقات من 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..ccf2218 --- /dev/null +++ b/IAP5Helper/src/main/res/values-as/strings.xml @@ -0,0 +1,38 @@ + + + + অজ্ঞাত ত্ৰুটি ঘটিছে৷ + + চেমচাং ইন-এপ ক্ৰয় + + চেমচাং ইন-এপ ক্ৰয় খোলাত অক্ষম। অনুমতিলৈ যাওক, তাৰপিছত আৱশ্যকীয় অনুমতি অনুমোদন কৰক আৰু পুনঃচেষ্টা কৰক। + + আইটেমসমূহ ক্ৰয় কৰিবলৈ, আপুনি চেমচাং ইন-এপ পাৰচেজ ইনষ্টল কৰাটো প্ৰয়োজন। ইনষ্টল কৰিবনে? + + চেমচাং ইন-এপ ক্ৰয়ৰ বাবে এটা অমান্য মান প্ৰদান কৰা হৈছে৷ + + অপেক্ষাৰত\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..d168422 --- /dev/null +++ b/IAP5Helper/src/main/res/values-az-rAZ/strings.xml @@ -0,0 +1,38 @@ + + + + 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..b2430ab --- /dev/null +++ b/IAP5Helper/src/main/res/values-be-rBY/strings.xml @@ -0,0 +1,38 @@ + + + + Адбылася невядомая памылка. + + 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..3896584 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bg/strings.xml @@ -0,0 +1,38 @@ + + + + Възникна неизвестна грешка. + + Покупка от прил. на 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..5ae7e1f --- /dev/null +++ b/IAP5Helper/src/main/res/values-bn-rBD/strings.xml @@ -0,0 +1,38 @@ + + + + অজানা ত্রুটি ঘটেছে। + + 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..9384b2a --- /dev/null +++ b/IAP5Helper/src/main/res/values-bn-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + অজানা ত্রুটি ঘটেছে। + + স্যামসাং ইন-অ্যাপ পারচেস + + স্যামসাং ইন-অ্যাপ পারচেজ খুলতে অক্ষম। অনুমতিগুলিতে যান, তারপর প্রয়োজনীয় অনুমতিগুলি মঞ্জুর করুন এবং আবার চেষ্টা করুন। + + আইটেমগুলি কিনতে আপনার স্যামসাং ইন-অ্যাপ ক্রয় ইনস্টল করা প্রয়োজন৷ ইনস্টল করবেন? + + স্যামসাং ইন-অ্যাপ ক্রয়ের জন্য একটি অবৈধ মান সরবরাহিত হয়েছে। + + অপেক্ষা করা হচ্ছে\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..52d64ab --- /dev/null +++ b/IAP5Helper/src/main/res/values-bo/strings.xml @@ -0,0 +1,38 @@ + + + + རྒྱུས་མེད་ནོར་འཁྲུལ་བྱུང༌། + + 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..b19cb7e --- /dev/null +++ b/IAP5Helper/src/main/res/values-bs/strings.xml @@ -0,0 +1,38 @@ + + + + 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..c8a497c --- /dev/null +++ b/IAP5Helper/src/main/res/values-ca/strings.xml @@ -0,0 +1,38 @@ + + + + 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..3744d25 --- /dev/null +++ b/IAP5Helper/src/main/res/values-cs/strings.xml @@ -0,0 +1,38 @@ + + + + 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..222314f --- /dev/null +++ b/IAP5Helper/src/main/res/values-da/strings.xml @@ -0,0 +1,38 @@ + + + + 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..169e312 --- /dev/null +++ b/IAP5Helper/src/main/res/values-de/strings.xml @@ -0,0 +1,38 @@ + + + + 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..040a0a7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-el/strings.xml @@ -0,0 +1,38 @@ + + + + Παρουσιάστηκε άγνωστο σφάλμα. + + 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..68881f7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,38 @@ + + + + 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..ed04d79 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rPH/strings.xml @@ -0,0 +1,38 @@ + + + + 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..0fe060b --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,38 @@ + + + + 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..0fe060b --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rZG/strings.xml @@ -0,0 +1,38 @@ + + + + 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..0fe060b --- /dev/null +++ b/IAP5Helper/src/main/res/values-en/strings.xml @@ -0,0 +1,38 @@ + + + + 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..09403a6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-es-rES/strings.xml @@ -0,0 +1,38 @@ + + + + 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..e1ca51a --- /dev/null +++ b/IAP5Helper/src/main/res/values-es-rUS/strings.xml @@ -0,0 +1,38 @@ + + + + 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..34e1bad --- /dev/null +++ b/IAP5Helper/src/main/res/values-et-rEE/strings.xml @@ -0,0 +1,38 @@ + + + + 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..6651ea3 --- /dev/null +++ b/IAP5Helper/src/main/res/values-eu-rES/strings.xml @@ -0,0 +1,38 @@ + + + + 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..ded7cee --- /dev/null +++ b/IAP5Helper/src/main/res/values-fa/strings.xml @@ -0,0 +1,38 @@ + + + + خطای نامشخصی رخ داد. + + خرید درون برنامه سامسونگ + + باز کردن خرید درون برنامه سامسونگ ممکن نیست. به مجوزها بروید، سپس به مجوزهای مورد نیاز اجازه داده و دوباره امتحان کنید. + + برای خرید موارد، باید خرید درون برنامه سامسونگ را نصب کنید. نصب شود؟ + + یک مقدار نادرست برای خرید درون برنامه سامسونگ ارائه شده است. + + در انتظار\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..70df6ce --- /dev/null +++ b/IAP5Helper/src/main/res/values-fi/strings.xml @@ -0,0 +1,38 @@ + + + + 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..d91b206 --- /dev/null +++ b/IAP5Helper/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,38 @@ + + + + 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..afd6c77 --- /dev/null +++ b/IAP5Helper/src/main/res/values-fr/strings.xml @@ -0,0 +1,38 @@ + + + + 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..74fe5a1 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ga/strings.xml @@ -0,0 +1,38 @@ + + + + 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..54bd630 --- /dev/null +++ b/IAP5Helper/src/main/res/values-gl-rES/strings.xml @@ -0,0 +1,38 @@ + + + + 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..8bdd51a --- /dev/null +++ b/IAP5Helper/src/main/res/values-gu-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + અજ્ઞાત ભૂલ થઈ છે. + + સેમસંગ ઇન-એપ ખરીદી + + સેમસંગ ઇન-એપ ખરીદી ખોલવામાં અસમર્થ. પરવાનગીઓ પર જાઓ, પછી નીચે આપેલ પરવાનગીઓની મંજૂરી આપો અને ફરી પ્રયાસ કરો. + + વસ્તુઓ ખરીદવા માટે, તમને સેમસંગ ઇન-એપ્લિકેશન પરચેઝ સ્થાપિત કરવાની આવશ્યકતા છે. સ્થાપિત કરીએ? + + સેમસંગ ઇન-એપ ખરીદી માટે એક અમાન્ય મૂલ્ય પ્રદાન કરવામાં આવ્યું છે. + + પ્રતીક્ષા કરી રહ્યું છે\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..6e3dac6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-hi/strings.xml @@ -0,0 +1,38 @@ + + + + अज्ञात त्रुटि पाई गई + + सैमसंग इन-एप खरीद + + सैमसंग इन-एप खरीदारी खोलने में असमर्थ। अनुमतियाँ पर जाएँ, फिर आवश्यक अनुमतियों को अनुमति दें और फिर से प्रयास करें। + + मदें खरीदने के लिए, आपको सैमसंग इन-एप परचेस़ स्थापित करना आवश्यक हैं। स्थापित करें? + + सैमसंग इन-एप परचेज के लिए कोई अमान्य मान प्रदान किया गया है। + + प्रतीक्षा कर रहा है\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..33faf27 --- /dev/null +++ b/IAP5Helper/src/main/res/values-hr/strings.xml @@ -0,0 +1,38 @@ + + + + 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..73d693c --- /dev/null +++ b/IAP5Helper/src/main/res/values-hu/strings.xml @@ -0,0 +1,38 @@ + + + + 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..dda06e6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-hy-rAM/strings.xml @@ -0,0 +1,38 @@ + + + + Անհայտ սխալ տեղի ունեցավ: + + 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..b9bb5f0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-in/strings.xml @@ -0,0 +1,38 @@ + + + + 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..399c912 --- /dev/null +++ b/IAP5Helper/src/main/res/values-is-rIS/strings.xml @@ -0,0 +1,38 @@ + + + + Óþ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..4c7722a --- /dev/null +++ b/IAP5Helper/src/main/res/values-it/strings.xml @@ -0,0 +1,38 @@ + + + + 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..c762708 --- /dev/null +++ b/IAP5Helper/src/main/res/values-iw/strings.xml @@ -0,0 +1,38 @@ + + + + ארעה שגיאה לא ידועה. + + 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..1a83e74 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ja/strings.xml @@ -0,0 +1,38 @@ + + + + 不明なエラーが発生しました。 + + 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..b7c6e3c --- /dev/null +++ b/IAP5Helper/src/main/res/values-ka-rGE/strings.xml @@ -0,0 +1,38 @@ + + + + მოხდა უცნობი შეცდომა. + + 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..95dcd06 --- /dev/null +++ b/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml @@ -0,0 +1,38 @@ + + + + Белгісіз қате пайда болды. + + 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..7e552d1 --- /dev/null +++ b/IAP5Helper/src/main/res/values-km-rKH/strings.xml @@ -0,0 +1,38 @@ + + + + កំហុស​មិន​ស្គាល់​បាន​កើតឡើង។ + + 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..748abbf --- /dev/null +++ b/IAP5Helper/src/main/res/values-kn-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + ಅಜ್ಞಾತ ದೋಷ ಸಂಭವಿಸಿದೆ. + + ಸ್ಯಾಮ್‌ಸಂಗ್ ಇನ್-ಅನ್ವಯಿಸುವಿಕೆ ಖರೀದಿ + + 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..aa26faa --- /dev/null +++ b/IAP5Helper/src/main/res/values-ko/strings.xml @@ -0,0 +1,38 @@ + + + + 알 수 없는 오류가 발생했습니다. + + 삼성 인앱결제 + + 삼성 인앱결제를 실행할 수 없습니다. [권한]에서 다음 권한을 허용한 후 다시 시도하세요. + + 상품을 구매하려면 [삼성 인앱결제]이 필요합니다. 설치할까요? + + 삼성 인앱결제에 입력한 값이 바르지 않습니다. + + 대기 중\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..a3570cb --- /dev/null +++ b/IAP5Helper/src/main/res/values-ky-rKG/strings.xml @@ -0,0 +1,38 @@ + + + + Белгисиз ката пайда болду + + 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..3fdfd23 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lo-rLA/strings.xml @@ -0,0 +1,38 @@ + + + + ເກີດຄວາມຜິດພາດບໍ່ຮູ້ຈັກຂຶ້ນ. + + 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..32efeb6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lt/strings.xml @@ -0,0 +1,38 @@ + + + + Į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..891a0d9 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lv/strings.xml @@ -0,0 +1,38 @@ + + + + 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..0fe060b --- /dev/null +++ b/IAP5Helper/src/main/res/values-mg/strings.xml @@ -0,0 +1,38 @@ + + + + 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..64c0ef7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-mk-rMK/strings.xml @@ -0,0 +1,38 @@ + + + + Дојде до непозната грешка. + + 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..dd68903 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ml-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + അജ്ഞാത പിശക് സംഭവിച്ചു. + + സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ + + സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ തുറക്കാനാവില്ല. അനുമതികൾ എന്നതിലേക്ക് പോവുക, തുടർന്ന് ആവശ്യമായ അനുമതികൾ അനുവദിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക. + + ഇനങ്ങള്‍ വാങ്ങുന്നതിന്, നിങ്ങള്‍ സാംസംഗ് ഇന്‍-ആപ്ലിക്കേഷന്‍ പര്‍ച്ചെയ്സ് ഇന്‍സ്റ്റാള്‍ ചെയ്യേണ്ടതുണ്ട്. ഇന്‍സ്റ്റാള്‍ ചെയ്യണോ? + + സാംസംഗ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങലിന് ലഭ്യമാക്കിയത് അസാധുവായ ഒരു മൂല്യമാണ്. + + കാക്കുന്നു\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..b036631 --- /dev/null +++ b/IAP5Helper/src/main/res/values-mn-rMN/strings.xml @@ -0,0 +1,38 @@ + + + + Үл мэдэх алдаа гарав + + 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..86f9b9d --- /dev/null +++ b/IAP5Helper/src/main/res/values-mr-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + अज्ञात त्रुटी आली. + + सॅमसंग इन-ऍप खरेदी + + सॅमसंग इन-ऍप पर्चेस उघडण्यात अक्षम. परवानग्यांवर जा, नंतर आवश्यक परवानग्‍यांना अनुमती द्या आणि पुन्‍हा प्रयत्‍न करा. + + आयटेम्स खरेदी करण्यासाठी, आपण सॅमसंग इन-ऍप पर्चेस इन्स्टॉल करणे गरजेचे आहे. इन्स्टॉल करायचे? + + सॅमसंग इन-ऍप पर्चेससाठी एक अग्राह्य मूल्य पुरवले गेले आहे. + + प्रतीक्षा करत आहे\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..3e997b1 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ms-rMY/strings.xml @@ -0,0 +1,38 @@ + + + + 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..00dc296 --- /dev/null +++ b/IAP5Helper/src/main/res/values-my-rMM/strings.xml @@ -0,0 +1,38 @@ + + + + မသိသော အမှား ဖြစ်သွားသည်။ + + 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..af5b20a --- /dev/null +++ b/IAP5Helper/src/main/res/values-my-rZG/strings.xml @@ -0,0 +1,38 @@ + + + + မသိရေသာ အမွား ျဖစ္ပြားသည္။ + + 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..c46b706 --- /dev/null +++ b/IAP5Helper/src/main/res/values-nb/strings.xml @@ -0,0 +1,38 @@ + + + + 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..6e3863d --- /dev/null +++ b/IAP5Helper/src/main/res/values-ne-rNP/strings.xml @@ -0,0 +1,38 @@ + + + + अज्ञात त्रुटि देखियो। + + सैमसंग इन-एप खरिद + + सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्। + + वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने? + + सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ। + + प्रतीक्षा गर्दै\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..6e3863d --- /dev/null +++ b/IAP5Helper/src/main/res/values-ne/strings.xml @@ -0,0 +1,38 @@ + + + + अज्ञात त्रुटि देखियो। + + सैमसंग इन-एप खरिद + + सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्। + + वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने? + + सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ। + + प्रतीक्षा गर्दै\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..fa93fb9 --- /dev/null +++ b/IAP5Helper/src/main/res/values-nl/strings.xml @@ -0,0 +1,38 @@ + + + + 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..22027e5 --- /dev/null +++ b/IAP5Helper/src/main/res/values-or/strings.xml @@ -0,0 +1,38 @@ + + + + ଅଜଣା ତ୍ରୁଟି ଘଟିଛି। + + ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ + + ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ ଖୋଲିବାକୁ ଅସମର୍ଥ। ଅନୁମତିଗୁଡିକୁ ଯାଆନ୍ତୁ, ତାପରେ ଆବଶ୍ୟକୀୟ ଅନୁମତିଗୁଡିକ ଅନୁମତି ଦିଅନ୍ତୁ ଏବଂ ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ। + + ଆଇଟମ୍ କ୍ରୟ କରିବାକୁ, ଆପଣ ସାମ୍‌ସଙ୍ଗ ଇନ୍-ଆପ୍ କ୍ରୟସଂସ୍ଥାପନ କରିବା ଆବଶ୍ୟକ କରନ୍ତି। ସଂସ୍ଥାପନ କରିବେ? + + 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..b2c1555 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pa-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + ਅਗਿਆਤ ਤਰੁੱਟੀ ਉਤਪੰਨ ਹੋਈ। + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਖਰੀਦਦਾਰੀ + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਭੁਗਤਾਨ ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਮਰੱਥ। ਅਨੁਮਤੀਆਂ ਤੇ ਜਾਉ, ਫਿਰ ਲੋੜੀਂਦੀਆਂ ਅਨੁਮਤੀਆਂ ਨੂੰ ਆਗਿਆ ਦਿਉ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। + + ਆਈਟਮ ਖਰੀਦਣ ਦੇ ਲਈ, ਤੁਹਾਨੂੰ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਸਥਾਪਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਸਥਾਪਿਤ ਕਰੋ? + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਦੇ ਲਈ ਇੱਕ ਅਵੈਧ ਮਾਨ ਪ੍ਰਦਾਨ ਕੀਤਾ ਗਿਆ ਹੈ। + + ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ\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..6b9ba11 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pl-rSP/strings.xml @@ -0,0 +1,38 @@ + + + + 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..79fec71 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pl/strings.xml @@ -0,0 +1,38 @@ + + + + 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..f4f80e9 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,38 @@ + + + + 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..3baef40 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,38 @@ + + + + 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..f388afb --- /dev/null +++ b/IAP5Helper/src/main/res/values-ro/strings.xml @@ -0,0 +1,38 @@ + + + + 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..3287f0c --- /dev/null +++ b/IAP5Helper/src/main/res/values-ru/strings.xml @@ -0,0 +1,38 @@ + + + + Возникла неизвестная ошибка. + + 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..9a565ec --- /dev/null +++ b/IAP5Helper/src/main/res/values-si-rLK/strings.xml @@ -0,0 +1,38 @@ + + + + නොදන්නා දෝෂයක් ඇතිවිය. + + සැම්සුං අ.-යෙදුම් මි. ගැ. + + සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්‍ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න. + + අයිතම මිල දී ගැනීමට ඔබ 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..9a565ec --- /dev/null +++ b/IAP5Helper/src/main/res/values-si/strings.xml @@ -0,0 +1,38 @@ + + + + නොදන්නා දෝෂයක් ඇතිවිය. + + සැම්සුං අ.-යෙදුම් මි. ගැ. + + සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්‍ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න. + + අයිතම මිල දී ගැනීමට ඔබ 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..bf0b21a --- /dev/null +++ b/IAP5Helper/src/main/res/values-sk/strings.xml @@ -0,0 +1,38 @@ + + + + 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..c7b7fed --- /dev/null +++ b/IAP5Helper/src/main/res/values-sl/strings.xml @@ -0,0 +1,38 @@ + + + + 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..70f6f23 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sq-rAL/strings.xml @@ -0,0 +1,38 @@ + + + + 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..3a5a464 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sr/strings.xml @@ -0,0 +1,38 @@ + + + + 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..a9980e1 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sv/strings.xml @@ -0,0 +1,38 @@ + + + + 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..611005c --- /dev/null +++ b/IAP5Helper/src/main/res/values-ta-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + தெரியாத பிழை ஏற்பட்டுள்ளது. + + சாம்சங் இன்-ஆப் வாங்குதல் + + சாம்சங் இன்-ஆப் வாங்குதலை திறக்க இயலவில்லை. அனுமதிகள் என்பதற்குச் சென்று, பிறகு தேவையான அனுமதிகளை அனுமதித்து, மீண்டும் முயலவும். + + உருப்படிகளை வாங்க சாம்சங் உள்-ப.பாட்டு வாங்குதலை நீங்கள் நிறுவ வேண்டும். நிறுவவா? + + சாம்சங் பயன்பாட்டுக்கு உள்ளான வாங்குதலுக்கு ஒரு தவறான மதிப்பு வழங்கப்பட்டது. + + காத்திருக்கிறது\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..606f140 --- /dev/null +++ b/IAP5Helper/src/main/res/values-te-rIN/strings.xml @@ -0,0 +1,38 @@ + + + + తెలియని లోపం ఏర్పడింది. + + స్యామ్‌సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు + + స్యామ్‌సంగ్ ఇన్-యాప్ కొనుగోలును తెరవడం సాధ్యం కాదు. అనుమతులకు వెళ్లి, ఆపై అవసరమైన అనుమతులను అనుమతించి, మళ్లీ ప్రయత్నించండి. + + ఐటెమ్‌లను కొనుగోలు చేయడానికి, మీరు స్యామ్‌సంగ్ ఇన్-యాప్ కొనుగోలును వ్యవస్థాపించాలి. వ్యవస్థాపించాలా? + + స్యామ్‌సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు కోసం చెల్లని విలువ అందించబడింది. + + వేచి ఉంది\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..9d973e3 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tg/strings.xml @@ -0,0 +1,38 @@ + + + + Хатогии номаълум ба амал омад + + 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..06839f7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-th/strings.xml @@ -0,0 +1,38 @@ + + + + เกิด​ข้อ​ผิด​พลาด​ที่​ไม่​รู้จัก + + การสั่งซื้อในแอพของ 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..148b497 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tk/strings.xml @@ -0,0 +1,38 @@ + + + + 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..c0bbe03 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tl/strings.xml @@ -0,0 +1,38 @@ + + + + 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..9901266 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tr/strings.xml @@ -0,0 +1,38 @@ + + + + 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..84107e2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-uk/strings.xml @@ -0,0 +1,38 @@ + + + + Сталася невідома помилка. + + 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..a2b484e --- /dev/null +++ b/IAP5Helper/src/main/res/values-ur-rPK/strings.xml @@ -0,0 +1,38 @@ + + + + نامعلوم غلطی واقع ہوگئی + + ‏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..1bfbeb3 --- /dev/null +++ b/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml @@ -0,0 +1,38 @@ + + + + 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..da2e111 --- /dev/null +++ b/IAP5Helper/src/main/res/values-vi/strings.xml @@ -0,0 +1,38 @@ + + + + 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..b23c67d --- /dev/null +++ b/IAP5Helper/src/main/res/values-xh/strings.xml @@ -0,0 +1,38 @@ + + + + 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..28838a6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,38 @@ + + + + 未知错误产生 + + 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..3e74062 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,38 @@ + + + + 發生未知錯誤。 + + 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..e633e15 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,38 @@ + + + + 已發生未知錯誤。 + + 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..d4610ea --- /dev/null +++ b/IAP5Helper/src/main/res/values-zu/strings.xml @@ -0,0 +1,38 @@ + + + + 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..f621fd2 --- /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 5f505b4..4700ba6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -77,13 +77,16 @@ android { buildConfigField "boolean", "ENABLE_CUSTOM_CSS", "false" } } - flavorDimensions "freedom" + flavorDimensions "platform" productFlavors { - play {} free { applicationIdSuffix ".free" versionNameSuffix "-free" } + play {} + samsung { + applicationId "com.wbrawner.simplemarkdown.samsung" + } } dexOptions { jumboMode true @@ -97,6 +100,7 @@ android { } dependencies { + samsungImplementation project(":IAP5Helper") implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2' implementation 'androidx.navigation:navigation-ui-ktx:2.2.2' testImplementation 'junit:junit:4.12' diff --git a/settings.gradle b/settings.gradle index 9d495b3..6d5f6c6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ -include ':app' \ No newline at end of file +include ':app' +include ':IAP5Helper' \ No newline at end of file