From d92c4cb762ecbd397cab34be9a6024ff9f6b61e7 Mon Sep 17 00:00:00 2001 From: Billy Brawner Date: Sat, 23 Dec 2017 19:24:55 -0600 Subject: [PATCH] Add Samsung build flavor --- .gitignore | 4 + .idea/vcs.xml | 6 - IAP5Helper/build.gradle | 20 + IAP5Helper/proguard-rules.pro | 17 + IAP5Helper/src/main/AndroidManifest.xml | 34 + .../com/samsung/android/iap/IAPConnector.aidl | 17 + .../android/iap/IAPServiceCallback.aidl | 7 + .../sdk/iap/lib/activity/BaseActivity.java | 272 ++++++++ .../ConsumePurchasedItemsActivity.java | 136 ++++ .../lib/activity/OwnedProductActivity.java | 141 ++++ .../sdk/iap/lib/activity/PaymentActivity.java | 324 +++++++++ .../sdk/iap/lib/activity/ProductActivity.java | 107 +++ .../sdk/iap/lib/helper/HelperDefine.java | 159 +++++ .../iap/lib/helper/HelperListenerManager.java | 113 ++++ .../sdk/iap/lib/helper/HelperUtil.java | 241 +++++++ .../android/sdk/iap/lib/helper/IapHelper.java | 631 ++++++++++++++++++ .../sdk/iap/lib/helper/task/BaseTask.java | 159 +++++ .../task/ConsumePurchasedItemsTask.java | 120 ++++ .../iap/lib/helper/task/GetOwnedListTask.java | 120 ++++ .../helper/task/GetProductsDetailsTask.java | 122 ++++ .../OnConsumePurchasedItemsListener.java | 22 + .../lib/listener/OnGetOwnedListListener.java | 22 + .../OnGetProductsDetailsListener.java | 22 + .../iap/lib/listener/OnIapBindListener.java | 13 + .../iap/lib/listener/OnPaymentListener.java | 16 + .../android/sdk/iap/lib/vo/BaseVo.java | 167 +++++ .../android/sdk/iap/lib/vo/ConsumeVo.java | 80 +++ .../android/sdk/iap/lib/vo/ErrorVo.java | 45 ++ .../sdk/iap/lib/vo/OwnedProductVo.java | 116 ++++ .../android/sdk/iap/lib/vo/ProductVo.java | 128 ++++ .../android/sdk/iap/lib/vo/PurchaseVo.java | 159 +++++ .../sdk/iap/lib/vo/VerificationVo.java | 132 ++++ ...w_widget_progressbar_effect_holo_light.png | Bin 0 -> 3462 bytes .../tw_widget_progressbar_holo_light.png | Bin 0 -> 5042 bytes ...w_widget_progressbar_effect_holo_light.png | Bin 0 -> 3462 bytes .../tw_widget_progressbar_holo_light.png | Bin 0 -> 5042 bytes ...w_widget_progressbar_effect_holo_light.png | Bin 0 -> 4351 bytes .../tw_widget_progressbar_holo_light.png | Bin 0 -> 4466 bytes ...w_widget_progressbar_effect_holo_light.png | Bin 0 -> 6121 bytes .../tw_widget_progressbar_holo_light.png | Bin 0 -> 7152 bytes .../res/drawable/dialog_full_holo_light.9.png | Bin 0 -> 2237 bytes .../main/res/drawable/progressbar_middle.xml | 19 + ...w_widget_progressbar_effect_holo_light.png | Bin 0 -> 3462 bytes .../tw_widget_progressbar_holo_light.png | Bin 0 -> 5042 bytes .../src/main/res/layout/progress_dialog.xml | 32 + IAP5Helper/src/main/res/values-ar/strings.xml | 39 ++ IAP5Helper/src/main/res/values-as/strings.xml | 39 ++ .../src/main/res/values-az-rAZ/strings.xml | 39 ++ .../src/main/res/values-be-rBY/strings.xml | 39 ++ IAP5Helper/src/main/res/values-bg/strings.xml | 39 ++ .../src/main/res/values-bn-rBD/strings.xml | 39 ++ .../src/main/res/values-bn-rIN/strings.xml | 39 ++ IAP5Helper/src/main/res/values-bo/strings.xml | 39 ++ IAP5Helper/src/main/res/values-bs/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ca/strings.xml | 39 ++ IAP5Helper/src/main/res/values-cs/strings.xml | 39 ++ IAP5Helper/src/main/res/values-da/strings.xml | 39 ++ IAP5Helper/src/main/res/values-de/strings.xml | 39 ++ IAP5Helper/src/main/res/values-el/strings.xml | 39 ++ .../src/main/res/values-en-rCA/strings.xml | 39 ++ .../src/main/res/values-en-rPH/strings.xml | 39 ++ .../src/main/res/values-en-rUS/strings.xml | 39 ++ .../src/main/res/values-en-rZG/strings.xml | 39 ++ IAP5Helper/src/main/res/values-en/strings.xml | 39 ++ .../src/main/res/values-es-rES/strings.xml | 39 ++ .../src/main/res/values-es-rUS/strings.xml | 39 ++ .../src/main/res/values-et-rEE/strings.xml | 39 ++ .../src/main/res/values-eu-rES/strings.xml | 39 ++ IAP5Helper/src/main/res/values-fa/strings.xml | 39 ++ IAP5Helper/src/main/res/values-fi/strings.xml | 39 ++ .../src/main/res/values-fr-rCA/strings.xml | 39 ++ IAP5Helper/src/main/res/values-fr/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ga/strings.xml | 39 ++ .../src/main/res/values-gl-rES/strings.xml | 39 ++ .../src/main/res/values-gu-rIN/strings.xml | 39 ++ IAP5Helper/src/main/res/values-hi/strings.xml | 39 ++ IAP5Helper/src/main/res/values-hr/strings.xml | 39 ++ IAP5Helper/src/main/res/values-hu/strings.xml | 39 ++ .../src/main/res/values-hy-rAM/strings.xml | 39 ++ IAP5Helper/src/main/res/values-in/strings.xml | 39 ++ .../src/main/res/values-is-rIS/strings.xml | 39 ++ IAP5Helper/src/main/res/values-it/strings.xml | 39 ++ IAP5Helper/src/main/res/values-iw/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ja/strings.xml | 39 ++ .../src/main/res/values-ka-rGE/strings.xml | 39 ++ .../src/main/res/values-kk-rKZ/strings.xml | 39 ++ .../src/main/res/values-km-rKH/strings.xml | 39 ++ .../src/main/res/values-kn-rIN/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ko/strings.xml | 39 ++ .../src/main/res/values-ky-rKG/strings.xml | 39 ++ .../src/main/res/values-lo-rLA/strings.xml | 39 ++ IAP5Helper/src/main/res/values-lt/strings.xml | 39 ++ IAP5Helper/src/main/res/values-lv/strings.xml | 39 ++ IAP5Helper/src/main/res/values-mg/strings.xml | 39 ++ .../src/main/res/values-mk-rMK/strings.xml | 39 ++ .../src/main/res/values-ml-rIN/strings.xml | 39 ++ .../src/main/res/values-mn-rMN/strings.xml | 39 ++ .../src/main/res/values-mr-rIN/strings.xml | 39 ++ .../src/main/res/values-ms-rMY/strings.xml | 39 ++ .../src/main/res/values-my-rMM/strings.xml | 39 ++ .../src/main/res/values-my-rZG/strings.xml | 39 ++ IAP5Helper/src/main/res/values-nb/strings.xml | 39 ++ .../src/main/res/values-ne-rNP/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ne/strings.xml | 39 ++ IAP5Helper/src/main/res/values-nl/strings.xml | 39 ++ IAP5Helper/src/main/res/values-or/strings.xml | 39 ++ .../src/main/res/values-pa-rIN/strings.xml | 39 ++ .../src/main/res/values-pl-rSP/strings.xml | 39 ++ IAP5Helper/src/main/res/values-pl/strings.xml | 39 ++ .../src/main/res/values-pt-rBR/strings.xml | 39 ++ .../src/main/res/values-pt-rPT/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ro/strings.xml | 39 ++ IAP5Helper/src/main/res/values-ru/strings.xml | 39 ++ .../src/main/res/values-si-rLK/strings.xml | 39 ++ IAP5Helper/src/main/res/values-si/strings.xml | 39 ++ IAP5Helper/src/main/res/values-sk/strings.xml | 39 ++ IAP5Helper/src/main/res/values-sl/strings.xml | 39 ++ .../src/main/res/values-sq-rAL/strings.xml | 39 ++ IAP5Helper/src/main/res/values-sr/strings.xml | 39 ++ IAP5Helper/src/main/res/values-sv/strings.xml | 39 ++ .../src/main/res/values-ta-rIN/strings.xml | 39 ++ .../src/main/res/values-te-rIN/strings.xml | 39 ++ IAP5Helper/src/main/res/values-tg/strings.xml | 39 ++ IAP5Helper/src/main/res/values-th/strings.xml | 39 ++ IAP5Helper/src/main/res/values-tk/strings.xml | 39 ++ IAP5Helper/src/main/res/values-tl/strings.xml | 39 ++ IAP5Helper/src/main/res/values-tr/strings.xml | 39 ++ IAP5Helper/src/main/res/values-uk/strings.xml | 39 ++ .../src/main/res/values-ur-rPK/strings.xml | 39 ++ .../src/main/res/values-uz-rUZ/strings.xml | 39 ++ IAP5Helper/src/main/res/values-vi/strings.xml | 39 ++ IAP5Helper/src/main/res/values-xh/strings.xml | 39 ++ .../src/main/res/values-zh-rCN/strings.xml | 39 ++ .../src/main/res/values-zh-rHK/strings.xml | 39 ++ .../src/main/res/values-zh-rTW/strings.xml | 39 ++ IAP5Helper/src/main/res/values-zu/strings.xml | 39 ++ IAP5Helper/src/main/res/values/dimen.xml | 4 + IAP5Helper/src/main/res/values/strings.xml | 19 + IAP5Helper/src/main/res/values/styles.xml | 40 ++ app/build.gradle | 61 +- app/proguard-rules.pro | 5 + app/src/samsung/AndroidManifest.xml | 6 + settings.gradle | 1 + 143 files changed, 7380 insertions(+), 28 deletions(-) delete mode 100644 .idea/vcs.xml create mode 100644 IAP5Helper/build.gradle create mode 100644 IAP5Helper/proguard-rules.pro create mode 100644 IAP5Helper/src/main/AndroidManifest.xml create mode 100644 IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPConnector.aidl create mode 100644 IAP5Helper/src/main/aidl/com/samsung/android/iap/IAPServiceCallback.aidl create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/BaseActivity.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ConsumePurchasedItemsActivity.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/OwnedProductActivity.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/PaymentActivity.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/activity/ProductActivity.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperDefine.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperListenerManager.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/HelperUtil.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/IapHelper.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/BaseTask.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/ConsumePurchasedItemsTask.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetOwnedListTask.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/helper/task/GetProductsDetailsTask.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnConsumePurchasedItemsListener.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetOwnedListListener.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnGetProductsDetailsListener.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnIapBindListener.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/listener/OnPaymentListener.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/BaseVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ConsumeVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ErrorVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/OwnedProductVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/ProductVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/PurchaseVo.java create mode 100644 IAP5Helper/src/main/java/com/samsung/android/sdk/iap/lib/vo/VerificationVo.java create mode 100644 IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_effect_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-hdpi/tw_widget_progressbar_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_effect_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-mdpi/tw_widget_progressbar_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_effect_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-xhdpi/tw_widget_progressbar_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_effect_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable-xxhdpi/tw_widget_progressbar_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable/dialog_full_holo_light.9.png create mode 100644 IAP5Helper/src/main/res/drawable/progressbar_middle.xml create mode 100644 IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png create mode 100644 IAP5Helper/src/main/res/drawable/tw_widget_progressbar_holo_light.png create mode 100644 IAP5Helper/src/main/res/layout/progress_dialog.xml create mode 100644 IAP5Helper/src/main/res/values-ar/strings.xml create mode 100644 IAP5Helper/src/main/res/values-as/strings.xml create mode 100644 IAP5Helper/src/main/res/values-az-rAZ/strings.xml create mode 100644 IAP5Helper/src/main/res/values-be-rBY/strings.xml create mode 100644 IAP5Helper/src/main/res/values-bg/strings.xml create mode 100644 IAP5Helper/src/main/res/values-bn-rBD/strings.xml create mode 100644 IAP5Helper/src/main/res/values-bn-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-bo/strings.xml create mode 100644 IAP5Helper/src/main/res/values-bs/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ca/strings.xml create mode 100644 IAP5Helper/src/main/res/values-cs/strings.xml create mode 100644 IAP5Helper/src/main/res/values-da/strings.xml create mode 100644 IAP5Helper/src/main/res/values-de/strings.xml create mode 100644 IAP5Helper/src/main/res/values-el/strings.xml create mode 100644 IAP5Helper/src/main/res/values-en-rCA/strings.xml create mode 100644 IAP5Helper/src/main/res/values-en-rPH/strings.xml create mode 100644 IAP5Helper/src/main/res/values-en-rUS/strings.xml create mode 100644 IAP5Helper/src/main/res/values-en-rZG/strings.xml create mode 100644 IAP5Helper/src/main/res/values-en/strings.xml create mode 100644 IAP5Helper/src/main/res/values-es-rES/strings.xml create mode 100644 IAP5Helper/src/main/res/values-es-rUS/strings.xml create mode 100644 IAP5Helper/src/main/res/values-et-rEE/strings.xml create mode 100644 IAP5Helper/src/main/res/values-eu-rES/strings.xml create mode 100644 IAP5Helper/src/main/res/values-fa/strings.xml create mode 100644 IAP5Helper/src/main/res/values-fi/strings.xml create mode 100644 IAP5Helper/src/main/res/values-fr-rCA/strings.xml create mode 100644 IAP5Helper/src/main/res/values-fr/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ga/strings.xml create mode 100644 IAP5Helper/src/main/res/values-gl-rES/strings.xml create mode 100644 IAP5Helper/src/main/res/values-gu-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-hi/strings.xml create mode 100644 IAP5Helper/src/main/res/values-hr/strings.xml create mode 100644 IAP5Helper/src/main/res/values-hu/strings.xml create mode 100644 IAP5Helper/src/main/res/values-hy-rAM/strings.xml create mode 100644 IAP5Helper/src/main/res/values-in/strings.xml create mode 100644 IAP5Helper/src/main/res/values-is-rIS/strings.xml create mode 100644 IAP5Helper/src/main/res/values-it/strings.xml create mode 100644 IAP5Helper/src/main/res/values-iw/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ja/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ka-rGE/strings.xml create mode 100644 IAP5Helper/src/main/res/values-kk-rKZ/strings.xml create mode 100644 IAP5Helper/src/main/res/values-km-rKH/strings.xml create mode 100644 IAP5Helper/src/main/res/values-kn-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ko/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ky-rKG/strings.xml create mode 100644 IAP5Helper/src/main/res/values-lo-rLA/strings.xml create mode 100644 IAP5Helper/src/main/res/values-lt/strings.xml create mode 100644 IAP5Helper/src/main/res/values-lv/strings.xml create mode 100644 IAP5Helper/src/main/res/values-mg/strings.xml create mode 100644 IAP5Helper/src/main/res/values-mk-rMK/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ml-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-mn-rMN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-mr-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ms-rMY/strings.xml create mode 100644 IAP5Helper/src/main/res/values-my-rMM/strings.xml create mode 100644 IAP5Helper/src/main/res/values-my-rZG/strings.xml create mode 100644 IAP5Helper/src/main/res/values-nb/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ne-rNP/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ne/strings.xml create mode 100644 IAP5Helper/src/main/res/values-nl/strings.xml create mode 100644 IAP5Helper/src/main/res/values-or/strings.xml create mode 100644 IAP5Helper/src/main/res/values-pa-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-pl-rSP/strings.xml create mode 100644 IAP5Helper/src/main/res/values-pl/strings.xml create mode 100644 IAP5Helper/src/main/res/values-pt-rBR/strings.xml create mode 100644 IAP5Helper/src/main/res/values-pt-rPT/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ro/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ru/strings.xml create mode 100644 IAP5Helper/src/main/res/values-si-rLK/strings.xml create mode 100644 IAP5Helper/src/main/res/values-si/strings.xml create mode 100644 IAP5Helper/src/main/res/values-sk/strings.xml create mode 100644 IAP5Helper/src/main/res/values-sl/strings.xml create mode 100644 IAP5Helper/src/main/res/values-sq-rAL/strings.xml create mode 100644 IAP5Helper/src/main/res/values-sr/strings.xml create mode 100644 IAP5Helper/src/main/res/values-sv/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ta-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-te-rIN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-tg/strings.xml create mode 100644 IAP5Helper/src/main/res/values-th/strings.xml create mode 100644 IAP5Helper/src/main/res/values-tk/strings.xml create mode 100644 IAP5Helper/src/main/res/values-tl/strings.xml create mode 100644 IAP5Helper/src/main/res/values-tr/strings.xml create mode 100644 IAP5Helper/src/main/res/values-uk/strings.xml create mode 100644 IAP5Helper/src/main/res/values-ur-rPK/strings.xml create mode 100644 IAP5Helper/src/main/res/values-uz-rUZ/strings.xml create mode 100644 IAP5Helper/src/main/res/values-vi/strings.xml create mode 100644 IAP5Helper/src/main/res/values-xh/strings.xml create mode 100644 IAP5Helper/src/main/res/values-zh-rCN/strings.xml create mode 100644 IAP5Helper/src/main/res/values-zh-rHK/strings.xml create mode 100644 IAP5Helper/src/main/res/values-zh-rTW/strings.xml create mode 100644 IAP5Helper/src/main/res/values-zu/strings.xml create mode 100644 IAP5Helper/src/main/res/values/dimen.xml create mode 100644 IAP5Helper/src/main/res/values/strings.xml create mode 100644 IAP5Helper/src/main/res/values/styles.xml create mode 100644 app/src/samsung/AndroidManifest.xml diff --git a/.gitignore b/.gitignore index f237317..06c21f0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,10 @@ /.idea/libraries .DS_Store /build +IAP5Helper/build /captures .externalNativeBuild .idea/ +app/standard +app/samsung +*~ diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/IAP5Helper/build.gradle b/IAP5Helper/build.gradle new file mode 100644 index 0000000..99645d8 --- /dev/null +++ b/IAP5Helper/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.android.library' +android { + compileSdkVersion 23 + buildToolsVersion '26.0.2' + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 15 + } + + 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..4c863a8 --- /dev/null +++ b/IAP5Helper/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + \ 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 0000000000000000000000000000000000000000..f8e90af625e08d13a7c418582e7f1239de90bbde GIT binary patch literal 3462 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f8e90af625e08d13a7c418582e7f1239de90bbde GIT binary patch literal 3462 zcmaJ^cT`j9z718n2&fd55Kw6$jZgx}KnP8u5duL(5+osnl7u9XfS0C%FiMG_fS?Z2 zMU)~%q>V5Xr4C(DDHjl_Dkvh#3vPjfxMtVIvd5a0R5$l63lnDAt2yi5Ke#v z=s!-mV{t$QBWxG?+YZb z#v=QooNa9Xwk23ufc!WdCJF-Ka=8XvgaLy^g}_WrO?NclaIgRYW{1%^-aIg!t@%U2 zhQjt?(U=?>gAUwL^ghQ3;aGqKp8h9>XXe<`xKxcEj={^((8w-$tZ$P7wQ6|<5Dxk`F&p!{O@B~_sBfD*wa zu|G7cKxd((c(~0bG2klfh7I;tN8BmrvuEXFC}E{aar_t+Qgq~Hi-Ga$mk}+1F)ZT) z<@*;RyXpMvxg>I6VAt|XxYqX3k6554-`;l(UjO_U0)e<+SZFu&=8ZbZP<5|I>99z; z?R;HBL&L4Y!ouPH{!`OaQ-3O`sl8-=__u>>BsWmJiDm}pdDVHhh`XZEXy<@{fOy+n zl~$VUZ(^H5BBZ<#5xHpT32|O@Ho?!Y=yh-J3Zg#u-lIo&stznGMMGg>xb#YdKy35M ze#m0*y}f?B!ZSqqs^>ttTNz3zLagQl2Qa`IsAG9e$^O-gCtSwE$9avuN7nujWw%!a zjEpNPC`87!fJn$P`PE5D50ICRqLjEo%z@pzlc$gY!(`GiIJ+~0#3y$gaddQiYT#AB zF+Dpw+Z+5&rBCQ>^q$7<#`5y_Pgsx5$HvA^V-+qXie9~Xbxr77v@eghF_4s$^scqF z^+Y%r60JEQdr26Ua&6$Y#rYn_o5l!_tP00&zx?5c#HPjB?yUC@y&5)+Peh1wL|WGT zLPFNh?Af#D%=oKUsnD>BRHF$?r!;&L{*+LyNF zQT*}aN6WDq22pR;$X^j&+pYr!2c4x*@)3>0!inac{c6T^QR^AU`uck7RdfDU+EU?u zW%)&0(C8JtlP2Q!eGBW$K({^0${U2n^aHW`&wgHC$7*Y97n$%@N#Dqq^ea@d)6pO` z`#VC&iNFs|xI!>4Q@XZLl(&l~&D01nM2{R4iXustsccBlw;0@&*NL;A2h7Z4(k3P* zZq3ZhtkF9;MhLJRFuawFRk_rN26EG}+|Jcw#8d50SN z^|aNqn8Vi-N$2lZSBEzI5`UnDRl8*F$*qpNy726}UQ|+xmXW6_yl5X^Tl}28SWsqC z-(A4%W~qz6uTn2XGP6?_-!xe&#B?{qY>ki3ZxLXz6<5qUJ3IAE zGMq_Ebs-CGYz!uLb6p-9BeOQBeyZ_uu9<~Cu^~L9;NnHJY*JIULmgdA)5)t=i>Q)B#v z(~Up9a3Jy6plPY#$SlY}cluf0x1u?gAJLpPM4|jAoVeLCsmd91USi#LPe{KDLqdD= zkZ9Dc9!$KIVn+wAL`EX^hD;k(NsD59G8CPvZbMsoO7^?j-15u>k&!0j8k=j~O;0Xj zD0OttDaQ=k$C@VVDoK5v4{YmcZ@0VO&@Rti)W5$#4KhR`=P`3)W(xZwg){jnDe}gX zTN3^eW<9;LA-}1H*tos~e^SNWjlu?a9Yu&nEo(SMO6W9sX$#F#aEyhDfmaWS*t^yf1r2E@j#2zH%8 zf7lWb&##c*9 zO5PNPDk0UngZyv=c*%nY%jle&xsgMkCze99&A0|kqqE46$PXVrR0P}K8U&=4k~GqR zJZFeC#RJFgNYRwY|E{dttDmD{XH+Tk`#XZ*g=AG}6+dWVY|KqeO;vQjP^2Vvbaa;E zxlM()RevjcBx&C;p_MnLezuN7*=}PJI1D>lIdlGZyOYJnZ9a$J@7Wtp~AYqoX3Rf#^?b^8*KKSJ3qP&kF;xn}Va_WE1_DWCo2g?e)H= z-MHcQ-1J)Q%Y54cTQ$l1bt6^78i+1Ofqf=8PKh z#Lc37Q4T9jJ?B>3bbE3XAf%xESWbj`eLLw&_mK+ecQ5qS4juZgA@e@i-F=kkbnw6@ z-fbsT^vYrCq%b;kb#2Y?x3Y?sN;&2ij^&aK_x-=kYVAg-FVgC`D_;89U0-?2rj6T* zMJ?lNE?wPl_=QUyZc{O?f-eSjhqnnE8yo&NuGJzRkS-)`=}^z8O?44^9dc=e@PA3m z_rC^fYWh5BYT8yP#)m7;>Biic-wbhM+^XE4!$bE(SF8P5_Ger=g!uhnIPtJsL;(RV zx$D@W$)WwS_zO19nHd=yE=5%FXQ3|~^DKIfYQefXH{wiB+u1Jut0JvqL0?>9*REX+ z8l|eEu7~}T{k1M{&W9_ludnwPO{U^f^K$!~r)t!vw<0ErUlF#C_GJx7RgYO3nw-?! zB`<2jl*7CP#>5Yz$kh>LsRk~)g;vsiX1c|k=593I%qWY zLPA*OVEvd*ZN*K#lKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000QxNkl1)(KW2;H(04es7K|9+S` zGiT=BeMz#P#DUo}Gk13G^E=PWd7fvkZ1Z8+GCoAxhYDuFbRRtR*1HISgao9=5-JY* zUW?~QLxO>W-?@JXaa!mc@H*0D@kBxS?BYA>OQ}n*RV`_X0Ue=pEoUz?-I> z2{&lQr!%4SOkydpAM}s4-`F}duQ0tpUTkv&v)yK4sVM5v*nSbb6}$rYR4MN#%5ed( zLU0q}S>Q|z04bWpGT_y$=+?xn~|U(*U~M<|XhoE^VkBbMQXfS7LVAoSBQ; zR2nG$z96^`xEVAi(on4q;^`aj*mlpnXvX${?PDcS=??}oj`@4_K}_uhEtcW=1308jw^9Q&%&v~0$(ud{tTI*k*EBI?Z)$)b?;Vp*Em zS;PjRJqZX%9l?S1cWxiL7|m?5eM`$n#%zDl_E-& zH9#6f9N4h=(awcvX3+MN6-Y3IFyRo^5yBa#0iX?)0`*mo8onOWB_*cy=U;t)8`9yJ zQk8csLu|Pa&D?8yNd@A7?b}MtKnN8;3Kg>jS5dH+MF~_hpM#e0w<1Or?<;QF@#VX| zw|LGlkN^EY19rGKg17)VYWq+FAOZz9!D{D8wA2C;O$}8hR-59{U+$a`x}!=)3*Q<< z+A?Pt+qYm3L=f!U!S@r4Lnt6hkQyiyP@$=%{sFnxMx5~)M9EqMM}D#6Wuc?BWPJtX%OnL`33H3L8?Sn3ZIR4ae`)6X7#Mbc>MXA&D{g>eY0 zZFefC51z2YNJH?v+(RH#=Q+;v;=I~prckdfadwM6Ywf9{x0RzqN{d2t!|X8ja)-oR zLU`H1dF>OS5;#;)c@rovK8t2o`AdYzR12TA;fk>j%?OE!N?P`nyLWYFEY55XDK47D zLrzg2*JBxBETJHj1>_9bC<0_colfE}8Ok!UL=!#b_B6$v(5a@mvJkieczgN)5W>>b zsU5;t?Gw?=;_OFFJp}=2$PfKQ(c_rr3@KaCnL)`)vl~VmX%yllXUYE)D-siF_Kf`!U>6j+rA zJyg$pqJ>uJT)~t9A)o4!PfilL-NI)&9lYR@La1B>#Ra&Cele$0I$_B+eBX~QM_Md5 z0^XamY39wA;4AxgYx;nMP(`-Tog#F*gb>OwouN*L%%O682lWD}e{w46TACnd4m|b1 z_-sCNq9y#bz+$`frM?hxj3K*A=oY4wu2ET*;jDvPtO*8!K`~R1`)An&%$ip4IWd9uqR*tGSTAxXQ_Dpcac@1MAL4>C(WCC)eyUxEmQ)uHZ+Y^a^9S8r>!7E8C z(LP-o_eK=z7Xkv&{Z^HfAYJ>zkTWg`ep$Kj}d&UgL7(gTZF?g2M_n_ z%=EOLs&%HN8G6mFgj#}hOwyV(6Binhc<^F-&4;nK)j|erFS30AdpG?ApE+CX8LKW0 zS|;?Wq*X1Aj3M2;fA`(_1;ZpJw8!?deSG2}+i%!jUxCa8N>vXmR+mdaKb7WN4lC~f^RokpE zty4(X{dU(kM=$CHZR~rsfcDtDX?uV17R}WgGwfC1RX~nCVmOYO0LFkgt5<^-ftLXr zkuF!72bN7H3xp3EZhda&=5zD&w%L6(bQrV3crW(aC`i)u>i}zkwS8lnnlZsGjTzpN z+4<~_+xN}i+h$Ln?qiQ)))}q`pN!Hq%*(R`fmVM^Mb-GI#Agxb4KjD1X}lCyjQ{`u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2960eb02aa5be63d001b229714ced515a348aae4 GIT binary patch literal 4351 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 B&1L`q literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..67f5018f20b2db689b172a8c76df6933e7727bfc GIT binary patch literal 4466 zcmaJ_c{r5q+aBvshDl`CG^ioWVx7r0%-D%B)+Eb}Ewh*zS(05LWGy0NEo6_BB`qqE zLbi~I3W-95(x>}cMsU=IcvfF;p9$q+M&hYy)R_8^4@J|pV@09+71q7%!> z$`a#6qo{iP#;Ar+=(}tHKu14>?%{Qs%z}85ef+4p(B;++D8!GX3w6}6LRis_$i9B2 zVGOcem^INW?6en}1l8Ar=!9T)1t?^e2PA|NKxJY=bfJIgVs_`hx8YF8Ul7)5UFd&I zIa%32jA#rpL_-y!;)T#eKs1r6NHujWEiGjT3V}qx5hyqkrGnJLsG%?j1my1rx*Lr_ z^2QKw#(&4!UFkx7Su8pR4i63vRt;8Dr7?WqNHiM#TLXns*+r-@L#Zr}5EUv@?vDbF z%=BXT(OG^pD&)7KhbJwFr3>A4`kxdi^nYZj%)iUDTQGQt2OW-7Mf^_b575f$|A$g2 z|Dc&H0{Opw|4(5iF_cb*6Ua@KJ#LTu(NEl6=1`3PBqYcq&+DIfGrEP@8 z;*5+D+6ZG~gpnrh4;M%C3ZjsytUp}Rf4SIy<^FC23Vk;+j?C~oLnawBXcWj_31j^J z-HX=0>ix|n{ks?Kf91k=&A@*j>;F3DKU=%K^LzSF)9x<*X?rqtx7QiFO)XqGVYhqH z=FD(dV#wH{D=p#VV^Q|1+r*heVAGpc{IJt<(FPV{*&x5n!>2^B70MbZLrUq~7Zun8 z*AJ)Q3@Hu%_MPv5_3|+Oga?I?eVy(GmQqb-kIyTEKqnU{3Mv|ld;&G!M2%T;>iWn1p#)O^P&0BTytF9^QlUc$FZzppgJFML_;$UAAU z2u#ZT24|=%k_At)s~z5*y?fN6AARuJ-hNrSV?O?F0xBAn#2Co-TDh(0p(w7zBe#`S z?z@i0*>zX3bIP3HF88X5`VkCqV6exaQnJfby#+@Tn}g$pB(_ug-Xs#Xgt8t^`+|dOd-8WhV)%P6Udg-@((+#AxVBkuX#zagk z(!xCZGn>atZ>+U%2RJ6=YnUS^Xgcn$>zP! zS#-wbO&a|;?am<6Vk%*?F!BZ$FTnQTw>`Y)6froEfqt8%W$gM$RR+QZr{w&q*VFvN z1W$NMkt_Y0i$G0K5a=Z_ZNQ7oLy@wrHG2DcJ_hM!P=NXQ8WHh<=h5w1oJsZ`hs~kK z(Oh^_T5%|!j0xSp>d|Kn#7&#wl8Ly}+n>aQnTUjyL*4DAktKox{=hE+xDOR}GkMt2 z9tT?8o)gd!!Lav1S>yfRCA&Y*y}d9~uPX1IyjE%0?P}3ISj&Tg-Kv}embhWt@5+c1 zONy?8x-uiTmj%IV0x;?mgStLYxHMTqvbktkBmZjS1gg4swv^{lRD&c-rdIDu*Y_~q z6q#?vZvJzN8e-(#k0Ux zpyyu&#NQXT-*K-S{=rV{`ms~{%Q>#1V^8-s7hoT3yRTXD+otISqJJ>uSRJ9KCCrAC zDVs9nyVMg^1oX4mv|m%X>^fbPQ`4mrv0`|zyw6>E-9UUy2R8oo+(Ah@@+p^(fH~_t zl4gL2;-KQ-Mp6BnSgeR+j2p!PR#7|xYZ;4e2$&oewV&@enX~;5W~z64?)>Ct^&~-?3bas$B>c@_p*M>C?K9!b|&+2Iz~mR_UsV zFK#Avb&+#LgPlCg4P%$(5|Wh?v)r>vsfII__Ks->a&@Dz<-zHpYwee=L??K3u(}m4 zZ;Exe?0gI4u;I;WR9O_QM_R_mHT2ZVxA6+}h|XxY)Joe4Q}fi5Ysr

oxsuL0=pw z;r9H>lM`ESPEW!_Z!W`a#CR4S4$u3GaE(0xCpzqhEA10^3(ct0c>XMy9&P}zEua+# zG`X52I#zQ*{jjg`J&NH zyY6;wxewqn;Z$*^?CtxYb%&q66Ne%SEz&uH%d@mk6eOQVBVxMfUO>@flE6@HQ7phQb{cARE8ERmIqec=!%47 zJyo$w;*(Ex<;>7NA!(L)SN>+7v&V$xSHp{iY;LFDBnezD1Vxa?`kVe zW}6BP8{MpBS8)=Yz}?w~l7iHCRs4$T={$9u>EagDwnJ^NMYgy;N`Z#J(nT=mFniDX z%1YUc7YYp#Sn8R1yR?R|*tTfh9ZQ&+zXlPeOas#fdq1(q+Vlhq?)!(B4obt^|>n*D%a* znG5bG*wm;HkBESDdQ|d;w<~9SlZm=mqv|Q!>Iy}!=a zRQhzbq8O1Up0L58czW~uBceI4C-ox=JX}`R9e#MM@3qx<#^R5TG2`f_g4hz}O5zRf}1DwK? z`EA5@k@N+kW}qyePfgy;WyO27*#TRfPm;O8vdJsj9LDdfUWW*&$JJgh9z7WqSu#lB z-FNsq)-yKivxX+)!1!7|$fbUC=hjrAgE#Q`Gpb|W7OBeRS69B&gQF&?l9f=E2LoF89H#O=9=R=xc9;Q0+xEh=wD+CA4Svv5j~-a!`uRu|}a=ge3reMlv6P-_?o(wX1!4806VNOAdzVre_DlKX7C zZ=RP=L&uWB0(!Lf@gd6)=#0kOFL{oWCqzD_J>0}|PbW6_Ruf-?@n>R(Q@?AvLPb78 ziBfH^(D`f|)uQW1YPaR|w3D4kty*`tfxXZCIdf;f9khUtaG4v|A3;E9qCry zOW--fTURb`jvkMsi_E^|k8$xcOrD7bmA^G7$?dDfMWuqx{ zGVroR%a@-nFT}YyFw1M)g4Dzqdt0!DkM1i><1Z&r06y3Fl|{=N#oCd(PSUhu(5k zb%v}I_F0}HO*Sl7$B+4I(5#xCY4zm4GCMmaEc?w`{w!6|Wu#cP%Z;sF7jLo?G`Jxt zhXS3gb9$-mw!X0(QMmUA6MoP^%$E8{Xd>QBFFF<9R22PPE$RiwO#Dn7_ReHJTz6@5 zy2cUg(9xO5B|rJfV}npSFZT(lRx^hZtVSz561ernI9n{8%XcE`(LQO*S>=(1g7d8x zWoOz;0y^`|tQ4vmy3c2cH2dM69*GA>_XiV0?p`%QUE)8Zu&=|}q0%$An#0(s;$!tTRq`OvxG+;` z+A^=6v<)S@C^-Y21l}pbTYu5mcYn!v3Z|hA!nS@KkKzDGK4}c(DdKtd`!9$Y-Wpe9 H=pOSw&pF0^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7e4cdecca5485dd4d8dfb58cc1e6826d22038bf4 GIT binary patch literal 6121 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 F{{vSH>v;eG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e134c41a08952c062f799b69db689233f513cc62 GIT binary patch literal 2237 zcmaKudpHy98^gsxb*YA(tANTWI_jBFPbA7(|^W69KN)Wjf$_-W@yB9L$0r8Ho&vZBhDXO6V34?d2_^<+21Z7XD+nk6Aa=;f!48+? zzfkRztvU#DoVIcslP$0}m6k1o?NOYz1?H4E)E8$sxVt-mZ55D6r2})QJ!dMLv-52I z^0KQAnY>&9Kq%4~T3XgusO%NX7vHTHueUUL*BCSp4NhbVp5LMe1i;A2F=K0+uHmM@ zV;qYlflzMTctb{3%KB$YN~x)pmim?5GChuZUG~c!&z0TKO0c`9T^hpB;ZM+h%1m8y zUQOY?7X_4V({7EpR!O}DHaDzdbbs1WO#?~4#dxh{c}r?HjCtc0s-T@x0>6=}P(%t0 z@>cc+dL#W*nVeZ&-u{G4OYi~X%q!OhND(S0AZ$2gFNN!Icu1rL8Z8#DGRDEt8#=_J zdE%kV^bQ5jhqV_QPNI9VuXzf1tep{|2F5~xP!%ZXb-r)Dul(qH9AZE)nvij@dPd721lcd;ry$4_H|vxxVIZj=6WO^VFuq?k9X zOI4bfb8M8WJOmq>qg8NGD3m|ClwPK*^6Jk_Nu@p*k;_v5&{qR82YM2}&cAh5QByOh zF$wL%J?-yzpLo^ac>d$;?0v!R&NE=D*VR_faGcYoXeoWcMV7JZG2c2qK0dKAlb)Vl zkd`Ju*FNr2&_$Nn&YhkFe#mti@oPU2PRpVVX3ylG#U7M3?3IH(x_R?csUyw}bJ^ys zM0clI-(BNZq&8TyGf)%4He+9x{f`Q{rFfyY7JIIpvmFOn8)Koe;jCq?mEw^NNq?3)ZBw6~n}PK(9x)V*OO^Dr%_)>j*Rq@O!+xE_sJUQ;Pjj7i>lXBFbWUZl?-7*Z?SoEy`n-KRoE1AZ}8I#JGn(|?O79RH|+A? z$XKdo4DST6e+IPHQo?BN=<2@vmXj2==DsxvH{eUq(H%iPa=!%Gfie*T4RCt=;+~}L z3j3jB97zs#2en+}7wTUUweINApjfjOikf-Ss|}9v&wzilJVMlqzY7D&LCbq6Nn6wG zOXf*SGiung;t+kA7GhyC5S>LE!K0=q%$XF}aL<$RKdvrlK_tTcV%}|bqqQv{G~)Su2gru#h_)Vt zhP4@fuYR|Nl|gadxTe3YyVkYcU8L?-lVP$X4yhR;Z<{G#N8pY}l0HuYCVYy`Wkb0G z6B84#SRNW)nEuh|yG04gnAQuY_}!142_Q?W0vn-tL?0_Xb846oTmZ*U!kB8W)zJ|w z$jpzP1aI%5+lmLhw(k7#Wv`M#927mp9G6Lr*uqd^CA`E6`pN1dWage0|lm zF>1X1eowi+FN$&Ingu-@Yz1&JQyhdirWCtLER`JyPK*$Vew&q)Ah_4;3tqe zC_p&?Gy#Gu!+~%WIOqwij3nqcDFlT*RqP{>?ftk4_cEV2kPJ0koiOIiT&n1~G@ zP2=Zp>r;9yg5+LJx-#Cd}5QJD3jl?e)XV~p8kl8$m$R0nq9rn9R*h| zjg|zoBI{Db<-h5y?PfW!Z-Qb}T;>F)HK*m%d(NFsS;R?56Vl{=HKQCcI#YiO>H9lm zwwhl{`r3)23O#9g-%FB(%dO8rzT8%L9CWyHC?C38d%bN5GkKDZ-!f-WD1qi^$k?y$%eTz z7j6qJ&ssRYKTxxFO1CO8KP~6Tpr-nNXV4Y3vumG;R@M*M89i-$+&mThV12)p^zBum z2V01V2sJ*G=aT;*xZ>8zHgz@iU*cR}@U+iJrAEYw0%at^InU`jmBc0Gj$mqov;}c5 zc*iwr`uNvXtW({iZlFlTL>?cm32~l^=B^(j`J?G>UW@)nZ tq-{U=1!Wb^*#-af=LOoQuclYGB+CP&9ybzGmH594fD;nq(1Q4l^fyGZ3LO9d literal 0 HcmV?d00001 diff --git a/IAP5Helper/src/main/res/drawable/progressbar_middle.xml b/IAP5Helper/src/main/res/drawable/progressbar_middle.xml new file mode 100644 index 0000000..0dd4e41 --- /dev/null +++ b/IAP5Helper/src/main/res/drawable/progressbar_middle.xml @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png b/IAP5Helper/src/main/res/drawable/tw_widget_progressbar_effect_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e90af625e08d13a7c418582e7f1239de90bbde GIT binary patch literal 3462 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 literal 0 HcmV?d00001 diff --git a/IAP5Helper/src/main/res/layout/progress_dialog.xml b/IAP5Helper/src/main/res/layout/progress_dialog.xml new file mode 100644 index 0000000..77e87a3 --- /dev/null +++ b/IAP5Helper/src/main/res/layout/progress_dialog.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/IAP5Helper/src/main/res/values-ar/strings.xml b/IAP5Helper/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..ebf5ea3 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ar/strings.xml @@ -0,0 +1,39 @@ + + + + + حدث خطأ غير معلوم. + + عملية الشراء من داخل التطبيقات من Samsung + + يتعذر إجراء عملية شراء من داخل تطبيق Samsung. انتقل إلى الأذونات، ثم اسمح بالأذونات المطلوبة وحاول مجدداً. + + لشراء العناصر، يلزم تثبيت تطبيق تم شراؤه من Samsung. هل تريد التثبيت؟ + + تم تقديم قيمة غير صالحة لخدمة الشراء من داخل التطبيقات من Samsung‬. + + جارٍ الانتظار\u2026 + + تم إلغاء عملية الدفع. + + تحديث Galaxy Apps + + يتوفر إصدار جديد. سيتم تحديث Galaxy Apps إلى أحدث إصدار لإكمال عملية الشراء هذه. + diff --git a/IAP5Helper/src/main/res/values-as/strings.xml b/IAP5Helper/src/main/res/values-as/strings.xml new file mode 100644 index 0000000..8b23d71 --- /dev/null +++ b/IAP5Helper/src/main/res/values-as/strings.xml @@ -0,0 +1,39 @@ + + + + + অজ্ঞাত ত্ৰুটি ঘটিছে৷ + + চেমচাং ইন-এপ ক্ৰয় + + চেমচাং ইন-এপ ক্ৰয় খোলাত অক্ষম। অনুমতিলৈ যাওক, তাৰপিছত আৱশ্যকীয় অনুমতি অনুমোদন কৰক আৰু পুনঃচেষ্টা কৰক। + + আইটেমসমূহ ক্ৰয় কৰিবলৈ, আপুনি চেমচাং ইন-এপ পাৰচেজ ইনষ্টল কৰাটো প্ৰয়োজন। ইনষ্টল কৰিবনে? + + চেমচাং ইন-এপ ক্ৰয়ৰ বাবে এটা অমান্য মান প্ৰদান কৰা হৈছে৷ + + অপেক্ষাৰত\u2026 + + পৰিশোধ বাতিল কৰা হৈছে৷ + + Galaxy Apps আপডেট কৰক + + এটা নতুন সংস্কৰণ উপলব্ধ। এই ক্ৰয় সম্পূৰ্ণ কৰিবলৈ Galaxy Apps-ক শেহতীয়া সংস্কৰণলৈ আপডেট কৰা হ\'ব। + diff --git a/IAP5Helper/src/main/res/values-az-rAZ/strings.xml b/IAP5Helper/src/main/res/values-az-rAZ/strings.xml new file mode 100644 index 0000000..6e8ba36 --- /dev/null +++ b/IAP5Helper/src/main/res/values-az-rAZ/strings.xml @@ -0,0 +1,39 @@ + + + + + Naməlum səhv baş verdi. + + Samsung In-App Purchase + + Samsung In-App Purchase-i açmaq olmadı. İcazələrə keçin və tələb edilən icazələri verib yenidən cəhd edin. + + Elementləri satın almaq üçün Samsung In-App Purchase quraşdırmalısınız. Quraşdırılsın? + + Samsung In-App Purchase üçün yalnış vahid təmin edilmişdir. + + Gözləyir\u2026 + + Ödəniş ləğv edildi. + + Galaxy Apps yenilə + + Yeni versiya mövcuddur. Bu satınalmanın tamamlanması üçün Galaxy Apps ən son versiyasına yenilənəcək. + diff --git a/IAP5Helper/src/main/res/values-be-rBY/strings.xml b/IAP5Helper/src/main/res/values-be-rBY/strings.xml new file mode 100644 index 0000000..8f8c1a0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-be-rBY/strings.xml @@ -0,0 +1,39 @@ + + + + + Адбылася невядомая памылка. + + Samsung In-App Purchase + + Немагчыма адкрыць Samsung In-App Purchase. Перайдзіце ў Дазволы, затым дайце неабходныя дазволы і паўтарыце спробу. + + Каб набываць тавары, вам неабходна ўсталяваць Samsung In-App Purchase. Усталяваць? + + Няправільнае значэнне было пададзена для Samsung In-App Purchase. + + Чаканне\u2026 + + Аплата скасавана. + + Абнавіць Galaxy Apps + + Даступна новая версія. Для завяршэння гэтай пакупкі Galaxy Apps будуць абноўлены да апошняй версіі. + diff --git a/IAP5Helper/src/main/res/values-bg/strings.xml b/IAP5Helper/src/main/res/values-bg/strings.xml new file mode 100644 index 0000000..94add26 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bg/strings.xml @@ -0,0 +1,39 @@ + + + + + Възникна неизвестна грешка. + + Покупка от прил. на Samsung + + Не може да се отвори „Покупка от приложение на Samsung“. Отидете на „Разрешения“, след което позволете необходимите разрешения и опитайте отново. + + За да закупите елементи, трябва да инсталирате Покупка от приложение на Samsung. Инсталиране? + + Предоставена е невалидна стойност за Покупка от приложение на Samsung. + + Изчакване\u2026 + + Плащането е отменено. + + Актуализиране на Galaxy Apps + + Налична е нова версия. Galaxy Apps ще се актуализира с последната версия, за да се завърши тази покупка. + diff --git a/IAP5Helper/src/main/res/values-bn-rBD/strings.xml b/IAP5Helper/src/main/res/values-bn-rBD/strings.xml new file mode 100644 index 0000000..2f3bb84 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bn-rBD/strings.xml @@ -0,0 +1,39 @@ + + + + + অজানা ত্রুটি ঘটেছে। + + Samsung In-App Purchase + + Samsung In-App Purchase খুলতে অক্ষম৷ ‘অনুমতি’-তে যান, তারপর প্রয়োজনীয় অনুমতিগুলো দিয়ে আবার চেষ্টা করুন৷ + + আইটেম কেনার জন্য, আপনাকে Samsung In-App Purchase ইনস্টল করতে হবে৷ ইনস্টল করবেন? + + Samsung In-App Purchase-এর জন্য একটি অকার্যকর মান দেয়া হয়েছে৷ + + অপেক্ষমাণ\u2026 + + পেমেন্ট বাতিল হয়েছে৷ + + Galaxy Apps আপডেট করুন + + একটি নতুন সংস্করণ আছে৷ এই ক্রয় সম্পন্ন করতে Galaxy Apps সর্বসাম্প্রতিক সংস্করণে আপডেট করা হবে। + diff --git a/IAP5Helper/src/main/res/values-bn-rIN/strings.xml b/IAP5Helper/src/main/res/values-bn-rIN/strings.xml new file mode 100644 index 0000000..04acd55 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bn-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + অজানা ত্রুটি ঘটেছে। + + স্যামসাং ইন-অ্যাপ পারচেস + + স্যামসাং ইন-অ্যাপ পারচেজ খুলতে অক্ষম। অনুমতিগুলিতে যান, তারপর প্রয়োজনীয় অনুমতিগুলি মঞ্জুর করুন এবং আবার চেষ্টা করুন। + + আইটেমগুলি কিনতে আপনার স্যামসাং ইন-অ্যাপ ক্রয় ইনস্টল করা প্রয়োজন৷ ইনস্টল করবেন? + + স্যামসাং ইন-অ্যাপ ক্রয়ের জন্য একটি অবৈধ মান সরবরাহিত হয়েছে। + + অপেক্ষা করা হচ্ছে\u2026 + + প্রদান বাতিল হয়েছে। + + Galaxy Apps আপডেট করুন + + একটি নতুন সংস্করণ সুলভ। এই কেনাকাটা সম্পূর্ণ করতে, Galaxy Apps সাম্প্রতিকতম সংস্করণে আপডেট হবে। + diff --git a/IAP5Helper/src/main/res/values-bo/strings.xml b/IAP5Helper/src/main/res/values-bo/strings.xml new file mode 100644 index 0000000..f8fefc0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bo/strings.xml @@ -0,0 +1,39 @@ + + + + + རྒྱུས་མེད་ནོར་འཁྲུལ་བྱུང༌། + + Samsung In-App Purchase + + Samsung In-App Purchaseཁ་ཕྱེ་མི་ཐུབ།༼དབང་ཚད་༽ནང་ཞུགས་དགོས།དེ་རྗེས་གཤམ་གྱི་དབང་ཚད་སྤྲད་ནས་བསྐྱར་ཚོད་བྱེད་དགོས། + + གལ་ཏེ་ཉོ་སྒྲུབ་ཚོང་ཟོག།ཁྱེད་ནས་Samsung In-App Purchaseསྒྲིག་འཇུག་བྱེད་དགོས།སྒྲིག་འཇུག་བྱེད་དམ། + + Samsung In-App Purchaseལ་ཕན་མེད་གྲངས་ཞིག་ཐོབ་ཡོད། + + 请稍候\u2026 + + དངུལ་སྤྲོད་བྲིས་སུབ་གཏོང་བ། + + Galaxy་ཉེར་སྤྱོད་ཚོང་ཁང་གསར་སྒྱུར་བྱེད། + + པར་གཞི་གསར་བ་འདུགGalaxy་ཉེར་སྤྱོད་ཚོང་ཁང་གིས་པར་གཞི་གསར་ཤོས་སུ་གསར་སྒྱུར་བྱས་ནས་ཐེངས་འདིའི་དངོས་ཉོ་འགྲུབ་པར་བྱེད། + diff --git a/IAP5Helper/src/main/res/values-bs/strings.xml b/IAP5Helper/src/main/res/values-bs/strings.xml new file mode 100644 index 0000000..3ac8455 --- /dev/null +++ b/IAP5Helper/src/main/res/values-bs/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Čekanje\u2026 + + Payment cancelled. + + Ažuriraj Galaxy Apps + + Dostupna je nova verzija. Prodavnica Galaxy Apps će se ažurirati na najnoviju verziju da bi se dovršila ova kupovina. + diff --git a/IAP5Helper/src/main/res/values-ca/strings.xml b/IAP5Helper/src/main/res/values-ca/strings.xml new file mode 100644 index 0000000..e270a1a --- /dev/null +++ b/IAP5Helper/src/main/res/values-ca/strings.xml @@ -0,0 +1,39 @@ + + + + + S\'ha produït un error desconegut + + Samsung In-App Purchase + + No es pot obrir Samsung In-App Purchase. Vagi a Permisos i, a continuació, permeti els permisos necessaris i torni-ho a intentar. + + Per comprar elements, cal que instal·li Samsung In-App Purchase. Instal·lar? + + S\'ha proporcionat un valor no vàlid per a In-App Purchase de Samsung + + En espera\u2026 + + Pagament cancel·lat + + Actualitzar Galaxy Apps + + Hi ha una versió nova disponible. S\'actualitzarà Galaxy Apps a l\'última versió per completar aquesta compra. + diff --git a/IAP5Helper/src/main/res/values-cs/strings.xml b/IAP5Helper/src/main/res/values-cs/strings.xml new file mode 100644 index 0000000..cc2a0d6 --- /dev/null +++ b/IAP5Helper/src/main/res/values-cs/strings.xml @@ -0,0 +1,39 @@ + + + + + Došlo k neznámé chybě. + + Nákup z aplikace Samsung + + Nepodařilo se spustit Nákup z aplikace Samsung. Přejděte na Oprávnění a potom povolte požadovaná oprávnění a opakujte akci. + + Chcete-li nakupovat, musíte nainstalovat modul nákupu z aplikace od společnosti Samsung. Instalovat? + + Byla poskytnuta neplatná hodnota pro nákup z aplikace Samsung. + + Čekám\u2026 + + Platba byla zrušena. + + Aktualizovat Galaxy Apps + + K dispozici je nová verze. Aby byl dokončen tento nákup, aplikace Galaxy Apps bude aktualizována na nejnovější verzi. + diff --git a/IAP5Helper/src/main/res/values-da/strings.xml b/IAP5Helper/src/main/res/values-da/strings.xml new file mode 100644 index 0000000..8e1360e --- /dev/null +++ b/IAP5Helper/src/main/res/values-da/strings.xml @@ -0,0 +1,39 @@ + + + + + Ukendt fejl opstod. + + Køb for. via Samsung-app + + Kan ikke åbne Køb foretaget via Samsung-app. Gå til Tilladelser, aktiver de krævede tilladelser, og prøv igen. + + For at købe elementer skal du installere Køb foretaget via Samsung-app. Installer? + + Der er angivet en ugyldig værdi for Køb foretaget via Samsung-app. + + Venter \u2026 + + Betaling annulleret. + + Opdater Galaxy Apps + + En ny version er tilgængelig. Galaxy Apps vil blive opdateret til den nyeste version, så du kan gennemføre dette køb. + diff --git a/IAP5Helper/src/main/res/values-de/strings.xml b/IAP5Helper/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..9ab6611 --- /dev/null +++ b/IAP5Helper/src/main/res/values-de/strings.xml @@ -0,0 +1,39 @@ + + + + + Unbekannter Fehler aufgetreten + + Samsung In-App Purchase + + Samsung In-App Purchase kann nicht geöffnet werden. Wechseln Sie zu „Berechtigungen“, erteilen Sie die erforderlichen Berechtigungen und versuchen Sie es anschließend erneut. + + Wenn Sie Artikel kaufen möchten, müssen Sie Samsung In-App-Kauf installieren. Installieren? + + Es wurde ein ungültiger Wert für Samsung In-App Purchase angegeben. + + Warten\u2026 + + Zahlung abgebrochen + + Aktualisieren von Galaxy Apps + + Eine neue Version ist verfügbar. Galaxy Apps wird auf die neueste Version aktualisiert, um diesen Kauf abzuschließen. + diff --git a/IAP5Helper/src/main/res/values-el/strings.xml b/IAP5Helper/src/main/res/values-el/strings.xml new file mode 100644 index 0000000..e5547ce --- /dev/null +++ b/IAP5Helper/src/main/res/values-el/strings.xml @@ -0,0 +1,39 @@ + + + + + Παρουσιάστηκε άγνωστο σφάλμα. + + Samsung In-App Purchase + + Δεν είναι δυνατό το άνοιγμα του Samsung In-App Purchase. Μεταβείτε στα Δικαιώματα, παραχωρήστε τα παρακάτω δικαιώματα και, στη συνέχεια, δοκιμάστε ξανά. + + Πρέπει να εγκαταστήσετε το εργαλείο αγοράς εντός εφαρμογής της Samsung για να αγοράσετε στοιχεία. Να εγκατασταθεί; + + Δόθηκε μη έγκυρη τιμή για την αγορά εντός της εφαρμογής Samsung. + + Αναμονή\u2026 + + Η πληρωμή ακυρώθηκε. + + Ενημέρωση Galaxy Apps + + Υπάρχει διαθέσιμη νέα έκδοση. Για την ολοκλήρωση αυτής της αγοράς, το Galaxy Apps θα ενημερωθεί στην πιο πρόσφατη έκδοση. + diff --git a/IAP5Helper/src/main/res/values-en-rCA/strings.xml b/IAP5Helper/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 0000000..c5dbd6e --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install it? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-en-rPH/strings.xml b/IAP5Helper/src/main/res/values-en-rPH/strings.xml new file mode 100644 index 0000000..0bf8492 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rPH/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment canceled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-en-rUS/strings.xml b/IAP5Helper/src/main/res/values-en-rUS/strings.xml new file mode 100644 index 0000000..82f1225 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rUS/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-en-rZG/strings.xml b/IAP5Helper/src/main/res/values-en-rZG/strings.xml new file mode 100644 index 0000000..82f1225 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en-rZG/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-en/strings.xml b/IAP5Helper/src/main/res/values-en/strings.xml new file mode 100644 index 0000000..82f1225 --- /dev/null +++ b/IAP5Helper/src/main/res/values-en/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-es-rES/strings.xml b/IAP5Helper/src/main/res/values-es-rES/strings.xml new file mode 100644 index 0000000..42ee5d2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-es-rES/strings.xml @@ -0,0 +1,39 @@ + + + + + Error desconocido. + + Samsung In-App Purchase + + No se puede abrir Samsung In-App Purchase. Ve a Permisos y, a continuación, concede los permisos necesarios e inténtalo de nuevo. + + Para comprar elementos, debes instalar Samsung In-App Purchase. ¿Instalar? + + Se ha proporcionado un valor no válido para Samsung In-App Purchase. + + Esperando\u2026 + + Pago cancelado. + + Actualizar Galaxy Apps + + Hay una versión nueva disponible. Se actualizará Galaxy Apps a la versión más reciente para completar esta compra. + diff --git a/IAP5Helper/src/main/res/values-es-rUS/strings.xml b/IAP5Helper/src/main/res/values-es-rUS/strings.xml new file mode 100644 index 0000000..7fd5dce --- /dev/null +++ b/IAP5Helper/src/main/res/values-es-rUS/strings.xml @@ -0,0 +1,39 @@ + + + + + Error desconocido. + + Compra en aplic. Samsung + + No es posible abrir Compra desde la aplicación Samsung. Vaya a Permisos, otorgue los permisos necesarios e inténtelo de nuevo. + + Para comprar estos elementos, debe instalar Compra desde la aplicación Samsung. ¿Instalar? + + Se proporcionó un valor no válido para Compra desde la aplicación Samsung. + + Esperando\u2026 + + Pago cancelado. + + Actualizar Galaxy Apps + + Hay una versión nueva disponible. Galaxy Apps se actualizará a la versión más reciente para finalizar la compra. + diff --git a/IAP5Helper/src/main/res/values-et-rEE/strings.xml b/IAP5Helper/src/main/res/values-et-rEE/strings.xml new file mode 100644 index 0000000..de77849 --- /dev/null +++ b/IAP5Helper/src/main/res/values-et-rEE/strings.xml @@ -0,0 +1,39 @@ + + + + + Ilmnes tundmatu torge. + + Samsung In-App Purchase + + Rakendust Samsung In-App Purchase ei saa avada. Avage menüü Õigused, seejärel kinnitage vajalikud õigused ja proovige uuesti. + + Üksuste ostmiseks peate installima rakenduse Samsung In-App Purchase. Kas installida? + + Rakenduse Samsung In-App Purchase jaoks on sisestatud vale vaartus. + + Ootel\u2026 + + Makse on tühistatud. + + Rakenduse Galaxy Apps värskendamine + + Saadaval on uus versioon. Rakendus Galaxy Apps värskendatakse selle ostu sooritamiseks uusimale versioonile. + diff --git a/IAP5Helper/src/main/res/values-eu-rES/strings.xml b/IAP5Helper/src/main/res/values-eu-rES/strings.xml new file mode 100644 index 0000000..56f3bc0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-eu-rES/strings.xml @@ -0,0 +1,39 @@ + + + + + Errore ezezaguna gertatu da + + Samsung In-App Purchase + + Ezin da Samsung In-App Purchase ireki. Joan Baimenak atalera, onartu beharrezko baimenak eta saiatu berriz. + + Elementuak erosteko, Samsung In-App Erosketa instalatu behar duzu. Instalatu? + + Balio baliogabea eman da Samsung In-App erosketan + + Itxaroten\u2026 + + Ordainketa utzita + + Eguneratu Galaxy Apps + + Bertsio berri bat dago erabilgarri. Galaxy Apps bertsio berrienera eguneratuko da erosketa hau osatzearren. + diff --git a/IAP5Helper/src/main/res/values-fa/strings.xml b/IAP5Helper/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000..9991c0a --- /dev/null +++ b/IAP5Helper/src/main/res/values-fa/strings.xml @@ -0,0 +1,39 @@ + + + + + خطای نامشخصی رخ داد. + + خرید درون برنامه سامسونگ + + باز کردن خرید درون برنامه سامسونگ ممکن نیست. به مجوزها بروید، سپس به مجوزهای مورد نیاز اجازه داده و دوباره امتحان کنید. + + برای خرید موارد، باید خرید درون برنامه سامسونگ را نصب کنید. نصب شود؟ + + یک مقدار نادرست برای خرید درون برنامه سامسونگ ارائه شده است. + + در انتظار\u2026 + + پرداخت لغو شد. + + به‌روزرسانی Galaxy Apps + + نسخه جدیدی در دسترس است. برای تکمیل این خرید، Galaxy Apps به جدیدترین نسخه به‌روزرسانی خواهد شد. + diff --git a/IAP5Helper/src/main/res/values-fi/strings.xml b/IAP5Helper/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000..df617f2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-fi/strings.xml @@ -0,0 +1,39 @@ + + + + + Tuntematon virhe + + Samsung In-App Purchase + + Samsung In-App Purchasea ei voi avata. Valitse Käyttöoikeudet, myönnä tarvittavat oikeudet ja yritä uudelleen. + + Samsung In-App Purchase on asennettava tuotteiden ostamista varten. Asennetaanko? + + Samsung In-App Purchaselle on annettu virheellinen arvo. + + Odotetaan\u2026 + + Maksu on peruutettu. + + Päivitä Galaxy Apps + + Uusi versio saatavilla. Galaxy Apps päivitetään uusimpaan versioon tämän ostoksen viimeistelemiseksi. + diff --git a/IAP5Helper/src/main/res/values-fr-rCA/strings.xml b/IAP5Helper/src/main/res/values-fr-rCA/strings.xml new file mode 100644 index 0000000..aef119a --- /dev/null +++ b/IAP5Helper/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,39 @@ + + + + + Une erreur inconnue est survenue. + + Samsung In-App Purchase + + Impossible d\'ouvrir Samsung In-App Purchase. Accédez à Autorisations, puis accordez les autorisations requises et réessayez. + + Pour acheter des articles, vous devez installer le système Achat dans l\'application Samsung. Installer ? + + Une valeur non valide a été fournie pour Achat dans l\'application Samsung. + + Patientez\u2026 + + Paiement annulé. + + Mise à jour de Galaxy Apps + + Une nouvelle version est disponible. L\'application Galaxy Apps va être mise à jour vers la dernière version pour terminer cet achat. + diff --git a/IAP5Helper/src/main/res/values-fr/strings.xml b/IAP5Helper/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000..801ad8d --- /dev/null +++ b/IAP5Helper/src/main/res/values-fr/strings.xml @@ -0,0 +1,39 @@ + + + + + Une erreur inconnue est survenue. + + Samsung In-App Purchase + + Impossible d\'ouvrir Samsung In-App Purchase. Accédez à Autorisations, puis accordez les autorisations requises et réessayez. + + Pour acheter des articles, vous devez installer l\'application Samsung In-App Purchase. Installer ? + + Une valeur non valide a été fournie dans Samsung In-App Purchase. + + Patientez\u2026 + + Paiement annulé + + Mise à jour de Galaxy Apps + + Une nouvelle version est disponible. L\'application Galaxy Apps va être mise à jour vers la dernière version pour terminer cet achat. + diff --git a/IAP5Helper/src/main/res/values-ga/strings.xml b/IAP5Helper/src/main/res/values-ga/strings.xml new file mode 100644 index 0000000..6c3b337 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ga/strings.xml @@ -0,0 +1,39 @@ + + + + + Tharla earráid anaithnid + + Ceann. i bhF.chlár Samsung + + Ní féidir Ceannach i bhFeidhmchlár Samsung a oscailt. Gabh chuig Ceadanna, ansin ceadaigh na ceadanna atá de dhíth agus triail arís. + + Tá Samsung In-App Purchase de dhíth ort le míreanna a cheannach. Suiteáil? + + Soláthraíodh luach neamhbhailí do Cheannach i bhFeidhmchlár Samsung + + Ag feitheamh\u2026 + + Íocaíocht curtha ar ceal. + + Nuashonraigh Galaxy Apps + + Tá leagan nua ar fáil. Nuashonrófar Galaxy Apps chuig an leagan is déanaí leis an gceannachán seo a chur i gcrích. + diff --git a/IAP5Helper/src/main/res/values-gl-rES/strings.xml b/IAP5Helper/src/main/res/values-gl-rES/strings.xml new file mode 100644 index 0000000..62852c2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-gl-rES/strings.xml @@ -0,0 +1,39 @@ + + + + + Houbo un erro descoñecido + + Samsung In-App Purchase + + Non se pode abrir Samsung In-App Purchase. Vai a Permisos e, a continuación, concede os permisos necesarios e téntao outra vez. + + Para mercar elementos, precisas instalar Compra de aplicacións interna de Samsung. Desexas instalalo? + + Forneceuse un valor non válido para Samsung In-App Purchase + + Esperando\u2026 + + Pagamento cancelado + + Actualizar Galaxy Apps + + Hai unha nova versión dispoñible. Galaxy Apps actualizarase á versión máis recente para completar esta compra. + diff --git a/IAP5Helper/src/main/res/values-gu-rIN/strings.xml b/IAP5Helper/src/main/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000..1c8de71 --- /dev/null +++ b/IAP5Helper/src/main/res/values-gu-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + અજ્ઞાત ભૂલ થઈ છે. + + સેમસંગ ઇન-એપ ખરીદી + + સેમસંગ ઇન-એપ ખરીદી ખોલવામાં અસમર્થ. પરવાનગીઓ પર જાઓ, પછી નીચે આપેલ પરવાનગીઓની મંજૂરી આપો અને ફરી પ્રયાસ કરો. + + વસ્તુઓ ખરીદવા માટે, તમને સેમસંગ ઇન-એપ્લિકેશન પરચેઝ સ્થાપિત કરવાની આવશ્યકતા છે. સ્થાપિત કરીએ? + + સેમસંગ ઇન-એપ ખરીદી માટે એક અમાન્ય મૂલ્ય પ્રદાન કરવામાં આવ્યું છે. + + પ્રતીક્ષા કરી રહ્યું છે\u2026 + + ચૂકવણી રદ કરી. + + Galaxy Apps અપડેટ કરો + + એક નવું સંસ્કરણ ઉપલબ્ધ છે. આ ખરીદી પૂર્ણ કરવા માટે Galaxy Apps ને નવીનતમ સંસ્કરણમાં અપડેટ કરવામાં આવશે. + diff --git a/IAP5Helper/src/main/res/values-hi/strings.xml b/IAP5Helper/src/main/res/values-hi/strings.xml new file mode 100644 index 0000000..d149d45 --- /dev/null +++ b/IAP5Helper/src/main/res/values-hi/strings.xml @@ -0,0 +1,39 @@ + + + + + अज्ञात त्रुटि पाई गई + + सैमसंग इन-एप खरीद + + सैमसंग इन-एप खरीदारी खोलने में असमर्थ। अनुमतियाँ पर जाएँ, फिर आवश्यक अनुमतियों को अनुमति दें और फिर से प्रयास करें। + + मदें खरीदने के लिए, आपको सैमसंग इन-एप परचेस़ स्थापित करना आवश्यक हैं। स्थापित करें? + + सैमसंग इन-एप परचेज के लिए कोई अमान्य मान प्रदान किया गया है। + + प्रतीक्षा कर रहा है\u2026 + + भुगतान रद्द किया गया। + + Galaxy Apps अपडेट करें + + एक नया संस्करण उपलब्ध है। यह खरीदारी पूर्ण करने के लिए Galaxy Apps को नवीनतम संस्करण पर अपडेट किया जाएगा। + diff --git a/IAP5Helper/src/main/res/values-hr/strings.xml b/IAP5Helper/src/main/res/values-hr/strings.xml new file mode 100644 index 0000000..8fbb9cf --- /dev/null +++ b/IAP5Helper/src/main/res/values-hr/strings.xml @@ -0,0 +1,39 @@ + + + + + Nepoznata greška + + Samsung kup. unutar apl. + + Nije moguće otvoriti Samsung kupnju unutar aplikacije. Idite na Dopuštenja, a zatim dajte potrebna dopuštenja i pokušajte ponovno. + + Da biste kupili stavke, morate instalirati Samsung kupnju unutar aplikacije. Instalirati? + + Pružena je neispravna vrijednost za Samsung kupnju unutar aplikacije. + + Čekajte\u2026 + + Plaćanje otkazano. + + Aktualizacija trgovine Galaxy Apps + + Dostupna je nova verzija. Za dovršetak kupnje trgovina Galaxy Apps aktualizirat će se na najnoviju verziju. + diff --git a/IAP5Helper/src/main/res/values-hu/strings.xml b/IAP5Helper/src/main/res/values-hu/strings.xml new file mode 100644 index 0000000..fd4084a --- /dev/null +++ b/IAP5Helper/src/main/res/values-hu/strings.xml @@ -0,0 +1,39 @@ + + + + + Ismeretlen eredetű hiba történt. + + Samsung Beépített bolt + + Nem lehet megnyitni a Samsung Beépített bolt alkalmazást. Lépjen be az Engedélyek menüpontba, adja meg a szükséges engedélyeket, majd próbálja újra. + + Vásárláshoz telepítenie kell a Samsung beépített bolt alkalmazást. Telepíti? + + Érvénytelen érték lett megadva a Samsung Beépített bolt számára. + + Várakozás\u2026 + + Fizetés megszakítva. + + Galaxy Apps frissítése + + Rendelkezésre áll egy új verzió. A vásárlás befejezéséhez a rendszer a legújabb verzióra frissíti a Galaxy Apps alkalmazást. + diff --git a/IAP5Helper/src/main/res/values-hy-rAM/strings.xml b/IAP5Helper/src/main/res/values-hy-rAM/strings.xml new file mode 100644 index 0000000..d65fd87 --- /dev/null +++ b/IAP5Helper/src/main/res/values-hy-rAM/strings.xml @@ -0,0 +1,39 @@ + + + + + Անհայտ սխալ տեղի ունեցավ: + + Samsung In-App Purchase + + Անհնար է բացել Samsung In-App Purchase-ը: Գնացեք «Թույլտվություններ», տվեք պահանջվող թույլտվությունները և նորից փորձեք: + + Տարրեր գնելու համար հարկավոր է տեղադրել Samsung In-App Purchase. Տեղադրե՞լ: + + Անվավեր արժեք է տրամադրվել Samsung In-App Purchase-ի համար: + + Սպասում է\u2026 + + Վճարումը դադարեցվեց: + + Թարմացնել Galaxy Apps-ը + + Նոր վարկած է մատչելի: Galaxy Apps-ը կթարմացվի ամենավերջին վարկածով՝ այս գնումը կատարելու համար: + diff --git a/IAP5Helper/src/main/res/values-in/strings.xml b/IAP5Helper/src/main/res/values-in/strings.xml new file mode 100644 index 0000000..c1eaed0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-in/strings.xml @@ -0,0 +1,39 @@ + + + + + Terjadi kesalahan tak dikenal. + + Samsung In-App Purchase + + Tidak dapat membuka Pembelian dalam Aplikasi Samsung. Buka Izin, lalu perbolehkan izin berikut dan coba lagi. + + Untuk membeli item, Anda perlu menginstal Samsung In-App Purchase. Instal? + + Nilai tidak valid dimasukkan ke Samsung In-App Purchase. + + Menunggu\u2026 + + Pembayaran dibatalkan. + + Perbarui Galaxy Apps + + Versi baru tersedia. Galaxy Apps akan diperbarui ke versi terbaru untuk menyelesaikan pembelian ini. + diff --git a/IAP5Helper/src/main/res/values-is-rIS/strings.xml b/IAP5Helper/src/main/res/values-is-rIS/strings.xml new file mode 100644 index 0000000..736cfbb --- /dev/null +++ b/IAP5Helper/src/main/res/values-is-rIS/strings.xml @@ -0,0 +1,39 @@ + + + + + Óþekkt villa kom upp. + + Samsung kaup í forriti + + Ekki er hægt að opna Samsung kaup í forriti. Opnaðu „Heimildir“, veittu síðan nauðsynlegar heimildir og reyndu aftur. + + Þú þarft að setja upp Samsung In-App Purchase til að kaupa atriði. Viltu setja það upp? + + Ógilt gildi var gefið upp fyrir Samsung kaup í forriti. + + Í bið\u2026 + + Hætt við greiðslu. + + Uppfæra Galaxy Apps + + Ný útgáfa er í boði. Galaxy Apps verður uppfært í nýjustu útgáfu til að ljúka við þessi kaup. + diff --git a/IAP5Helper/src/main/res/values-it/strings.xml b/IAP5Helper/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..54a72a7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-it/strings.xml @@ -0,0 +1,39 @@ + + + + + Si è verificato un errore sconosciuto. + + Acquisti in-app Samsung + + Impossibile aprire Acquisti in-app Samsung. Andate in Autorizzazioni, quindi concedete le autorizzazioni necessarie e riprovate. + + Per acquistare degli elementi, è necessario installare l\'applicazione Acquisti in-app Samsung. Installare? + + È stato fornito un valore non valido per l\'applicazione Acquisti in-app Samsung. + + In attesa\u2026 + + Pagamento annullato. + + Aggiorna Galaxy Apps + + È disponibile una nuova versione. Per completare l\'acquisto, Galaxy Apps verrà aggiornato alla versione più recente. + diff --git a/IAP5Helper/src/main/res/values-iw/strings.xml b/IAP5Helper/src/main/res/values-iw/strings.xml new file mode 100644 index 0000000..86a6ef7 --- /dev/null +++ b/IAP5Helper/src/main/res/values-iw/strings.xml @@ -0,0 +1,39 @@ + + + + + ארעה שגיאה לא ידועה. + + Samsung In-App Purchase + + לא ניתן לפתוח את Samsung In-App Purchase. עבור אל \'הרשאות\', אשר את ההרשאות הנדרשות ונסה שוב. + + כדי לרכוש פריטים, עליך להתקין את \'רכישה מתוך היישום של Samsung\'. להתקין? + + סופק ערך לא תקין עבור רכישה מתוך היישום של Samsung. + + ממתין\u2026 + + התשלום בוטל. + + עדכן את Galaxy Apps + + גרסה חדשה זמינה. כדי להשלים רכישה זו, Galaxy Apps יעודכן לגרסה החדשה ביותר. + diff --git a/IAP5Helper/src/main/res/values-ja/strings.xml b/IAP5Helper/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000..2115d13 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ja/strings.xml @@ -0,0 +1,39 @@ + + + + + 不明なエラーが発生しました。 + + Samsung In-App Purchase + + Samsung In-App Purchaseを起動できません。[権限]に移動し、必要な権限を許可してから再度実行してください。 + + アイテムを購入するには、Samsung In-App Purchaseをインストールする必要があります。インストールしますか? + + 無効な値がSamsung In-App Purchaseに提供されています。 + + 待機中\u2026 + + 支払いがキャンセルされました。 + + Galaxy Appsを更新 + + 新しいバージョンが利用可能です。購入手続きを完了するために、Galaxy Appsを最新バージョンに更新します。 + diff --git a/IAP5Helper/src/main/res/values-ka-rGE/strings.xml b/IAP5Helper/src/main/res/values-ka-rGE/strings.xml new file mode 100644 index 0000000..435ac91 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ka-rGE/strings.xml @@ -0,0 +1,39 @@ + + + + + მოხდა უცნობი შეცდომა. + + Samsung In-App Purchase + + Samsung In-App Purchase-ს გახსნა შეუძლებელია. გახსენით „ნებართვები“, შემდეგ კი დართეთ საჭირო ნებართვები და ისევ სცადეთ. + + ელემენტების შესაძენად უნდა დააინსტალიროთ Samsung In-App Purchase. დაინსტალირდეს? + + არასწორი მნიშვნელობაა მითითებული Samsung In-App Purchase სისტემაში. + + ელოდება\u2026 + + გადახდა გაუქმდა. + + Galaxy Apps-ის განახლება + + გამოვიდა ახალი ვერსია. Galaxy Apps განახლდება უახლესი ვერსიით, რომ შესრულდეს ეს შეძენა. + diff --git a/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml b/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml new file mode 100644 index 0000000..8f98457 --- /dev/null +++ b/IAP5Helper/src/main/res/values-kk-rKZ/strings.xml @@ -0,0 +1,39 @@ + + + + + Белгісіз қате пайда болды. + + Samsung In-App Purchase + + Samsung In-App Purchase ашу мүмкін болмады. “Рұқсаттар” бөліміне өтіп, қажетті рұқсаттарды беріңіз, кейін әрекетті қайталаңыз. + + Элементтерді сатып алу үшін Samsung In-App Purchase бағдарламасын орнату керек. Орнату керек пе? + + Samsung In-App Purchase бағдарламасы үшін жарамсыз мән көрсетілген. + + Күтуде\u2026 + + Төлемнен бас тартылды. + + Galaxy Apps қолданбасын жаңарту + + Жаңа нұсқа қолжетімді. Осы сатып алуды аяқтау үшін, Galaxy Apps қолданбасы ең соңғы нұсқаға жаңартылады. + diff --git a/IAP5Helper/src/main/res/values-km-rKH/strings.xml b/IAP5Helper/src/main/res/values-km-rKH/strings.xml new file mode 100644 index 0000000..bd56ddb --- /dev/null +++ b/IAP5Helper/src/main/res/values-km-rKH/strings.xml @@ -0,0 +1,39 @@ + + + + + កំហុស​មិន​ស្គាល់​បាន​កើតឡើង។ + + Samsung In-App Purchase + + មិន​អាច​បើក Samsung In-App Purchase។ ចូលទៅ​ការអនុញ្ញាត រួច​ផ្ដល់​ការអនុញ្ញាត​ដែល​ត្រូវការ ហើយ​សាកល្បង​ម្ដងទៀត។ + + ដើម្បី​ទិញ​ធាតុនានា អ្នក​ចាំបាច់ត្រូវ​ដំឡើង Samsung In-App Purchase។ ដំឡើង? + + បាន​ផ្ដល់​តម្លៃ​អសុពលភាព​សម្រាប់​ការទិញ​ក្នុង​កម្មវិធី Samsung។ + + កំពុង​រង់ចាំ\u2026 + + បាន​បោះបង់​ការបង់ប្រាក់។ + + អាប់ដេត Galaxy Apps + + មាន​កំណែ​ថ្មី។ Galaxy Apps នឹង​ត្រូវ​បាន​អាប់ដេត​ទៅ​កំណែ​ថ្មី​បំផុត ដើម្បី​បញ្ចប់​ការទិញ​នេះ។ + diff --git a/IAP5Helper/src/main/res/values-kn-rIN/strings.xml b/IAP5Helper/src/main/res/values-kn-rIN/strings.xml new file mode 100644 index 0000000..fa334f0 --- /dev/null +++ b/IAP5Helper/src/main/res/values-kn-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + ಅಜ್ಞಾತ ದೋಷ ಸಂಭವಿಸಿದೆ. + + ಸ್ಯಾಮ್‌ಸಂಗ್ ಇನ್-ಅನ್ವಯಿಸುವಿಕೆ ಖರೀದಿ + + Samsung ಇನ್-ಅನ್ವಯಿಸುವಿಕೆ ಖರೀದಿಯನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಅನುಮತಿಗಳಿಗೆ ಹೋಗಿ, ನಂತರ ಕೆಳಗಿನ ಅನುಮತಿಗಳನ್ನು ಅನುಮತಿಸಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ. + + ಅಂಶಗಳನ್ನು ಖರೀದಿಸಲು, ನೀವು ಸ್ಯಾಮ್‌ಸಂಗ್‌ ಇನ್‌-ಆಪ್‌ ಪರ್ಚೇಸ್‌ ಅನ್ನು ಸ್ಥಾಪಿಸುವುದು ಅಗತ್ಯವಾಗಿರುತ್ತದೆ. ಸ್ಥಾಪಿಸುವುದೇ? + + ಸ್ಯಾಮ್‌ಸಂಗ್ ಇನ್-ಅನ್ವಹಿಸುವಿಕೆ ಖರೀದಿಗಾಗಿ ಅಮಾನ್ಯ ಮೌಲ್ಯವನ್ನು ಒದಗಿಸಲಾಗಿದೆ. + + ನಿರೀಕ್ಷಿಸುತ್ತಿದೆ\u2026 + + ಪಾವತಿಸುವಿಕೆ ರದ್ದಾಗಿದೆ. + + Galaxy Apps ನವೀಕರಿಸಿ + + ಒಂದು ಹೊಸ ಆವೃತ್ತಿ ಲಭ್ಯವಿದೆ. ಈ ಖರೀದಿಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು Galaxy Appsನ್ನು ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗೆ ನವೀಕರಿಸಲಾಗುತ್ತದೆ. + diff --git a/IAP5Helper/src/main/res/values-ko/strings.xml b/IAP5Helper/src/main/res/values-ko/strings.xml new file mode 100644 index 0000000..ce3fc0d --- /dev/null +++ b/IAP5Helper/src/main/res/values-ko/strings.xml @@ -0,0 +1,39 @@ + + + + + 알 수 없는 오류가 발생했습니다. + + 삼성 인앱결제 + + 삼성 인앱결제를 실행할 수 없습니다. [권한]에서 다음 권한을 허용한 후 다시 시도하세요. + + 상품을 구매하려면 [삼성 인앱결제]이 필요합니다. 설치할까요? + + 삼성 인앱결제에 입력한 값이 바르지 않습니다. + + 대기 중\u2026 + + 결제를 취소합니다. + + Galaxy Apps 업데이트 + + Galaxy Apps의 새 버전이 있습니다. 구매를 완료하기 위해 Galaxy Apps를 최신 버전으로 업데이트합니다. + diff --git a/IAP5Helper/src/main/res/values-ky-rKG/strings.xml b/IAP5Helper/src/main/res/values-ky-rKG/strings.xml new file mode 100644 index 0000000..e31b0ee --- /dev/null +++ b/IAP5Helper/src/main/res/values-ky-rKG/strings.xml @@ -0,0 +1,39 @@ + + + + + Белгисиз ката пайда болду + + Samsung In-App Purchase + + Samsung In-App Purchase\'ди ачуу мүмкүн эмес. Уруксаттарга барыңыз, андан соң төмөнкүлөргө уруксат берип, дагы аракеттениңиз. + + Нерселерди сатып алуу үчүн, сизге Samsung In-App Purchase орнотуу керек. Орнотуубу? + + Samsung In-App Purchase үчүн орунсуз нарк берилди + + Күтүүдө\u2026 + + Төлөм токтотулду + + Galaxy Apps\'ты жаңыртуу + + Жаңы нуска жеткиликтүү. Galaxy Apps эң акыркы нускасына жаңыланып, бул сатып алууну аяктайт. + diff --git a/IAP5Helper/src/main/res/values-lo-rLA/strings.xml b/IAP5Helper/src/main/res/values-lo-rLA/strings.xml new file mode 100644 index 0000000..b9e0a75 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lo-rLA/strings.xml @@ -0,0 +1,39 @@ + + + + + ເກີດຄວາມຜິດພາດບໍ່ຮູ້ຈັກຂຶ້ນ. + + Samsung In-App Purchase + + ບໍ່ສາມາດເປີດ Samsung In-App Purchase. ໄປທີ່ການອະນຸຍາດ, ຈາກນັ້ນອະນຸຍາດການອະນຸຍາດທີ່ຕ້ອງການ ແລະລອງໃໝ່ອີກ. + + ເພື່ອຊື້ລາຍການຕ່າງໆ, ທ່ານຈໍາເປັນຕ້ອງຕິດຕັ້ງການຊື້ແອບຢູ່ໃນຊໍາຊູງ. ຕິດຕັ້ງບໍ? + + ຄ່າທີ່ໃຫ້ກັບການຊື້ແອັບໃນຊໍາຊຸງໃຊ້ບໍ່ໄດ້. + + ກໍາລັງລໍຖ້າ\u2026 + + ການຊໍາລະຖືກຍົກເລີກ. + + ອັບເດດ Galaxy Apps + + ລຸ້ນໃໝ່ມີຢູ່. Galaxy Apps ຈະຖືກອັບເດດເປັນລຸ້ນຫຼ້າສຸດ ເພື່ອຊື້ອັນນີ້ໃຫ້ສໍາເລັດ. + diff --git a/IAP5Helper/src/main/res/values-lt/strings.xml b/IAP5Helper/src/main/res/values-lt/strings.xml new file mode 100644 index 0000000..882b012 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lt/strings.xml @@ -0,0 +1,39 @@ + + + + + Įvyko nežinoma klaida. + + Samsung In-App Purchase + + Negalima atidaryti „Samsung In-App Purchase“. Eikite į „Leidimai“, tada suteikite reikiamus leidimus ir bandykite dar kartą. + + Norėdami įsigyti elementų, turite įdiegti „Samsung In-App Purchase“. Įdiegti? + + „Samsung In-App Purchase“ buvo pateikta neteisinga reikšmė. + + Laukiama\u2026 + + Mokėjimas atšauktas. + + Naujinti „Galaxy Apps“ + + Yra nauja versija. Siekiant užbaigti šį pirkimą, „Galaxy Apps“ bus atnaujinta į naujausią versiją. + diff --git a/IAP5Helper/src/main/res/values-lv/strings.xml b/IAP5Helper/src/main/res/values-lv/strings.xml new file mode 100644 index 0000000..fb75c98 --- /dev/null +++ b/IAP5Helper/src/main/res/values-lv/strings.xml @@ -0,0 +1,39 @@ + + + + + Radās nezināma kļūda. + + Samsung In-App Purchase + + Nevar atvērt Samsung In-App Purchase. Izvēlieties Atļaujas, pēc tam aktivizējiet nepieciešamās atļaujas un mēģiniet vēlreiz. + + Lai iegādātos objektus, ir jāinstalē Samsung In-App Purchase. Vai instalēt? + + Izmantojot Samsung In-App Purchase funkciju, tika norādīta nederīga vērtība. + + Gaida\u2026 + + Maksājums ir atcelts. + + Atjaunināt Galaxy Apps + + Pieejama jauna versija. Lai veiktu šo pirkumu, programma Galaxy Apps tiks atjaunināta uz jaunāko versiju. + diff --git a/IAP5Helper/src/main/res/values-mg/strings.xml b/IAP5Helper/src/main/res/values-mg/strings.xml new file mode 100644 index 0000000..82f1225 --- /dev/null +++ b/IAP5Helper/src/main/res/values-mg/strings.xml @@ -0,0 +1,39 @@ + + + + + Unknown error occurred. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Waiting\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-mk-rMK/strings.xml b/IAP5Helper/src/main/res/values-mk-rMK/strings.xml new file mode 100644 index 0000000..8a9842a --- /dev/null +++ b/IAP5Helper/src/main/res/values-mk-rMK/strings.xml @@ -0,0 +1,39 @@ + + + + + Дојде до непозната грешка. + + Samsung In-App Purchase + + Не може да се отвори Samsung In-App Purchase. Одете во Дозволи, а потоа овозможете ги бараните дозволи и обидете се повторно. + + За да купувате ставки, треба да го инсталирате Samsung купување во апликација. Да се инсталира? + + Дадена е неважечка вредност за Samsung In-App Purchase. + + Се чека\u2026 + + Плаќањето е одложено. + + Ажурирање на Galaxy Apps + + Достапна е нова верзија. Galaxy Apps ќе се ажурира на најновата верзија за да го завршите купувањево. + diff --git a/IAP5Helper/src/main/res/values-ml-rIN/strings.xml b/IAP5Helper/src/main/res/values-ml-rIN/strings.xml new file mode 100644 index 0000000..cf0b675 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ml-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + അജ്ഞാത പിശക് സംഭവിച്ചു. + + സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ + + സാംസങ്ങ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങൽ തുറക്കാനാവില്ല. അനുമതികൾ എന്നതിലേക്ക് പോവുക, തുടർന്ന് ആവശ്യമായ അനുമതികൾ അനുവദിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക. + + ഇനങ്ങള്‍ വാങ്ങുന്നതിന്, നിങ്ങള്‍ സാംസംഗ് ഇന്‍-ആപ്ലിക്കേഷന്‍ പര്‍ച്ചെയ്സ് ഇന്‍സ്റ്റാള്‍ ചെയ്യേണ്ടതുണ്ട്. ഇന്‍സ്റ്റാള്‍ ചെയ്യണോ? + + സാംസംഗ് ഇൻ-ആപ്ലിക്കേഷൻ വാങ്ങലിന് ലഭ്യമാക്കിയത് അസാധുവായ ഒരു മൂല്യമാണ്. + + കാക്കുന്നു\u2026 + + പണമടയ്ക്കല്‍ റദ്ദാക്കി. + + Galaxy Apps അപ്ഡേറ്റ് ചെയ്യുക + + പുതിയൊരു പതിപ്പ് ലഭ്യമാണ്. ഈ വാങ്ങൽ പൂർത്തിയാക്കുന്നതിനായി Galaxy Apps ഏറ്റവും പുതിയ പതിപ്പിലേക്ക് അപ്ഡേറ്റ് ചെയ്യപ്പെടും. + diff --git a/IAP5Helper/src/main/res/values-mn-rMN/strings.xml b/IAP5Helper/src/main/res/values-mn-rMN/strings.xml new file mode 100644 index 0000000..258d5cc --- /dev/null +++ b/IAP5Helper/src/main/res/values-mn-rMN/strings.xml @@ -0,0 +1,39 @@ + + + + + Үл мэдэх алдаа гарав + + Samsung In-App Purchase + + Samsung In-App Purchase-г нээх боломжгүй. Зөвшөөрөл рүү ороод шаардлагатай зөвшөөрлийг олгоод дахин оролд. + + Зүйлс худалдан авахын тулд, та Samsung In-App Purchase суулгах шаардлагатай. Суулгах уу? + + Samsung In-App Purchase-д хүчингүй утга өгөгдсөн + + Хүлээж байна\u2026 + + Төлбөр цуцалсан. + + Galaxy Apps шинэчлэх + + Шинэ хувилбар боломжтой. Энэ худалдан авалтыг дуусгахын тулд Galaxy Apps-г сүүлийн хувилбарт шинэчлэнэ. + diff --git a/IAP5Helper/src/main/res/values-mr-rIN/strings.xml b/IAP5Helper/src/main/res/values-mr-rIN/strings.xml new file mode 100644 index 0000000..9a289ee --- /dev/null +++ b/IAP5Helper/src/main/res/values-mr-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + अज्ञात त्रुटी आली. + + सॅमसंग इन-ऍप खरेदी + + सॅमसंग इन-ऍप पर्चेस उघडण्यात अक्षम. परवानग्यांवर जा, नंतर आवश्यक परवानग्‍यांना अनुमती द्या आणि पुन्‍हा प्रयत्‍न करा. + + आयटेम्स खरेदी करण्यासाठी, आपण सॅमसंग इन-ऍप पर्चेस इन्स्टॉल करणे गरजेचे आहे. इन्स्टॉल करायचे? + + सॅमसंग इन-ऍप पर्चेससाठी एक अग्राह्य मूल्य पुरवले गेले आहे. + + प्रतीक्षा करत आहे\u2026 + + देय रद्द केलेले. + + Galaxy Apps अद्ययावत करा + + नवीन आवृत्ती उपलब्‍ध आहे. ही खरेदी पूर्ण करण्या साठी Galaxy Apps नवीनतम आवृत्तीत अद्ययावत केले जाईल. + diff --git a/IAP5Helper/src/main/res/values-ms-rMY/strings.xml b/IAP5Helper/src/main/res/values-ms-rMY/strings.xml new file mode 100644 index 0000000..d302bab --- /dev/null +++ b/IAP5Helper/src/main/res/values-ms-rMY/strings.xml @@ -0,0 +1,39 @@ + + + + + Ralat tidak diketahui berlaku. + + Samsung In-App Purchase + + Tidak dapat membuka Samsung In-App Purchase. Pergi ke Kebenaran, kemudian berikan kebenaran yang diperlukan dan cuba lagi. + + Untuk membeli item, anda perlu memasang Belian Dalam Aplikasi Samsung. Pasang? + + Nilai tidak sah telah disediakan untuk Samsung In-App Purchase. + + Menunggu\u2026 + + Pembayaran dibatalkan. + + Kemas kini Galaxy Apps + + Versi baru tersedia. Galaxy Apps akan dikemas kini ke versi terkini untuk menyelesaikan pembelian ini. + diff --git a/IAP5Helper/src/main/res/values-my-rMM/strings.xml b/IAP5Helper/src/main/res/values-my-rMM/strings.xml new file mode 100644 index 0000000..81396fa --- /dev/null +++ b/IAP5Helper/src/main/res/values-my-rMM/strings.xml @@ -0,0 +1,39 @@ + + + + + မသိသော အမှား ဖြစ်သွားသည်။ + + Samsung In-App ဝယ်ယူမှု + + Samsung In-App ဝယ်ယူမှုကို ဖွင့်၍မရနိုင်ပါ။ ခွင့်ပြုချက်များသို့သွားပြီးနောက် လိုအပ်သည့် ခွင့်ပြုချက်များကို ခွင့်ပြုပြီး ထပ်မံကြိုးစားပါ။ + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + စောင့်နေဆဲ\u2026 + + ပေးချေမှု ပယ်ဖျက်ထားသည်။ + + Galaxy Apps ကို အပ်ဒိတ်လုပ်ပါ + + ဗားရှင်း အသစ်တစ်ခု အရန်သင့် ရနိုင်ပါသည်။ ဤဝယ်ယူမှု ပြီးမြောက်စေရန် Galaxy Apps ကို နောက်ဆုံးထုတ် ဗားရှင်းသို့ အပ်ဒိတ်လုပ်ပါလိမ့်မည်။ + diff --git a/IAP5Helper/src/main/res/values-my-rZG/strings.xml b/IAP5Helper/src/main/res/values-my-rZG/strings.xml new file mode 100644 index 0000000..c409b18 --- /dev/null +++ b/IAP5Helper/src/main/res/values-my-rZG/strings.xml @@ -0,0 +1,39 @@ + + + + + မသိရေသာ အမွား ျဖစ္ပြားသည္။ + + Samsung In-App ဝယ္ယူမႈ + + Samsung In-App ဝယ္ယူမႈကို ဖြင့္၍မရႏိုင္ပါ။ ခြင့္ျပဳခ်က္မ်ားသို႔သြားၿပီးေနာက္ လိုအပ္သည့္ ခြင့္ျပဳခ်က္မ်ားကို ခြင့္ျပဳၿပီး ထပ္မံႀကိဳးစားပါ။ + + ပစၥည္းမ်ား ဝယ္ရန္ Samsung In-App ဝယ္ယူမႈ တပ္ဆင္ဖို႔ လိုသည္။ တပ္ဆင္မည္လား? + + Samsung In-App ဝယ္ယူမႈအတြက္ အက်ဳံးမဝင္ေသာ တန္ဖိုးတစ္ခု ေပးထားသည္။ + + ေစာင့္ေနဆဲ\u2026 + + ေပးေခ်မႈ ပယ္ဖ်က္ထားသည္။ + + Galaxy Apps ကုိ အပ္ဒိတ္လုပ္ပါ + + ဗားရွင္း အသစ္တစ္ခု အရန္သင့္ ရႏိုင္ပါသည္။ ဤဝယ္ယူမႈ ၿပီးေျမာက္ေစရန္ Galaxy Apps ကို ေနာက္ဆုံးထုတ္ ဗားရွင္းသို႔ အပ္ဒိတ္လုပ္ပါလိမ့္မည္။ + diff --git a/IAP5Helper/src/main/res/values-nb/strings.xml b/IAP5Helper/src/main/res/values-nb/strings.xml new file mode 100644 index 0000000..cdfc49e --- /dev/null +++ b/IAP5Helper/src/main/res/values-nb/strings.xml @@ -0,0 +1,39 @@ + + + + + Ukjent feil oppstod. + + Samsung In-App Purchase + + Kan ikke åpne Samsung In-App Purchase. Gå til Tillatelser, tillat de nødvendige tillatelsene, og prøv igjen. + + Du må installere Samsung In-App Purchase før du kan kjøpe noe. Installere? + + Det har blitt oppgitt en ugyldig verdi for Samsung In-App Purchase. + + Venter\u2026 + + Betaling avbrutt. + + Oppdater Galaxy Apps + + En ny versjon er tilgjengelig. Galaxy Apps blir oppdatert til den nyeste versjonen for å fullføre dette kjøpet. + diff --git a/IAP5Helper/src/main/res/values-ne-rNP/strings.xml b/IAP5Helper/src/main/res/values-ne-rNP/strings.xml new file mode 100644 index 0000000..0a80722 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ne-rNP/strings.xml @@ -0,0 +1,39 @@ + + + + + अज्ञात त्रुटि देखियो। + + सैमसंग इन-एप खरिद + + सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्। + + वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने? + + सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ। + + प्रतीक्षा गर्दै\u2026 + + भुक्तानी रद्द गरियो। + + Galaxy Apps लाई अपडेट गर्नुहोस् + + एउटा नयाँ संस्करण उपलब्ध छ। यो खरिद पूरा गर्न Galaxy Apps लाई नवीनतम संस्करणमा अपडेट गरिने छ। + diff --git a/IAP5Helper/src/main/res/values-ne/strings.xml b/IAP5Helper/src/main/res/values-ne/strings.xml new file mode 100644 index 0000000..0a80722 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ne/strings.xml @@ -0,0 +1,39 @@ + + + + + अज्ञात त्रुटि देखियो। + + सैमसंग इन-एप खरिद + + सैमसंग इन-एप खरिद खोल्न असमर्थ। अनुमतिहरूमा जानुहोस्, त्यसपछि आवश्यक अनुमतिहरू दिनुहोस् र फेरि प्रयास गर्नुहोस्। + + वस्तुहरू खरिद गर्नको लागि, सैमसंग इन-एप पर्चेज स्थापना गर्न आवश्यक छ। स्थापना गर्ने? + + सैमसंग इन-एप खरीद को लागि एउटा अमान्य मान प्रदान गरिएको छ। + + प्रतीक्षा गर्दै\u2026 + + भुक्तानी रद्द गरियो। + + Galaxy Apps लाई अपडेट गर्नुहोस् + + एउटा नयाँ संस्करण उपलब्ध छ। यो खरिद पूरा गर्न Galaxy Apps लाई नवीनतम संस्करणमा अपडेट गरिने छ। + diff --git a/IAP5Helper/src/main/res/values-nl/strings.xml b/IAP5Helper/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000..59dca90 --- /dev/null +++ b/IAP5Helper/src/main/res/values-nl/strings.xml @@ -0,0 +1,39 @@ + + + + + Onbekende netwerkfout opgetreden + + Samsung Kopen in app + + Kan Samsung Kopen in app niet openen. Ga naar Machtigingen, sta de vereiste machtigingen toe en probeer het opnieuw. + + Als u artikelen wilt kopen, moet u Samsung Kopen in app installeren. Installeren? + + Er is een ongeldige waarde opgegeven voor Samsung Kopen in app. + + Wachten\u2026 + + Betaling geannuleerd. + + Galaxy Apps bijwerken + + Er is een nieuwe versie beschikbaar. Galaxy Apps wordt bijgewerkt tot de laatste versie om deze aankoop te voltooien. + diff --git a/IAP5Helper/src/main/res/values-or/strings.xml b/IAP5Helper/src/main/res/values-or/strings.xml new file mode 100644 index 0000000..b512502 --- /dev/null +++ b/IAP5Helper/src/main/res/values-or/strings.xml @@ -0,0 +1,39 @@ + + + + + ଅଜଣା ତ୍ରୁଟି ଘଟିଛି। + + ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ + + ସାମସଙ୍ଗ ଇନ-ଆପସ୍ କ୍ରୟ ଖୋଲିବାକୁ ଅସମର୍ଥ। ଅନୁମତିଗୁଡିକୁ ଯାଆନ୍ତୁ, ତାପରେ ଆବଶ୍ୟକୀୟ ଅନୁମତିଗୁଡିକ ଅନୁମତି ଦିଅନ୍ତୁ ଏବଂ ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ। + + ଆଇଟମ୍ କ୍ରୟ କରିବାକୁ, ଆପଣ ସାମ୍‌ସଙ୍ଗ ଇନ୍-ଆପ୍ କ୍ରୟସଂସ୍ଥାପନ କରିବା ଆବଶ୍ୟକ କରନ୍ତି। ସଂସ୍ଥାପନ କରିବେ? + + Samsung In-App Purchase ପାଇଁ ଏକ ଅବୈଧ ମୂଲ୍ୟ ପ୍ରଦାନ କରାଯାଇଛି। + + ଅପେକ୍ଷା କରୁଛି\u2026 + + ଦେୟ ବାତିଲ୍ ହୋଇଛି। + + Galaxy Apps ଅପଡେଟ୍‌ କରନ୍ତୁ + + ଏକ ନୂତନ ସଂସ୍କରଣ ଉପଲବ୍ଧ। Galaxy Apps ଏହି କ୍ରୟ ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ନବୀନତ୍ତମ ସଂସ୍କରଣକୁ ଅପଡେଟ୍‌ ହେବ। + diff --git a/IAP5Helper/src/main/res/values-pa-rIN/strings.xml b/IAP5Helper/src/main/res/values-pa-rIN/strings.xml new file mode 100644 index 0000000..86cec7c --- /dev/null +++ b/IAP5Helper/src/main/res/values-pa-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + ਅਗਿਆਤ ਤਰੁੱਟੀ ਉਤਪੰਨ ਹੋਈ। + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਖਰੀਦਦਾਰੀ + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਭੁਗਤਾਨ ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਮਰੱਥ। ਅਨੁਮਤੀਆਂ ਤੇ ਜਾਉ, ਫਿਰ ਲੋੜੀਂਦੀਆਂ ਅਨੁਮਤੀਆਂ ਨੂੰ ਆਗਿਆ ਦਿਉ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। + + ਆਈਟਮ ਖਰੀਦਣ ਦੇ ਲਈ, ਤੁਹਾਨੂੰ ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਸਥਾਪਿਤ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਸਥਾਪਿਤ ਕਰੋ? + + ਸੈਮਸੰਗ ਇਨ-ਐਪ ਪਰਚੇਜ਼ ਦੇ ਲਈ ਇੱਕ ਅਵੈਧ ਮਾਨ ਪ੍ਰਦਾਨ ਕੀਤਾ ਗਿਆ ਹੈ। + + ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ\u2026 + + ਭੁਗਤਾਨ ਰੱਦ ਕੀਤੀ ਗਈ। + + Galaxy Apps ਨੂੰ ਅਪਡੇਟ ਕਰੋ + + ਇੱਕ ਨਵਾਂ ਸੰਸਕਰਣ ਉਪਲਬਧ ਹੈ। ਇਸ ਖਰੀਦਦਾਰੀ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ Galaxy Apps ਨੂੰ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਤੇ ਅਪਡੇਟ ਕੀਤਾ ਜਾਵੇਗਾ। + diff --git a/IAP5Helper/src/main/res/values-pl-rSP/strings.xml b/IAP5Helper/src/main/res/values-pl-rSP/strings.xml new file mode 100644 index 0000000..f976668 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pl-rSP/strings.xml @@ -0,0 +1,39 @@ + + + + + Zaszeł niyznany feler + + Sprowōnki rajn apl. Samsung + + Niy idzie ôdewrzić aplikacyji Sprŏwōnki we strzodku aplikacyji fyrmy Samsung. Przelyź do Uprŏwniyń, a potym załōncz wymŏgane uprŏwniynia i badnij drugi rŏz. + + Cobyś poradziōł kupować elemynty, trza zainsztalować usuga Zakupy w aplikacyji gyszeftu Samsung. Zainsztalować? + + Do usugi Zakupy w aplikacyji gyszeftu Samsung dostarczōno niyprawŏ wartość. + + Czekanie… + + Płat pociepany. + + Uaktualniynie Galaxy Apps + + Do chycynio je nowo wersyjo. Aplikacyjo Galaxy Apps bydzie uaktualniōno do nojnowszyj wersyji coby zrobić tyn sprŏwōnek. + diff --git a/IAP5Helper/src/main/res/values-pl/strings.xml b/IAP5Helper/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000..20ded52 --- /dev/null +++ b/IAP5Helper/src/main/res/values-pl/strings.xml @@ -0,0 +1,39 @@ + + + + + Wystąpił nieznany błąd. + + Zakupy wewn. apl. Samsung + + Nie można otworzyć aplikacji Zakupy wewnątrz aplikacji firmy Samsung. Przejdź do Uprawnień, a następnie włącz wymagane uprawnienia i spróbuj ponownie. + + Aby móc kupować elementy, musisz zainstalować usługę Zakupy wewnątrz aplikacji firmy Samsung. Zainstalować? + + Do usługi Zakupy wewnątrz aplikacji firmy Samsung dostarczono nieprawidłową wartość. + + Oczekiwanie\u2026 + + Płatność anulowana. + + Aktualizacja Galaxy Apps + + Dostępna jest nowa wersja. Aplikacja Galaxy Apps zostanie zaktualizowana do najnowszej wersji w celu dokonania tego zakupu. + diff --git a/IAP5Helper/src/main/res/values-pt-rBR/strings.xml b/IAP5Helper/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..54b6d4e --- /dev/null +++ b/IAP5Helper/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,39 @@ + + + + + Ocorreu erro desconhecido. + + Compra no aplic. Samsung + + Não é possível abrir Compra no aplicativo Samsung. Vá para Permissões, autorize as permissões necessárias e tente novamente. + + Para comprar itens, é necessário instalar o Compra no Aplicativo Samsung. Instalar? + + Um valor inválido foi fornecido para a Compra no aplicativo Samsung. + + Aguardando\u2026 + + Pagamento cancelado. + + Atualizar o Galaxy Apps + + Uma nova versão está disponível. O Galaxy Apps será atualizado para a versão mais recente para concluir esta compra. + diff --git a/IAP5Helper/src/main/res/values-pt-rPT/strings.xml b/IAP5Helper/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000..31b3cdb --- /dev/null +++ b/IAP5Helper/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,39 @@ + + + + + Ocorreu erro desconhecido. + + Samsung In-App Purchase + + Impossível abrir a Samsung In-App Purchase. Aceda a Permissões, autorize as permissões necessárias e tente novamente. + + Para comprar itens, tem de instalar a Samsung In-App Purchase. Instalar? + + Foi fornecido um valor inválido para Samsung In-App Purchase. + + A aguardar\u2026 + + Pagamento cancelado. + + Actualizar Galaxy Apps + + Está disponível uma nova versão. A Galaxy Apps será actualizada para a versão mais recente, para concluir esta compra. + diff --git a/IAP5Helper/src/main/res/values-ro/strings.xml b/IAP5Helper/src/main/res/values-ro/strings.xml new file mode 100644 index 0000000..3ee6923 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ro/strings.xml @@ -0,0 +1,39 @@ + + + + + A avut loc o eroare necunoscută. + + Achiz. Samsung din apl. + + Nu se poate deschide Achiziţionare Samsung din cadrul aplicaţiilor. Accesaţi Permisiuni, apoi acordaţi permisiunile necesare şi încercaţi din nou. + + Pentru a achiziţiona elemente, trebuie să instalaţi Achiziţionarea Samsung din cadrul aplicaţiilor. Instalaţi? + + A fost furnizată o valoare nevalidă pentru Achiziţionarea Samsung din cadrul aplicaţiilor. + + Se aşteaptă\u2026 + + Plată anulată + + Actualizare Galaxy Apps + + Este disponibilă o nouă versiune. Galaxy Apps se va actualiza la cea mai recentă versiune pentru a finaliza achiziția. + diff --git a/IAP5Helper/src/main/res/values-ru/strings.xml b/IAP5Helper/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..768df9a --- /dev/null +++ b/IAP5Helper/src/main/res/values-ru/strings.xml @@ -0,0 +1,39 @@ + + + + + Возникла неизвестная ошибка. + + Samsung In-App Purchase + + Невозможно открыть Samsung In-App Purchase. Перейдите в “Разрешения” и повторите попытку, предоставив необходимые разрешения. + + Для покупки необходимо установить Samsung In-App Purchase. Установить? + + Указано недопустимое значение для Samsung In-App Purchase. + + Ожидание\u2026 + + Платеж отменен. + + Обновление Galaxy Apps + + Доступна новая версия Galaxy Apps. Для завершения покупки приложение будет обновлено до последней версии. + diff --git a/IAP5Helper/src/main/res/values-si-rLK/strings.xml b/IAP5Helper/src/main/res/values-si-rLK/strings.xml new file mode 100644 index 0000000..2c217e2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-si-rLK/strings.xml @@ -0,0 +1,39 @@ + + + + + නොදන්නා දෝෂයක් ඇතිවිය. + + සැම්සුං අ.-යෙදුම් මි. ගැ. + + සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්‍ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න. + + අයිතම මිල දී ගැනීමට ඔබ Samsung Apps-තුළ මිලදී ගැනීම ස්ථාපනය කරගත යුතුය. ස්ථාපනය කරන්නද? + + Samsung Apps-තුළ මිලදී ගැනීම් සඳහා අවලංගු අගයක් සපයා ඇත. + + රැඳී සිටිමින්\u2026 + + ගෙවීම අවලංගු විය. + + Galaxy Apps යාවත්කාලය + + නව අනුවාදයක් ඇත. මෙම මිලට ගැනුම සම්පූර්ණ කිරීමට Galaxy Apps නවතම අනුවාදයට යාවත්කාල වනු ඇත. + diff --git a/IAP5Helper/src/main/res/values-si/strings.xml b/IAP5Helper/src/main/res/values-si/strings.xml new file mode 100644 index 0000000..2c217e2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-si/strings.xml @@ -0,0 +1,39 @@ + + + + + නොදන්නා දෝෂයක් ඇතිවිය. + + සැම්සුං අ.-යෙදුම් මි. ගැ. + + සැම්සුං අන්තර්-යෙදුම් මිලට ගැනුම විවෘත කළ නොහැක. අවසර වෙත යන්න, එවිට අවශ්‍ය අවසරයන්ට ඉඩ දී නැවත උත්සාහ කරන්න. + + අයිතම මිල දී ගැනීමට ඔබ Samsung Apps-තුළ මිලදී ගැනීම ස්ථාපනය කරගත යුතුය. ස්ථාපනය කරන්නද? + + Samsung Apps-තුළ මිලදී ගැනීම් සඳහා අවලංගු අගයක් සපයා ඇත. + + රැඳී සිටිමින්\u2026 + + ගෙවීම අවලංගු විය. + + Galaxy Apps යාවත්කාලය + + නව අනුවාදයක් ඇත. මෙම මිලට ගැනුම සම්පූර්ණ කිරීමට Galaxy Apps නවතම අනුවාදයට යාවත්කාල වනු ඇත. + diff --git a/IAP5Helper/src/main/res/values-sk/strings.xml b/IAP5Helper/src/main/res/values-sk/strings.xml new file mode 100644 index 0000000..a23c22e --- /dev/null +++ b/IAP5Helper/src/main/res/values-sk/strings.xml @@ -0,0 +1,39 @@ + + + + + Vyskytla sa neznáma chyba. + + Nákup v aplik. Samsung + + Aplikácia Nákup v aplikáciách Samsung sa nedá otvoriť. Prejdite do menu Povolenia, udeľte potrebné povolenia a skúste to znova. + + Ak si chcete kúpiť nejaké položky, musíte si nainštalovať aplikáciu Samsung nákup v aplikáciách. Nainštalovať? + + Pre službu Nákup v aplikáciách Samsung bola poskytnutá neplatná hodnota. + + Čaká sa\u2026 + + Platba bola zrušená. + + Galaxy Apps – aktualizácia + + K dispozícii je nová verzia. Aplikácia Galaxy Apps sa aktualizuje na najnovšiu verziu, aby ste mohli dokončiť tento nákup. + diff --git a/IAP5Helper/src/main/res/values-sl/strings.xml b/IAP5Helper/src/main/res/values-sl/strings.xml new file mode 100644 index 0000000..3ebed4a --- /dev/null +++ b/IAP5Helper/src/main/res/values-sl/strings.xml @@ -0,0 +1,39 @@ + + + + + Prišlo je do neznane napake. + + Nakup v aplikaciji Samsung + + Aplikacije Samsung In-App Purchase ni mogoče odpreti. Pojdite v meni Dovoljenja, nato pa omogočite zahtevana dovoljenja in poskusite znova. + + Če želite kupiti izdelke, morate namestiti aplikacijo Samsung nakup v aplikaciji. Jo želite namestiti? + + Podana je neveljavna vrednost za nakup v aplikaciji Samsung. + + Čakanje \u2026 + + Plačilo je preklicano. + + Posodobite aplikacijo Galaxy Apps + + Na voljo je nova različica. Za dokončanje tega nakupa bo aplikacija Galaxy Apps posodobljena na najnovejšo različico. + diff --git a/IAP5Helper/src/main/res/values-sq-rAL/strings.xml b/IAP5Helper/src/main/res/values-sq-rAL/strings.xml new file mode 100644 index 0000000..63e6485 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sq-rAL/strings.xml @@ -0,0 +1,39 @@ + + + + + Ndodhi gabim i panjohur. + + Blerja nga app-i Samsung + + Nuk mund të hap Blerjen që nga aplikacioni Samsung. Shko te Lejet, pastaj jep lejet e nevojshme dhe provo sërish. + + Për të blerë gjëra, duhet të instalosh Blerjen që nga aplikacionet Samsung. Ta instaloj? + + Është futur një vlerë e pavlefshme për Blerjen që nga aplikacionet Samsung. + + Duke pritur\u2026 + + Pagesa u anulua. + + Përditëso Galaxy Apps + + Ka një version të ri. Për ta përfunduar këtë blerje, Galaxy Apps do të përditësohet në versionin më të fundit. + diff --git a/IAP5Helper/src/main/res/values-sr/strings.xml b/IAP5Helper/src/main/res/values-sr/strings.xml new file mode 100644 index 0000000..86389e3 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sr/strings.xml @@ -0,0 +1,39 @@ + + + + + Došlo je do nepoznate greške. + + Samsung In-App Purchase + + Nije moguće otvoriti aplikaciju Samsung In-App Purchase. Idite na Dozvole, a zatim dozvolite potrebne dozvole i pokušajte ponovo. + + Da bi kupio/la stavke, moraš da instaliraš Samsung kupovinu iz aplikacije. Instalirati? + + Neispravna vrednost je obezbeđena za uslugu Samsung In-App Purchase. + + Čekanje\u2026 + + Plaćanje je otkazano. + + Ažurirajte Galaxy Apps + + Nova verzija je dostupna. Galaxy Apps će se ažurirati na najnoviju verziju kako bi se dovršila ova kupovina. + diff --git a/IAP5Helper/src/main/res/values-sv/strings.xml b/IAP5Helper/src/main/res/values-sv/strings.xml new file mode 100644 index 0000000..b1537a4 --- /dev/null +++ b/IAP5Helper/src/main/res/values-sv/strings.xml @@ -0,0 +1,39 @@ + + + + + Okänt fel inträffade. + + Samsung-pr. f. köp i pr. + + Det går inte att öppna Samsung-appen för att köpa i appar. Öppna Behörigheter och tillåt sedan de nödvändiga behörigheterna innan du försöker igen. + + Om du vill köpa objekt måste du installera Samsung-appen för att köpa i appar. Vill du installera? + + Ett ogiltigt värde har tillhandahållits för Samsung-appen för att köpa i appar. + + Väntar \u2026 + + Betalningen avbröts. + + Uppdatera Galaxy Apps + + En ny version är tillgänglig. Galaxy Apps uppdateras till den senaste versionen så att du kan slutföra köpet. + diff --git a/IAP5Helper/src/main/res/values-ta-rIN/strings.xml b/IAP5Helper/src/main/res/values-ta-rIN/strings.xml new file mode 100644 index 0000000..294eafa --- /dev/null +++ b/IAP5Helper/src/main/res/values-ta-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + தெரியாத பிழை ஏற்பட்டுள்ளது. + + சாம்சங் இன்-ஆப் வாங்குதல் + + சாம்சங் இன்-ஆப் வாங்குதலை திறக்க இயலவில்லை. அனுமதிகள் என்பதற்குச் சென்று, பிறகு தேவையான அனுமதிகளை அனுமதித்து, மீண்டும் முயலவும். + + உருப்படிகளை வாங்க சாம்சங் உள்-ப.பாட்டு வாங்குதலை நீங்கள் நிறுவ வேண்டும். நிறுவவா? + + சாம்சங் பயன்பாட்டுக்கு உள்ளான வாங்குதலுக்கு ஒரு தவறான மதிப்பு வழங்கப்பட்டது. + + காத்திருக்கிறது\u2026 + + கட்டணத்தொகை ரத்து செய்யப்பட்டது. + + Galaxy Apps-ஐ புதுப்பிக்கவும் + + புதிய பதிப்பு கிடைக்கிறது. இந்த வாங்குதலை முடிப்பதற்காக Galaxy Apps அதன் சமீபத்திய பதிப்பிற்குப் புதுப்பிக்கப்படும். + diff --git a/IAP5Helper/src/main/res/values-te-rIN/strings.xml b/IAP5Helper/src/main/res/values-te-rIN/strings.xml new file mode 100644 index 0000000..39a2075 --- /dev/null +++ b/IAP5Helper/src/main/res/values-te-rIN/strings.xml @@ -0,0 +1,39 @@ + + + + + తెలియని లోపం ఏర్పడింది. + + స్యామ్‌సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు + + స్యామ్‌సంగ్ ఇన్-యాప్ కొనుగోలును తెరవడం సాధ్యం కాదు. అనుమతులకు వెళ్లి, ఆపై అవసరమైన అనుమతులను అనుమతించి, మళ్లీ ప్రయత్నించండి. + + ఐటెమ్‌లను కొనుగోలు చేయడానికి, మీరు స్యామ్‌సంగ్ ఇన్-యాప్ కొనుగోలును వ్యవస్థాపించాలి. వ్యవస్థాపించాలా? + + స్యామ్‌సంగ్ ఇన్-అప్లికేషన్ కొనుగోలు కోసం చెల్లని విలువ అందించబడింది. + + వేచి ఉంది\u2026 + + చెల్లింపు విఫలమైంది. + + Galaxy Appsని అప్‌డేట్ చేయి + + కొత్త వెర్షన్ అందుబాటులో ఉంది. ఈ కొనుగోలును పూర్తి చేయడం కోసం Galaxy Apps ఇటీవలి వెర్షన్‌కు అప్‌డేట్ చేయబడుతుంది. + diff --git a/IAP5Helper/src/main/res/values-tg/strings.xml b/IAP5Helper/src/main/res/values-tg/strings.xml new file mode 100644 index 0000000..5f2684e --- /dev/null +++ b/IAP5Helper/src/main/res/values-tg/strings.xml @@ -0,0 +1,39 @@ + + + + + Хатогии номаълум ба амал омад + + Samsung In-App Purchase + + Кушодани Samsung In-App Purchase ғайриимкон аст. Ба Иҷозатҳо гузашта, иҷозатҳои лозимро бидиҳед ва кӯшишро такрор кунед. + + Барои харидани ин ҷузъҳо шумо бояд Samsung In-App Purchase-ро насб кунед. Насб мекунед? + + Барои Samsung In-App Purchase қимати нодуруст пешниҳод карда шуд + + Интизорӣ\u2026 + + Пардохт бекор карда шуд + + Навсозии Galaxy Apps + + Версияи нав дастрас аст. Барои анҷом додани харид Galaxy Apps то версияи охирин навсозӣ карда мешавад. + diff --git a/IAP5Helper/src/main/res/values-th/strings.xml b/IAP5Helper/src/main/res/values-th/strings.xml new file mode 100644 index 0000000..666993a --- /dev/null +++ b/IAP5Helper/src/main/res/values-th/strings.xml @@ -0,0 +1,39 @@ + + + + + เกิด​ข้อ​ผิด​พลาด​ที่​ไม่​รู้จัก + + การสั่งซื้อในแอพของ Samsung + + ไม่สามารถเปิดการสั่งซื้อในแอพของ Samsung ได้ ไปที่การอนุญาต แล้วให้อนุญาตดังต่อไปนี้แล้วลองอีกครั้ง: + + ในการซื้อรายการต่างๆ คุณต้องติดตั้งการสั่งซื้อในแอพของ Samsung ติดตั้ง? + + มีการระบุค่าไม่ถูกต้อง สำหรับการสั่งซื้อในแอพของ Samsung + + กำลังรอ\u2026 + + การชำระเงินถูกยกเลิก + + อัพเดท Galaxy Apps + + มีเวอร์ชั่นใหม่พร้อมใช้งาน Galaxy Apps จะถูกอัพเดทเป็นเวอร์ชั่นล่าสุด เพื่อทำการซื้อครั้งนี้ให้เสร็จสิ้น + diff --git a/IAP5Helper/src/main/res/values-tk/strings.xml b/IAP5Helper/src/main/res/values-tk/strings.xml new file mode 100644 index 0000000..9784924 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tk/strings.xml @@ -0,0 +1,39 @@ + + + + + Bilinmedik näsazlygy bar + + Samsung In-App Purchase + + Samsung In-App Purchase-i açyp bolmaýar. Rugsatlar-a baryp, gerekli rugsatlary beriň we täzeden synanyşyň. + + Elementleri satyn almak üçin Samsung Gollanmada Satyn almany guruň. Gurulsynmy? + + Samsung Gollanmada Satyn alma üçin ýalňyş ulylyk berildi + + Garaşylýar\u2026 + + Töleg ýatyryldy + + Galaxy Apps-y täzele + + Täze wersiýa elýeterli. Bu satyn alşy tamamlamak üçin, Galaxy Apps-yň iň täze wersiýasy gurnalar. + diff --git a/IAP5Helper/src/main/res/values-tl/strings.xml b/IAP5Helper/src/main/res/values-tl/strings.xml new file mode 100644 index 0000000..b66e743 --- /dev/null +++ b/IAP5Helper/src/main/res/values-tl/strings.xml @@ -0,0 +1,39 @@ + + + + + May naganap na hindi alam na error. + + Samsung In-App Purchase + + Hindi mabuksan ang Samsung In-App Purchase. Pumunta sa Permissions, tapos payagan ang mga kailangang pahintulot at subukang muli. + + Upang bumili ng mga item, kailangan mong i-install ang Samsung In-App Purchase. I-install? + + May ibinigay na hindi tamang halaga para sa Samsung In-App Purchase. + + Naghihintay\u2026 + + Kinansela ang pagbabayad. + + I-update ang Galaxy Apps + + May bagong bersiyon na magagamit. Ia-update ang Galaxy Apps sa pinakabagong bersiyon para tapusin ang pagbili na ito. + diff --git a/IAP5Helper/src/main/res/values-tr/strings.xml b/IAP5Helper/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..f02cd9c --- /dev/null +++ b/IAP5Helper/src/main/res/values-tr/strings.xml @@ -0,0 +1,39 @@ + + + + + Bilinmeyen hata oluştu. + + Samsung In-App Satın Alma + + Samsung In-App Satın Alma açılamıyor. İzinler bölümüne gidin, ardından gerekli izinleri verip tekrar deneyin. + + Ögeleri satın almak için Samsung In-App Satın alma\'yı kurmanız gerekir. Kurulsun mu? + + Samsung In-App Satın Alımı için geçersiz bir değer sağlandı. + + Bekliyor\u2026 + + Ödeme iptal edildi. + + Galaxy Apps\'i güncelle + + Yeni bir sürüm mevcut. Bu satın alma işlemini tamamlamak için Galaxy Apps en son sürüme güncellenecek. + diff --git a/IAP5Helper/src/main/res/values-uk/strings.xml b/IAP5Helper/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000..33513ed --- /dev/null +++ b/IAP5Helper/src/main/res/values-uk/strings.xml @@ -0,0 +1,39 @@ + + + + + Сталася невідома помилка. + + Samsung In-App Purchase + + Неможливо відкрити Samsung In-App Purchase. Перейдіть до «Дозволи» і повторіть спробу, надавши необхідні дозволи. + + Для придбання об\'єктів потрібно встановити Samsung In-App Purchase. Установити? + + Для Samsung In-App Purchase вказано хибне значення. + + Очікування\u2026 + + Платіж скасовано. + + Оновлення Galaxy Apps + + Доступна нова версія Galaxy Apps. Для завершення покупки програму буде оновлено до останньої версії. + diff --git a/IAP5Helper/src/main/res/values-ur-rPK/strings.xml b/IAP5Helper/src/main/res/values-ur-rPK/strings.xml new file mode 100644 index 0000000..49ddf43 --- /dev/null +++ b/IAP5Helper/src/main/res/values-ur-rPK/strings.xml @@ -0,0 +1,39 @@ + + + + + نامعلوم غلطی واقع ہوگئی + + ‏Samsung In-App خریداری + + ‏Samsung In-App خریداری کھولنے سے قاصر۔ اجازتوں پر جائیں، پھر درکار اجازتوں کی اجازت دیں اور دوبارہ کوشش کریں۔ + + اشیا خریداری کرنے کے لئے، آپ کو Samsung In-App خریداری نصب کرنے کی ضرورت ہے۔ نصب کریں؟ + + ‏Samsung In-App خریداری کے لئے ایک غیرمجاز قیمت فراہم کی گئی ہے + + انتظار کررہا ہے\u2026 + + ادائیگی منسوخ ہوگئی۔ + + ‏Galaxy Apps اپ ڈیٹ کریں + + ایک نیا ورژن دستیاب ہے۔ یہ خریداری مکمل کرنے کے لیے Galaxy Apps کو تازہ ترین ورژن میں اپ ڈیٹ کیا جائے گا۔ + diff --git a/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml b/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml new file mode 100644 index 0000000..d323ee2 --- /dev/null +++ b/IAP5Helper/src/main/res/values-uz-rUZ/strings.xml @@ -0,0 +1,39 @@ + + + + + Noma’lum xato yuz berdi. + + Samsung In-App Purchase + + Samsung In-App Purchase’ni ochib bo‘lmaydi. Ruxsatlarga o‘ting, so‘ngra quyidagi ruxsatlarga ijozat bering va qayta urinib ko‘ring. + + Elementlarni xarid qilish uchun Samsung In-App Purchase-ni o‘rnating. O‘rnatilsinmi? + + Samsung In-App Purchase uchun mumkin bo‘lmagan qiymat taqdim etilgan. + + Kutilmoqda\u2026 + + To‘lov bekor qilindi. + + Galaxy Apps’ni yangilash + + Yangi versiya mavjud. Ushbu xaridni nihoyasiga yetkazish uchun Galaxy Apps eng oxirgi versiyaga yangilanadi. + diff --git a/IAP5Helper/src/main/res/values-vi/strings.xml b/IAP5Helper/src/main/res/values-vi/strings.xml new file mode 100644 index 0000000..1229d4a --- /dev/null +++ b/IAP5Helper/src/main/res/values-vi/strings.xml @@ -0,0 +1,39 @@ + + + + + Xảy ra lỗi. + + Mua hàng trong ứ.dụng Samsung + + Không thể mở Mua hàng trong ứng dụng Samsung. Đi đến Quyền, rồi cho phép các quyền cần thiết và thử lại. + + Để mua hàng, bạn cần cài đặt Mua hàng trong ứng dụng Samsung. Cài đặt? + + Đã cung cấp một giá trị không hợp lệ cho hình thức Mua hàng trong ứng dụng Samsung. + + Đang chờ\u2026 + + Đã hủy thanh toán. + + Cập nhật Galaxy Apps + + Đã có phiên bản mới. Galaxy Apps sẽ được cập nhật lên phiên bản mới nhất để hoàn tất giao dịch mua này. + diff --git a/IAP5Helper/src/main/res/values-xh/strings.xml b/IAP5Helper/src/main/res/values-xh/strings.xml new file mode 100644 index 0000000..a35d420 --- /dev/null +++ b/IAP5Helper/src/main/res/values-xh/strings.xml @@ -0,0 +1,39 @@ + + + + + Kwenzeke impazamo engaziwayo. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Ilindile\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values-zh-rCN/strings.xml b/IAP5Helper/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..c3fd712 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,39 @@ + + + + + 未知错误产生 + + Samsung In-App Purchase + + 无法打开 Samsung In-App Purchase。请进入【权限】,然后允许以下权限并重试。 + + 若要购买商品,您需要安装 Samsung In-App Purchase。是否安装? + + Samsung In-App Purchase 已获取一个无效值。 + + 请稍候\u2026 + + 支付已取消。 + + 更新三星应用商店 + + 有新版本可用。三星应用商店将更新至最新版本以完成本次购物。 + diff --git a/IAP5Helper/src/main/res/values-zh-rHK/strings.xml b/IAP5Helper/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 0000000..8b6dd2d --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,39 @@ + + + + + 發生未知錯誤。 + + Samsung In-App Purchase + + 無法開啟 Samsung In-App Purchase。請前往 [權限],然後允許權限並重試。 + + 若要購買項目,需安裝 Samsung In-App Purchase。安裝嗎? + + 提供給 Samsung In-App Purchase 的值無效。 + + 請稍候\u2026 + + 付款已取消。 + + 更新 Galaxy Apps + + 已有新版本可用。Galaxy Apps 將更新至最新版本以完成此購買。 + diff --git a/IAP5Helper/src/main/res/values-zh-rTW/strings.xml b/IAP5Helper/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..b8f1f94 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,39 @@ + + + + + 已發生未知錯誤。 + + Samsung In-App Purchase + + 無法開啟 [三星應用程式內購買]。請前往 [權限],然後允許所需權限並重試。 + + 若要購買項目,需安裝 Samsung In-App Purchase。安裝嗎? + + 提供給 Samsung In-App Purchase 的值無效。 + + 等待中\u2026 + + 付款已取消。 + + 更新 Galaxy Apps + + 有可用的新版本。Galaxy Apps 將更新至最新版本以完成此筆購買。 + diff --git a/IAP5Helper/src/main/res/values-zu/strings.xml b/IAP5Helper/src/main/res/values-zu/strings.xml new file mode 100644 index 0000000..5aa5031 --- /dev/null +++ b/IAP5Helper/src/main/res/values-zu/strings.xml @@ -0,0 +1,39 @@ + + + + + Kuvule iphutha elingaziwa. + + Samsung In-App Purchase + + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + + To purchase items, you need to install Samsung In-App Purchase. Install? + + An invalid value has been provided for Samsung In-App Purchase. + + Ilindile\u2026 + + Payment cancelled. + + Update Galaxy Apps + + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + diff --git a/IAP5Helper/src/main/res/values/dimen.xml b/IAP5Helper/src/main/res/values/dimen.xml new file mode 100644 index 0000000..a0f08c4 --- /dev/null +++ b/IAP5Helper/src/main/res/values/dimen.xml @@ -0,0 +1,4 @@ + + + 15dp + \ No newline at end of file diff --git a/IAP5Helper/src/main/res/values/strings.xml b/IAP5Helper/src/main/res/values/strings.xml new file mode 100644 index 0000000..53cfc04 --- /dev/null +++ b/IAP5Helper/src/main/res/values/strings.xml @@ -0,0 +1,19 @@ + + + Unknown error occurred. + Samsung In-App Purchase + Unable to open Samsung In-App Purchase. Go to Permissions, then allow the required permissions and try again. + An invalid value has been provided for Samsung In-App Purchase. + Payment cancelled. + Update Galaxy Apps + A new version is available. Galaxy Apps will be updated to the latest version to complete this purchase. + Waiting... + + + "An invalid installation of In-App Purchase has been detected. Check and try again." + The payment was successful + + + To purchase items, you need to install Samsung In-App Purchase. Install? + + \ No newline at end of file diff --git a/IAP5Helper/src/main/res/values/styles.xml b/IAP5Helper/src/main/res/values/styles.xml new file mode 100644 index 0000000..3f39454 --- /dev/null +++ b/IAP5Helper/src/main/res/values/styles.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 3f464a4..5704bb5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,10 +42,18 @@ android { } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + flavorDimensions "platform" + productFlavors { + standard {} + samsung { + applicationId "com.wbrawner.simplemarkdown.samsung" + minSdkVersion 21 + } + } dexOptions { jumboMode true } @@ -61,29 +69,38 @@ ext { } dependencies { - testCompile 'junit:junit:4.12' - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - compile "com.android.support:appcompat-v7:$support_version" - compile 'com.android.support.constraint:constraint-layout:1.0.2' - compile "com.android.support:design:$support_version" - compile "com.android.support:support-v13:$support_version" - compile 'com.commonsware.cwac:anddown:0.3.0' - compile 'com.google.dagger:dagger:2.11' - compile 'com.jakewharton:butterknife:8.7.0' - compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0' - compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0' - compile 'io.reactivex.rxjava2:rxandroid:2.0.1' - compile 'io.reactivex.rxjava2:rxjava:2.1.0' - testImplementation "org.robolectric:robolectric:3.6.1" - androidTestCompile 'com.android.support.test.espresso:espresso-core:3.0.1' - androidTestCompile 'com.android.support.test:runner:1.0.1' - androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' + annotationProcessor 'com.google.dagger:dagger-compiler:2.11' annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0' - compile('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') { + + testImplementation 'junit:junit:4.12' + testImplementation "org.robolectric:robolectric:3.6.1" + + implementation fileTree(dir: 'libs', include: ['*.jar']) + + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' + + implementation "com.android.support:appcompat-v7:$support_version" + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation "com.android.support:design:$support_version" + implementation "com.android.support:support-v13:$support_version" + implementation 'com.commonsware.cwac:anddown:0.3.0' + implementation 'com.google.dagger:dagger:2.11' + implementation 'com.jakewharton:butterknife:8.7.0' + implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0' + implementation 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0' + implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' + implementation 'io.reactivex.rxjava2:rxjava:2.1.0' + + samsungImplementation project(":IAP5Helper") + + implementation('com.crashlytics.sdk.android:crashlytics:2.8.0@aar') { transitive = true } } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 4581c5f..3cf3306 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -23,3 +23,8 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile + +### Crashlytics ### +-keepattributes *Annotation* +-keepattributes SourceFile,LineNumberTable +### End Crashlytics ### \ No newline at end of file diff --git a/app/src/samsung/AndroidManifest.xml b/app/src/samsung/AndroidManifest.xml new file mode 100644 index 0000000..8d2f382 --- /dev/null +++ b/app/src/samsung/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index e7b4def..6d5f6c6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ include ':app' +include ':IAP5Helper' \ No newline at end of file