From fd5ba9297d659bc7f662eeab458c2d92fc6476c2 Mon Sep 17 00:00:00 2001 From: "Liubing\\LB" Date: Mon, 11 May 2026 11:24:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20FlexionSDKHelper=20=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E8=87=B3=20ExtraPluginCfgs=20+=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 tysdk/Plugins/Android 下的 FlexionSDKHelper(已迁移至 ExtraPluginCfgs/flexion) - 更新 AndroidManifest/mainTemplate.gradle/settingsTemplate.gradle 配置 - 更新 ChannelHelpers/ConfigManager 渠道配置 - 更新 tuyoosdk AAR 和 google-services.json Co-Authored-By: Claude Opus 4.7 --- .../Plugins/Android/AndroidManifest.xml | 100 +++--- .../Plugins/Android/mainTemplate.gradle | 37 +-- .../Plugins/Android/settingsTemplate.gradle | 11 - .../Packages/tysdk/Files/google-services.json | 55 +--- .../tysdk/Plugins/Android/ChannelHelpers.java | 11 +- .../tysdk/Plugins/Android/ConfigManager.java | 2 +- .../Plugins/Android/FlexionSDKHelper.java | 285 ------------------ .../Android/FlexionSDKHelper.java.meta | 32 -- .../tysdk/Plugins/Android/tuyoosdk_1.0.0.aar | Bin 5398553 -> 5398537 bytes .../ProjectSettings/ProjectSettings.asset | 2 +- 10 files changed, 58 insertions(+), 477 deletions(-) delete mode 100644 sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java delete mode 100644 sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java.meta diff --git a/sdk-intergration/Assets/Plugins/Android/AndroidManifest.xml b/sdk-intergration/Assets/Plugins/Android/AndroidManifest.xml index 4a20bb8..ebd9b2e 100644 --- a/sdk-intergration/Assets/Plugins/Android/AndroidManifest.xml +++ b/sdk-intergration/Assets/Plugins/Android/AndroidManifest.xml @@ -1,52 +1,48 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle b/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle index 54696e0..814c5c6 100644 --- a/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle +++ b/sdk-intergration/Assets/Plugins/Android/mainTemplate.gradle @@ -13,14 +13,7 @@ android { } // Android Resolver Exclusions End android { - namespace "com.unity3d.player" -} - -// Flexion 渠道专用:排除不需要的 AppsFlyer 模块 -// - purchase-connector: 基于 Google Play Billing,Flexion 不走 GP 计费,没用还增大包 -// 即使 Unity Android Resolver 下次又把 implementation 行写回来,这里的 exclude 也兜底排除 -configurations.all { - exclude group: 'com.appsflyer', module: 'purchase-connector' + namespace "com.unity3d.player" } dependencies { @@ -38,17 +31,13 @@ dependencies { api "io.reactivex:rxandroid:1.2.1" api "io.reactivex:rxjava:1.1.9" - // Google Play In-App Review + // Google Play In-App Review implementation 'com.google.android.play:review:2.0.1' - // Google Play Billing — tuyoosdk AAR references BillingManager during init - implementation 'com.android.billingclient:billing:6.0.1' implementation 'net.aihelp:android-aihelp-aar:5.3.+' implementation 'com.google.android.gms:play-services-auth:20.2.0' - - // Flexion SDK (includes wrapped billing) - implementation("com.flexionmobile:sdk:4.0.1") - + implementation('com.android.billingclient:billing:7.0.0') + implementation 'com.google.android.gms:play-services-basement:18.2.0' implementation 'androidx.fragment:fragment:1.3.6' implementation "org.jetbrains.kotlin:kotlin-reflect:1.3.41" @@ -59,7 +48,7 @@ dependencies { implementation 'com.miui.referrer:homereferrer:1.0.0.6' - implementation platform('com.google.firebase:firebase-bom:32.7.4') + implementation platform('com.google.firebase:firebase-bom:34.6.0') implementation 'com.google.firebase:firebase-analytics' implementation('com.facebook.android:facebook-android-sdk:16.2.0') @@ -70,8 +59,6 @@ dependencies { implementation "androidx.credentials:credentials-play-services-auth:1.3.0" implementation "com.google.android.libraries.identity.googleid:googleid:1.1.1" - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.2" - // Android Resolver Dependencies Start implementation 'com.android.installreferrer:installreferrer:2.1' // Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml:7 implementation 'com.applovin.mediation:facebook-adapter:[6.18.0.1]' // Assets/MaxSdk/Mediation/Facebook/Editor/Dependencies.xml:8 @@ -88,27 +75,14 @@ dependencies { // Android Resolver Dependencies End **DEPS**} -// Android Resolver Exclusions Start -android { - packagingOptions { - exclude ('/lib/armeabi/*' + '*') - exclude ('/lib/mips/*' + '*') - exclude ('/lib/mips64/*' + '*') - exclude ('/lib/x86/*' + '*') - exclude ('/lib/x86_64/*' + '*') - } -} -// Android Resolver Exclusions End android { ndkPath "**NDKPATH**" compileSdkVersion **APIVERSION** buildToolsVersion '**BUILDTOOLS**' - compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 - coreLibraryDesugaringEnabled true } defaultConfig { @@ -117,7 +91,6 @@ android { ndk { abiFilters **ABIFILTERS** } - versionCode **VERSIONCODE** versionName '**VERSIONNAME**' consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD** diff --git a/sdk-intergration/Assets/Plugins/Android/settingsTemplate.gradle b/sdk-intergration/Assets/Plugins/Android/settingsTemplate.gradle index 169416f..73133c1 100644 --- a/sdk-intergration/Assets/Plugins/Android/settingsTemplate.gradle +++ b/sdk-intergration/Assets/Plugins/Android/settingsTemplate.gradle @@ -16,17 +16,6 @@ dependencyResolutionManagement { **ARTIFACTORYREPOSITORY** google() mavenCentral() - - // Flexion SDK Maven Repository - maven { - url = uri("https://maven.pkg.github.com/FlexionSDK/JavaSDK") - credentials { - username = "FlexionSDK" - // Replace with your actual Flexion PAT from DropPoint - password = "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" - } - } - // Android Resolver Repos Start def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/") maven { diff --git a/sdk-intergration/Packages/tysdk/Files/google-services.json b/sdk-intergration/Packages/tysdk/Files/google-services.json index c390912..8ae069a 100644 --- a/sdk-intergration/Packages/tysdk/Files/google-services.json +++ b/sdk-intergration/Packages/tysdk/Files/google-services.json @@ -2,7 +2,7 @@ "project_info": { "project_number": "481260393117", "project_id": "fishing-travel", - "storage_bucket": "fishing-travel.firebasestorage.app" + "storage_bucket": "fishing-travel.appspot.com" }, "client": [ { @@ -21,14 +21,6 @@ "certificate_hash": "c9cf2f5eaba383cbdd5b968d0342c49afabc32a2" } }, - { - "client_id": "481260393117-vfn1jueugjqjach8kgc0kfi54g085q6l.apps.googleusercontent.com", - "client_type": 1, - "android_info": { - "package_name": "com.arkgame.ft", - "certificate_hash": "53fd6ff623712411792a4665163e4cbf4a7a22ec" - } - }, { "client_id": "481260393117-0ah0ekk7lu5r44ko2uqlfoebgak8dmhj.apps.googleusercontent.com", "client_type": 3 @@ -45,51 +37,6 @@ { "client_id": "481260393117-0ah0ekk7lu5r44ko2uqlfoebgak8dmhj.apps.googleusercontent.com", "client_type": 3 - }, - { - "client_id": "481260393117-88n0v3ht8ashhk0r5ri47hced7o5qj62.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.arkgame.ft", - "app_store_id": "6505145935" - } - } - ] - } - } - }, - { - "client_info": { - "mobilesdk_app_id": "1:481260393117:android:eafec4a060b0224907fa74", - "android_client_info": { - "package_name": "com.arkgame.ft.flexion" - } - }, - "oauth_client": [ - { - "client_id": "481260393117-0ah0ekk7lu5r44ko2uqlfoebgak8dmhj.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBU6gAwu0O28jg7-TRd_Vx2YMCH_Baa8Bw" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "481260393117-0ah0ekk7lu5r44ko2uqlfoebgak8dmhj.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "481260393117-88n0v3ht8ashhk0r5ri47hced7o5qj62.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "com.arkgame.ft", - "app_store_id": "6505145935" - } } ] } diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java index 0111209..b62fba6 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ChannelHelpers.java @@ -1,20 +1,13 @@ package com.unity3d.player; public class ChannelHelpers { - - public static final String CHANNEL = "Flexion"; + public static final String CHANNEL = "GooglePlay"; static void register() { - SDKManager.registerHelper(new FlexionSDKHelper()); + // GooglePlay uses default behavior, no additional SDKHelper } - - // Flexion provides price in micros and currency code, so no normalization needed - // 支付的变化,可能会修改这里 public static String normalizeSkuList(String msg) { return msg; } - - - //public SDKExtBuilder; } diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java index 1727c92..4d30160 100644 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java +++ b/sdk-intergration/Packages/tysdk/Plugins/Android/ConfigManager.java @@ -6,7 +6,7 @@ public class ConfigManager { public static String SDK_GAMEID = "20587"; public static String SDK_PROJECTID = "20587"; public static String SDK_CLOUDID = "128"; - public static String SDK_CLIENTID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20587.flexion.FishingMaster"; + public static String SDK_CLIENTID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20587.googleplay.FishingMaster"; public static String SDK_LOGIN_SERVER_URL = "https://128-hwsfsdk-sdk-online01.qijihdhk.com"; diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java b/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java deleted file mode 100644 index 698df06..0000000 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java +++ /dev/null @@ -1,285 +0,0 @@ -package com.unity3d.player; - -import android.app.Activity; -import android.util.Log; - -import com.flexionmobile.ddpx.listener.ConnectionStateListener; -import com.flexionmobile.ddpx.listener.PurchasesUpdateListener; -import com.flexionmobile.ddpx.model.BillingResult; -import com.flexionmobile.ddpx.model.BillingResults; -import com.flexionmobile.ddpx.model.Purchase; -import com.flexionmobile.ddpx.model.ProductDetails; -import com.flexionmobile.ddpx.model.params.BillingFlowParams; -import com.flexionmobile.ddpx.model.params.ConsumeParams; -import com.flexionmobile.ddpx.model.params.QueryPurchasesParams; -import com.flexionmobile.ddpx.model.params.ProductDetailsParams; -import com.flexionmobile.ddpx.service.BillingService; -import com.flexionmobile.fdk.FLX; - -import com.tuyoo.gamesdk.api.SDKAPI; -import com.tuyoo.gamesdk.api.SDKCallBack; -import com.tuyoo.gamesdk.model.InitParam; -import com.tuyoo.gamesdk.util.SDKLog; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.Base64; -import java.util.List; - -public class FlexionSDKHelper implements SDKManager.ISDKHelper { - private static final String TAG = "FlexionSDKHelper"; - private static BillingService billingService; - private static boolean billingConnected = false; - - private static final PurchasesUpdateListener purchasesListener = (billingResult, purchase) -> { - - - Log.i(TAG, "[PAY-FLOW] PurchasesUpdateListener: code=" + billingResult.getResponseCode() - + " hasPurchase=" + (purchase != null)); - if (billingResult.getResponseCode() == BillingResults.ResultCode.PURCHASE_SUCCESS_CODE) { - if (purchase != null) handlePurchase(purchase); - } else if (billingResult.getResponseCode() == BillingResults.ResultCode.PURCHASE_USER_CANCELLED_CODE) { - Log.i(TAG, "[PAY-FLOW] user cancelled"); - sendPayCallback(1, "user_cancelled", null, null, null); - } else { - Log.e(TAG, "[PAY-FLOW] purchase failed: code=" + billingResult.getResponseCode()); - sendPayCallback(1, "purchase_failed_" + billingResult.getResponseCode(), null, null, null); - } - }; - - @Override - public void init(Activity activity) { - activity.runOnUiThread(() -> { - SDKAPI.getIns().lightModeEnable(); - boolean sdkInitOk = false; - try { - SDKAPI.getIns().init(new InitParam.Builder() - .withActivity(activity) - .withAppId(ConfigManager.SDK_APPID) - .withClientId(ConfigManager.SDK_CLIENTID) - .withServerUrl(ConfigManager.SDK_LOGIN_SERVER_URL) - .build()); - SDKAPI.getIns().onActivityStart(activity); - SDKAPI.getIns().onActivityResume(activity); - sdkInitOk = true; - } catch (Exception e) { - Log.e(TAG, "TuYoo SDK init failed, skip FLX init: " + e); - TYUnityActivity.setSdkInited(); - } - - if (sdkInitOk) { - FLX.init(activity, (initCode, initMsg) -> { - Log.i(TAG, "FLX.init result=" + initCode); - if (initCode == 0) { - FLX.showFlexionScreens(activity, (screenCode, screenMsg) -> { - Log.i(TAG, "FLX.showFlexionScreens result=" + screenCode); - initBillingService(activity); - TYUnityActivity.setSdkInited(); - }); - } else { - Log.e(TAG, "FLX.init failed: " + initCode); - TYUnityActivity.setSdkInited(); - } - }); - } - }); - } - - @Override - public void pay(Activity activity, String productId, String productName, - String productCount, String prodorderId, String appInfo) { - Log.i(TAG, "[PAY-FLOW] pay called: productId=" + productId + " billingReady=" + billingConnected); - if (billingService == null || !billingConnected) { - Log.e(TAG, "[PAY-FLOW] billing not ready"); - sendPayCallback(1, "billing_not_ready", null, null, null); - return; - } - String developerPayload = ""; - try { - byte[] decoded = Base64.getDecoder().decode(appInfo); - JSONObject json = new JSONObject(new String(decoded, "UTF-8")); - JSONObject payload = new JSONObject(); - payload.put("playerId", json.optString("playerId", "")); - payload.put("customData", json.optString("customData", "")); - developerPayload = payload.toString(); - } catch (Exception e) { - Log.w(TAG, "Failed to extract playerId/customData from appInfo: " + e.getMessage()); - } - String finalPayload = developerPayload; - activity.runOnUiThread(() -> { - Log.i(TAG, "[PAY-FLOW] launching billing flow for: " + productId + " payload=" + finalPayload); - billingService.launchBillingFlow(activity, - new BillingFlowParams(productId, "inapp", finalPayload)); - }); - } - - @Override - public void queryProducts() { - Log.i(TAG, "queryProducts called, billingConnected=" + billingConnected); - if (billingService == null || !billingConnected) { - Log.w(TAG, "queryProducts: billing not ready"); - sendExtensionError("billing_not_ready"); - return; - } - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("action", "ACTION_GET_SKU_DETAILS_LIST"); - } catch (JSONException e) { - throw new RuntimeException(e); - } - SDKAPI.getIns().thirdExtend(jsonObject.toString(), new SDKCallBack.Extend() { - @Override - public void callback(int code, String msg) { - Log.i(TAG, "TuYoo thirdExtend callback: code=" + code + " msg=" + msg); - if (code == SDKCallBack.Extend.EXTEND_CODE_SUCCESS && msg != null) { - try { - JSONArray products = new JSONArray(msg); - List productIds = new java.util.ArrayList<>(); - for (int i = 0; i < products.length(); i++) { - JSONObject p = products.getJSONObject(i); - String pid = p.optString("productId", ""); - if (!pid.isEmpty()) productIds.add(pid); - } - Log.i(TAG, "queryProductDetails with " + productIds.size() + " items: " + productIds); - queryProductDetails(productIds); - } catch (JSONException e) { - sendExtensionError("parse_error: " + e.getMessage()); - } - } else { - sendExtensionError("tuyoo_query_failed: " + msg); - } - } - }); - } - - // ---- Billing Infrastructure ---- - - private static void initBillingService(Activity activity) { - Log.i(TAG, "[PAY-FLOW] initBillingService"); - billingService = FLX.createBillingService(activity, purchasesListener); - billingService.startConnection(activity, new ConnectionStateListener() { - @Override - public void onBillingSetupFinished(BillingResult result) { - Log.i(TAG, "[PAY-FLOW] onBillingSetupFinished: code=" + result.getResponseCode()); - if (result.getResponseCode() == BillingResults.ResultCode.CONNECTION_SUCCESS_CODE) { - billingConnected = true; - queryPendingPurchases(); - } - } - @Override - public void onBillingServiceDisconnected() { - Log.w(TAG, "[PAY-FLOW] billing service disconnected"); - billingConnected = false; - } - }); - } - - private static void handlePurchase(Purchase purchase) { - Log.i(TAG, "[PAY-FLOW] handlePurchase: state=" + purchase.getPurchaseState() - + " token=" + purchase.getToken()); - if (purchase.getPurchaseState() == 0) { - Log.i(TAG, "[PAY-FLOW] purchaseJson=" + purchase.getPurchaseJson()); - Log.i(TAG, "[PAY-FLOW] signature=" + purchase.getSignature()); - sendPayCallback(0, "success", purchase.getPurchaseJson(), purchase.getSignature(), purchase.getToken()); - } else if (purchase.getPurchaseState() == 2) { - Log.i(TAG, "[PAY-FLOW] purchase state=2 (pending)"); - sendPayCallback(2, "pending", null, null, null); - } - } - - private static void queryPendingPurchases() { - if (billingService == null || !billingConnected) return; - billingService.queryPurchasesAsync( - new QueryPurchasesParams("inapp"), - (result, purchases) -> { - if (purchases != null) for (Purchase p : purchases) handlePurchase(p); - }); - } - - private static void queryProductDetails(List productIds) { - billingService.queryProductDetailsAsync( - new ProductDetailsParams("inapp", productIds), - (billingResult, productDetails) -> { - try { - JSONObject result = new JSONObject(); - if (billingResult.getResponseCode() == BillingResults.ResultCode.QUERY_PRODUCT_DETAILS_SUCCESS_CODE - && productDetails != null) { - JSONArray arr = new JSONArray(); - for (ProductDetails detail : productDetails) { - JSONObject item = new JSONObject(); - item.put("productId", detail.getId()); - item.put("ourProductId", detail.getId()); - item.put("title", detail.getTitle()); - item.put("description", detail.getDescription()); - item.put("price", detail.getPrice()); - item.put("price_amount_micros", detail.getPriceAmountMicros()); - item.put("price_currency_code", detail.getPriceCurrencyCode()); - item.put("type", detail.getType()); - arr.put(item); - } - result.put("code", 0); - result.put("respObj", arr.toString()); - } else { - result.put("code", 1); - result.put("thirdExtend_errStr", - "flexion_query_failed: " + billingResult.getDebugMessage()); - } - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); - } catch (JSONException e) { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); - } - }); - } - - // ---- Callbacks to Unity ---- - - private static void sendPayCallback(int code, String errStr, - String purchaseJson, String signature, String purchaseToken) { - Log.i(TAG, "[PAY-FLOW] sendPayCallback: code=" + code + " errStr=" + errStr - + " hasPurchaseJson=" + (purchaseJson != null) + " hasSignature=" + (signature != null) - + " hasToken=" + (purchaseToken != null)); - try { - JSONObject result = new JSONObject(); - result.put("code", code); - result.put("errStr", errStr != null ? errStr : ""); - if (purchaseJson != null) result.put("purchaseJson", purchaseJson); - if (signature != null) result.put("signature", signature); - if (purchaseToken != null) result.put("purchaseToken", purchaseToken); - Log.i(TAG, "[PAY-FLOW] UnitySendMessage callback: " + result.toString()); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_CALLBACK_FUNCTION_NAME, result.toString()); - } catch (JSONException e) { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_CALLBACK_FUNCTION_NAME, "{\"code\":1,\"errStr\":\"json_error\"}"); - } - } - - public static void consumePurchase(String token) { - if (billingService == null || token == null || token.isEmpty()) { - Log.w(TAG, "[PAY-FLOW] consumePurchase: billingService or token is null"); - return; - } - Log.i(TAG, "[PAY-FLOW] consumePurchase: token=" + token); - billingService.consumeAsync( - new ConsumeParams(token), - r -> Log.i(TAG, "[PAY-FLOW] consume result: " + - (r.getResponseCode() == BillingResults.ResultCode.CONSUME_SUCCESS_CODE ? "ok" : "fail"))); - } - - private static void sendExtensionError(String errStr) { - try { - JSONObject result = new JSONObject(); - result.put("code", 1); - result.put("thirdExtend_errStr", errStr); - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, result.toString()); - } catch (JSONException e) { - UnityPlayer.UnitySendMessage(ConfigManager.UNITY_FACADE_NAME, - ConfigManager.PAY_TYPE_CALLBACK_FUNCTION_NAME, "{\"code\":1}"); - } - } -} diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java.meta b/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java.meta deleted file mode 100644 index 147e335..0000000 --- a/sdk-intergration/Packages/tysdk/Plugins/Android/FlexionSDKHelper.java.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: 4932bae8b9e69a447b0e2d7d3bcd0917 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 1 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Android: Android - second: - enabled: 1 - settings: {} - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/sdk-intergration/Packages/tysdk/Plugins/Android/tuyoosdk_1.0.0.aar b/sdk-intergration/Packages/tysdk/Plugins/Android/tuyoosdk_1.0.0.aar index 2fcfaf0f9d2c5f1eee9c5e3c29dad2003b5d0261..6576bb4c98593a32593a76e2c610de0610848989 100644 GIT binary patch delta 6763 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 pOMvq85|p58-%LO~DUzW}SEr3(N6 delta 6734 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