package com.unity3d.player; import android.app.Activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import java.lang.reflect.Constructor; public class ChannelAdapterManager { private static final String TAG = "ChannelAdapterManager"; private static final String DEFAULT_CHANNEL = "GooglePlay"; private static final String META_CHANNEL = "com.arkgame.ft.channel"; private static SDKManager.IChannelSDKAdapter adapter; public static SDKManager.IChannelSDKAdapter createSdkAdapter(Activity activity) { String channel = readChannel(activity); adapter = createAdapter(channel); if (adapter instanceof ChannelAdapterBase) { ((ChannelAdapterBase) adapter).setup(activity, channel); } return adapter; } public static String normalizeSkuList(String msg) { if (adapter == null) { return msg; } return adapter.normalizeSkuList(msg); } private static SDKManager.IChannelSDKAdapter createAdapter(String channel) { if (TextUtils.isEmpty(channel) || DEFAULT_CHANNEL.equals(channel)) { return new ChannelAdapterBase(); } SDKManager.IChannelSDKAdapter adapter = tryCreateAdapter( "com.unity3d.player." + channel + "Adapter"); if (adapter != null) { return adapter; } return new ChannelAdapterBase(); } private static SDKManager.IChannelSDKAdapter tryCreateAdapter(String adapterClassName) { try { Class adapterClass = Class.forName(adapterClassName); Constructor constructor = adapterClass.getDeclaredConstructor(); constructor.setAccessible(true); Object instance = constructor.newInstance(); if (instance instanceof SDKManager.IChannelSDKAdapter) { return (SDKManager.IChannelSDKAdapter) instance; } Log.e(TAG, "adapter does not implement IChannelSDKAdapter: " + adapterClassName); } catch (Exception e) { Log.e(TAG, "create adapter failed: " + adapterClassName, e); } return null; } private static String readChannel(Activity activity) { if (activity == null) { return DEFAULT_CHANNEL; } try { ApplicationInfo appInfo = activity.getPackageManager().getApplicationInfo( activity.getPackageName(), PackageManager.GET_META_DATA); Bundle metaData = appInfo.metaData; if (metaData == null) { return DEFAULT_CHANNEL; } String value = metaData.getString(META_CHANNEL); return TextUtils.isEmpty(value) ? DEFAULT_CHANNEL : value; } catch (Exception e) { Log.e(TAG, "read channel failed", e); return DEFAULT_CHANNEL; } } }