diff --git a/om-android-sdk/src/main/java/com/crosspromotion/sdk/bid/BidderTokenProvider.java b/om-android-sdk/src/main/java/com/crosspromotion/sdk/bid/BidderTokenProvider.java index b51e506d..c62fb4fd 100644 --- a/om-android-sdk/src/main/java/com/crosspromotion/sdk/bid/BidderTokenProvider.java +++ b/om-android-sdk/src/main/java/com/crosspromotion/sdk/bid/BidderTokenProvider.java @@ -2,15 +2,12 @@ import android.os.Looper; -import com.crosspromotion.sdk.utils.BidderToken; - public class BidderTokenProvider { public static String getBidderToken() { if (Looper.myLooper() == Looper.getMainLooper()) { - throw new IllegalThreadStateException("Method getBidderToken must be called from worker thread," + - "currently inferred thread is main thread."); + throw new IllegalThreadStateException("Method getBidderToken must be called from worker thread," + "currently inferred thread is main thread."); } - return BidderToken.getBidToken(); + return ""; } } diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAd.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAd.java index a33ca3e5..521c4273 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAd.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAd.java @@ -12,7 +12,6 @@ import com.openmediation.sdk.bid.BidAuctionManager; import com.openmediation.sdk.bid.BidResponse; import com.openmediation.sdk.mediation.Callback; -import com.openmediation.sdk.utils.ActLifecycle; import com.openmediation.sdk.utils.AdLog; import com.openmediation.sdk.utils.AdRateUtil; import com.openmediation.sdk.utils.AdsUtil; @@ -30,6 +29,7 @@ import com.openmediation.sdk.utils.error.ErrorCode; import com.openmediation.sdk.utils.helper.LrReportHelper; import com.openmediation.sdk.utils.helper.WaterFallHelper; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; import com.openmediation.sdk.utils.model.BaseInstance; import com.openmediation.sdk.utils.model.Instance; import com.openmediation.sdk.utils.model.MediationRule; diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAdsManager.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAdsManager.java index be142554..bc563658 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAdsManager.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AbstractAdsManager.java @@ -13,7 +13,6 @@ import com.openmediation.sdk.bid.BidResponse; import com.openmediation.sdk.core.runnable.AdsScheduleTask; import com.openmediation.sdk.mediation.CustomAdsAdapter; -import com.openmediation.sdk.utils.ActLifecycle; import com.openmediation.sdk.utils.AdLog; import com.openmediation.sdk.utils.AdRateUtil; import com.openmediation.sdk.utils.AdapterUtil; @@ -38,6 +37,7 @@ import com.openmediation.sdk.utils.event.EventUploadManager; import com.openmediation.sdk.utils.helper.LrReportHelper; import com.openmediation.sdk.utils.helper.WaterFallHelper; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; import com.openmediation.sdk.utils.model.BaseInstance; import com.openmediation.sdk.utils.model.Instance; import com.openmediation.sdk.utils.model.MediationRule; @@ -176,7 +176,6 @@ protected void loadInsAndSendEvent(Instance instance) { @Override public void onResume(Activity activity) { if (Preconditions.checkNotNull(activity)) { - mActivityReference = new WeakReference<>(activity); if (mTotalIns != null && !mTotalIns.isEmpty()) { for (Instance in : mTotalIns) { in.onResume(activity); @@ -188,7 +187,6 @@ public void onResume(Activity activity) { @Override public void onPause(Activity activity) { if (Preconditions.checkNotNull(activity)) { - mActivityReference = new WeakReference<>(activity); if (mTotalIns != null && !mTotalIns.isEmpty()) { for (Instance in : mTotalIns) { in.onPause(activity); @@ -534,8 +532,11 @@ public void onRequestSuccess(Response response) { if (c2SInstances == null || c2SInstances.isEmpty()) { startLoadAd(clInfo, null); } else { - BidAuctionManager.getInstance().c2sBid(mActivityReference.get(), c2SInstances, mPlacement.getId(), mReqId, mPlacement.getT(), - AbstractAdsManager.this); + Activity activity = getActivity(); + if (isActValid(activity)){ + BidAuctionManager.getInstance().c2sBid(activity, c2SInstances, mPlacement.getId(), mReqId, mPlacement.getT(), + AbstractAdsManager.this); + } } } catch (Exception e) { Error error = ErrorBuilder.build(ErrorCode.CODE_LOAD_SERVER_ERROR @@ -656,8 +657,11 @@ private void delayLoad(final OmManager.LOAD_TYPE type) { internalLoad(null, InsUtil.getInstanceList(mPlacement)); return; } - BidAuctionManager.getInstance().s2sBid(mActivityReference.get(), mPlacement.getId(), mReqId, mPlacement.getT(), - AbstractAdsManager.this); + Activity activity = getActivity(); + if (isActValid(activity)) { + BidAuctionManager.getInstance().s2sBid(activity, mPlacement.getId(), mReqId, mPlacement.getT(), + AbstractAdsManager.this); + } } catch (Exception e) { Error error = ErrorBuilder.build(ErrorCode.CODE_LOAD_INVALID_REQUEST , ErrorCode.MSG_LOAD_INVALID_REQUEST, ErrorCode.CODE_LOAD_UNKNOWN_INTERNAL_ERROR); @@ -840,12 +844,9 @@ private void checkShouldLoadsWhenClose() { * @return activity's availability */ private boolean checkActRef() { - if (!DeviceUtil.isActivityAvailable(mActivityReference.get())) { - Activity activity = ActLifecycle.getInstance().getActivity(); - if (activity == null) { - return false; - } - mActivityReference = new WeakReference<>(activity); + Activity activity = getActivity(); + if (!DeviceUtil.isActivityAvailable(activity)) { + return ActLifecycle.getInstance().getActivity() == null; } return true; } diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AdsApi.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AdsApi.java index 36bf95b9..1aa69906 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/AdsApi.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/AdsApi.java @@ -4,21 +4,39 @@ package com.openmediation.sdk.core; import android.app.Activity; +import android.os.Build; -import com.openmediation.sdk.utils.ActLifecycle; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; import com.openmediation.sdk.utils.error.Error; import com.openmediation.sdk.utils.model.Instance; import com.openmediation.sdk.utils.model.Placement; import com.openmediation.sdk.utils.model.PlacementInfo; -import java.lang.ref.WeakReference; import java.util.Map; /** * The type Ads api. */ public abstract class AdsApi { - protected WeakReference mActivityReference = new WeakReference<>(null); + + /** + * changed By ZJJ on 21.3.18 + * Obtaining an Activity should not use weak references as a continuously accessible object, + * which is easy to cause NullPointer, especially on low configuration devices + * The use of WeakReference is wrong. + * The reference from the weak reference get() is still bound to the strong reference when it is passed into the method for use. + */ + protected Activity getActivity() throws NullPointerException { + return ActLifecycle.getInstance().getActivity(); + } + + /** + * changed By ZJJ on 21.3.18 + * Check whether an activity is valid + */ + protected boolean isActValid(Activity activity) { + return activity != null && !((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed()) || activity.isFinishing()); + } /** * Returns placement info for the ad type @@ -32,11 +50,7 @@ public abstract class AdsApi { * * @param instance the instance */ - protected void initInsAndSendEvent(Instance instance) { - if (mActivityReference == null || mActivityReference.get() == null) { - mActivityReference = new WeakReference(ActLifecycle.getInstance().getActivity()); - } - } + protected void initInsAndSendEvent(Instance instance) { } /** * Checks if an instance is available diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/InitImp.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/InitImp.java index bfa7e98d..41846616 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/InitImp.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/InitImp.java @@ -10,7 +10,6 @@ import com.openmediation.sdk.InitConfiguration; import com.openmediation.sdk.bid.BidAuctionManager; import com.openmediation.sdk.utils.AFManager; -import com.openmediation.sdk.utils.ActLifecycle; import com.openmediation.sdk.utils.AdLog; import com.openmediation.sdk.utils.AdtUtil; import com.openmediation.sdk.utils.DeveloperLog; @@ -31,6 +30,7 @@ import com.openmediation.sdk.utils.event.EventId; import com.openmediation.sdk.utils.event.EventUploadManager; import com.openmediation.sdk.utils.helper.ConfigurationHelper; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; import com.openmediation.sdk.utils.model.Configurations; import com.openmediation.sdk.utils.request.network.Request; import com.openmediation.sdk.utils.request.network.Response; diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/interstitialad/IsManager.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/interstitialad/IsManager.java index ca66c803..bc362ad8 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/interstitialad/IsManager.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/interstitialad/IsManager.java @@ -3,6 +3,9 @@ package com.openmediation.sdk.core.imp.interstitialad; +import android.app.Activity; + +import com.openmediation.sdk.bid.BidAuctionManager; import com.openmediation.sdk.utils.model.Instance; import com.openmediation.sdk.core.OmManager; import com.openmediation.sdk.interstitial.InterstitialAdListener; @@ -70,7 +73,10 @@ protected void initInsAndSendEvent(Instance instance) { } IsInstance isInstance = (IsInstance) instance; isInstance.setIsManagerListener(this); - isInstance.initIs(mActivityReference.get()); + Activity activity = getActivity(); + if (isActValid(activity)){ + isInstance.initIs(activity); + } } @Override @@ -83,13 +89,19 @@ protected boolean isInsAvailable(Instance instance) { @Override protected void insShow(final Instance instance) { - ((IsInstance) instance).showIs(mActivityReference.get(), mScene); + Activity activity = getActivity(); + if (isActValid(activity)){ + ((IsInstance) instance).showIs(activity, mScene); + } } @Override protected void insLoad(Instance instance, Map extras) { IsInstance isInstance = (IsInstance) instance; - isInstance.loadIs(mActivityReference.get(), extras); + Activity activity = getActivity(); + if (isActValid(activity)){ + isInstance.loadIs(activity, extras); + } } @Override diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/promotion/CpManager.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/promotion/CpManager.java index 9535d048..d547fcd5 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/promotion/CpManager.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/promotion/CpManager.java @@ -95,7 +95,10 @@ protected void initInsAndSendEvent(Instance instance) { } CpInstance cpInstance = (CpInstance) instance; cpInstance.setCpManagerListener(this); - cpInstance.initCp(mActivityReference.get()); + Activity activity = getActivity(); + if (isActValid(activity)){ + cpInstance.initCp(activity); + } } @Override @@ -110,15 +113,20 @@ protected boolean isInsAvailable(Instance instance) { protected void insShow(Instance instance) { if (instance instanceof CpInstance) { mShowingInstance = (CpInstance) instance; - Activity activity = mActRefs == null ? mActivityReference.get() : mActRefs.get(); - mShowingInstance.showCp(activity, mRect, mScene); + Activity activity = getActivity(); + if (isActValid(activity)){ + mShowingInstance.showCp(activity, mRect, mScene); + } } } @Override protected void insLoad(Instance instance, Map extras) { CpInstance cpInstance = (CpInstance) instance; - cpInstance.loadCp(mActivityReference.get(), extras); + Activity activity = getActivity(); + if (isActValid(activity)){ + cpInstance.loadCp(activity, extras); + } } @Override diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/rewardedvideo/RvManager.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/rewardedvideo/RvManager.java index 3dfeb97d..4f5be4ad 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/rewardedvideo/RvManager.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/rewardedvideo/RvManager.java @@ -3,6 +3,8 @@ package com.openmediation.sdk.core.imp.rewardedvideo; +import android.app.Activity; + import com.openmediation.sdk.utils.SceneUtil; import com.openmediation.sdk.utils.model.Instance; import com.openmediation.sdk.mediation.MediationRewardVideoListener; @@ -85,7 +87,10 @@ protected void initInsAndSendEvent(Instance instance) { } RvInstance rvInstance = (RvInstance) instance; rvInstance.setRvManagerListener(this); - rvInstance.initRv(mActivityReference.get()); + Activity activity = getActivity(); + if (isActValid(activity)){ + rvInstance.initRv(activity); + } } @Override @@ -98,13 +103,19 @@ protected boolean isInsAvailable(Instance instance) { @Override protected void insShow(final Instance instance) { - ((RvInstance) instance).showRv(mActivityReference.get(), mScene); + Activity activity = getActivity(); + if (isActValid(activity)){ + ((RvInstance) instance).showRv(activity, mScene); + } } @Override protected void insLoad(Instance instance, Map extras) { RvInstance rvInstance = (RvInstance) instance; - rvInstance.loadRv(mActivityReference.get(), extras); + Activity activity = getActivity(); + if (isActValid(activity)){ + rvInstance.loadRv(activity, extras); + } } @Override diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/splash/SplashAdManager.java b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/splash/SplashAdManager.java index a570f7a6..691d7598 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/splash/SplashAdManager.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/core/imp/splash/SplashAdManager.java @@ -6,11 +6,11 @@ import com.openmediation.sdk.core.OmManager; import com.openmediation.sdk.splash.SplashAdListener; -import com.openmediation.sdk.utils.ActLifecycle; import com.openmediation.sdk.utils.AdsUtil; import com.openmediation.sdk.utils.PlacementUtils; import com.openmediation.sdk.utils.constant.CommonConstants; import com.openmediation.sdk.utils.event.EventId; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; import com.openmediation.sdk.utils.model.Placement; import java.util.concurrent.ConcurrentHashMap; diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/mediation/CustomAdsAdapter.java b/om-android-sdk/src/main/java/com/openmediation/sdk/mediation/CustomAdsAdapter.java index 35c667a7..7829af0b 100644 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/mediation/CustomAdsAdapter.java +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/mediation/CustomAdsAdapter.java @@ -7,6 +7,8 @@ import android.os.Build; import android.text.TextUtils; +import com.openmediation.sdk.utils.lifecycle.ActLifecycle; + import java.util.Map; /** @@ -18,14 +20,12 @@ * At runtime, the mediation SDK will find and instantiate a CustomAdsAdapter subclass as needed * and invoke its methods. */ -public abstract class CustomAdsAdapter extends CustomAdParams implements RewardedVideoApi, - InterstitialAdApi, BannerAdApi, PromotionAdApi { +public abstract class CustomAdsAdapter extends CustomAdParams implements RewardedVideoApi, InterstitialAdApi, BannerAdApi, PromotionAdApi { protected String mAppKey; @Override - public void initRewardedVideo(Activity activity, Map dataMap - , RewardedVideoCallback callback) { + public void initRewardedVideo(Activity activity, Map dataMap, RewardedVideoCallback callback) { initData(activity, dataMap); } @@ -131,13 +131,29 @@ public boolean isPromotionAdAvailable(String adUnitId) { return false; } + /** + * changed by ZJJ on 21.3.15 + * check whether the current Activity is valid. + * if it is invalid, in order to increase the arrival rate, + * try to obtain an available Activity from the LifecycleCallbacks of the current process. + * + * @see #check(Activity, String) + */ + protected String check(Activity activity) { + return check(activity, "0"); + } + + /** + * changed by ZJJ on 21.3.15 + * @see #check(Activity) plus to detect {adUnitId} + */ protected String check(Activity activity, String adUnitId) { - if (activity == null) { - return "activity is null"; - } - if (isDestroyed(activity)) { - return "activity is destroyed"; + boolean result = checkActivity(activity); + if (!result) { + activity = ActLifecycle.getInstance().getActivity(); } + result = checkActivity(activity); + if (!result) return "activity is null or has been destroyed"; if (TextUtils.isEmpty(mAppKey)) { return "app key is null"; } @@ -147,20 +163,7 @@ protected String check(Activity activity, String adUnitId) { return ""; } - protected String check(Activity activity) { - if (activity == null) { - return "activity is null"; - } - if (isDestroyed(activity)) { - return "activity is destroyed"; - } - if (TextUtils.isEmpty(mAppKey)) { - return "app key is empty"; - } - return ""; - } - - private void initData(Activity activity, Map dataMap) { + private void initData(@SuppressWarnings("unused") Activity activity, Map dataMap) { if (!TextUtils.isEmpty(mAppKey)) { return; } @@ -168,23 +171,20 @@ private void initData(Activity activity, Map dataMap) { } /** - * Checks if an Activity is available - * - * @param activity the given activity - * @return activity availability + * changed by ZJJ on 21.3.15 + * checks if an Activity is available */ - private boolean isDestroyed(Activity activity) { - boolean flage = false; + private boolean checkActivity(Activity activity) { + boolean flag = activity != null; if (Build.VERSION.SDK_INT >= 17) { if (activity == null || activity.isDestroyed()) { - flage = true; + flag = false; } } else { if (activity == null || activity.isFinishing()) { - flage = true; + flag = false; } } - return flage; + return flag; } - } diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/utils/ActLifecycle.java b/om-android-sdk/src/main/java/com/openmediation/sdk/utils/ActLifecycle.java deleted file mode 100644 index cc0ed0a2..00000000 --- a/om-android-sdk/src/main/java/com/openmediation/sdk/utils/ActLifecycle.java +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2020 ADTIMING TECHNOLOGY COMPANY LIMITED -// Licensed under the GNU Lesser General Public License Version 3 - -package com.openmediation.sdk.utils; - -import android.app.Activity; -import android.app.Application; -import android.os.Bundle; -import android.util.Base64; - -import com.openmediation.sdk.utils.constant.CommonConstants; -import com.openmediation.sdk.utils.crash.CrashUtil; - -import java.nio.charset.Charset; -import java.util.concurrent.atomic.AtomicReference; - -public class ActLifecycle implements Application.ActivityLifecycleCallbacks { - - private static String[] ADS_ACT = new String[]{ - new String(Base64.decode("Y29tLmFkdGJpZC5zZGs=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmdvb2dsZS5hbmRyb2lkLmdtcy5hZHM=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmZhY2Vib29rLmFkcw==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLnVuaXR5M2Quc2VydmljZXMuYWRz", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLnZ1bmdsZQ==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmFkY29sb255", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmFwcGxvdmlu", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLm1vcHVi", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLnRhcGpveQ==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmNoYXJ0Ym9vc3Q=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmJ5dGVkYW5jZS5zZGs=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmlyb25zb3VyY2Uuc2RrLmNvbnRyb2xsZXI=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLm15LnRhcmdldA==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLm1pbnRlZ3JhbC5tc2Rr", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmNoYXJ0Ym9vc3RfaGVsaXVtLnNkaw==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLnFxLmUuYWRz", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLnNpZ21vYi53aW5kYWQ=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("Y29tLmt3YWQuc2RrLmFwaS5wcm94eQ==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("aW8ucHJlc2FnZS5pbnRlcnN0aXRpYWwudWk=", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)), - new String(Base64.decode("bmV0LnB1Ym5hdGl2ZS5saXRlLnNkaw==", Base64.NO_WRAP), - Charset.forName(CommonConstants.CHARTSET_UTF8)) - }; - private AtomicReference mThisActivity = new AtomicReference<>(null); - - private static final class DKLifecycleHolder { - private static final ActLifecycle INSTANCE = new ActLifecycle(); - } - - private ActLifecycle() { - try { - AdtUtil.getApplication().registerActivityLifecycleCallbacks(this); - } catch (Exception e) { - CrashUtil.getSingleton().saveException(e); - } - } - - public static ActLifecycle getInstance() { - return DKLifecycleHolder.INSTANCE; - } - - public void init(Activity activity) { - mThisActivity.set(activity); - } - - public Activity getActivity() { - return mThisActivity.get(); - } - - @Override - public void onActivityCreated(Activity activity, Bundle bundle) { - } - - @Override - public void onActivityStarted(Activity activity) { - } - - @Override - public void onActivityResumed(Activity activity) { - DeveloperLog.LogD("onActivityResumed: " + activity.toString()); - if (isAdActivity(activity)) { - return; - } - Activity old = mThisActivity.get(); - if (old == null || old != activity) { - mThisActivity.set(activity); - } - } - - @Override - public void onActivityPaused(Activity activity) { - } - - @Override - public void onActivityStopped(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - DeveloperLog.LogD("onActivityDestroyed: " + activity.toString()); - Activity current = mThisActivity.get(); - if (current == activity) { - mThisActivity.set(null); - } - } - - private boolean isAdActivity(Activity activity) { - String address = activity.toString(); - for (String s : ADS_ACT) { - if (address.contains(s)) { - return true; - } - } - return false; - } -} diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/ActLifecycle.java b/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/ActLifecycle.java new file mode 100644 index 00000000..28fb0e9a --- /dev/null +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/ActLifecycle.java @@ -0,0 +1,103 @@ +// Copyright 2020 ADTIMING TECHNOLOGY COMPANY LIMITED +// Licensed under the GNU Lesser General Public License Version 3 + +package com.openmediation.sdk.utils.lifecycle; + +import android.app.Activity; +import android.app.Application; +import android.os.Build; +import android.os.Bundle; + +import com.openmediation.sdk.utils.AdtUtil; +import com.openmediation.sdk.utils.DeveloperLog; +import com.openmediation.sdk.utils.crash.CrashUtil; + +import java.util.Enumeration; +import java.util.concurrent.ConcurrentHashMap; + +import static com.openmediation.sdk.utils.lifecycle.TypeConstant.ADS_ACT; + +public class ActLifecycle implements Application.ActivityLifecycleCallbacks { + + private final ConcurrentHashMap mRefActivities = new ConcurrentHashMap<>(); + + private static final class DKLifecycleHolder { + private static final ActLifecycle INSTANCE = new ActLifecycle(); + } + + private ActLifecycle() { + try { + AdtUtil.getApplication().registerActivityLifecycleCallbacks(this); + } catch (Exception e) { + CrashUtil.getSingleton().saveException(e); + } + } + + public static ActLifecycle getInstance() { + return DKLifecycleHolder.INSTANCE; + } + + public void init(Activity activity) throws NullPointerException, IllegalArgumentException { + if (activity == null || activity.isFinishing() || (Build.VERSION.SDK_INT >= 17 && activity.isDestroyed())) throw new NullPointerException("init ad failed, the activity is empty or has been destroyed!"); + if (isAdActivity(activity)) return; + mRefActivities.put(activity.hashCode(), activity); + } + + public Activity getActivity() { + Enumeration elements = mRefActivities.elements(); + Activity act; + while (elements.hasMoreElements()) { + act = elements.nextElement(); + if (act.isFinishing() || (Build.VERSION.SDK_INT >= 17 && act.isDestroyed())) { + continue; + } + return act; + } + return null; + } + + @Override + public void onActivityCreated(Activity activity, Bundle bundle) { + if (isAdActivity(activity)) { + return; + } + mRefActivities.put(activity.hashCode(), activity); + } + + @Override + public void onActivityStarted(Activity activity) { + } + + @Override + public void onActivityResumed(Activity activity) { + DeveloperLog.LogD("onActivityResumed: " + activity.toString()); + } + + @Override + public void onActivityPaused(Activity activity) { + } + + @Override + public void onActivityStopped(Activity activity) { + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + DeveloperLog.LogD("onActivityDestroyed: " + activity.toString()); + mRefActivities.remove(activity.hashCode()); + } + + private boolean isAdActivity(Activity activity) { + String address = activity.toString(); + for (String s : ADS_ACT) { + if (address.contains(s)) { + return true; + } + } + return false; + } +} diff --git a/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/TypeConstant.java b/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/TypeConstant.java new file mode 100644 index 00000000..65734f8b --- /dev/null +++ b/om-android-sdk/src/main/java/com/openmediation/sdk/utils/lifecycle/TypeConstant.java @@ -0,0 +1,46 @@ +package com.openmediation.sdk.utils.lifecycle; + +import android.util.Base64; + +import com.openmediation.sdk.utils.constant.CommonConstants; + +import java.nio.charset.Charset; + +public class TypeConstant { + + @SuppressWarnings("CharsetObjectCanBeUsed") + final static String[] ADS_ACT = new String[]{ + new String(Base64.decode("Y29tLmFkdGltaW5nLm1lZGlhdGlvbnNkaw==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmdvb2dsZS5hbmRyb2lkLmdtcy5hZHM=", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmZhY2Vib29rLmFkcw==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLnVuaXR5M2Quc2VydmljZXMuYWRz", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLnZ1bmdsZQ==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmFkY29sb255", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmFwcGxvdmlu", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLm1vcHVi", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLnRhcGpveQ==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmNoYXJ0Ym9vc3Q=", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmJ5dGVkYW5jZS5zZGs=", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmlyb25zb3VyY2Uuc2RrLmNvbnRyb2xsZXI=", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLm15LnRhcmdldA==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLm1pbnRlZ3JhbC5tc2Rr", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLmNoYXJ0Ym9vc3RfaGVsaXVtLnNkaw==", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)), + new String(Base64.decode("Y29tLnFxLmUuYWRz", Base64.NO_WRAP), + Charset.forName(CommonConstants.CHARTSET_UTF8)) + }; +}