From 6f607400b3cde96383d6980f57fe187966f61785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B0=D1=86=D0=B5=D0=BF=D0=B8=D0=BD?= Date: Wed, 15 May 2019 17:58:24 +0300 Subject: [PATCH] [android] Refactored obtaining system advertising info to use observers instead of waiting based on loop in ui thread --- .../com/mapswithme/maps/SplashActivity.java | 66 ++++++++++++++++++- .../maps/analytics/AdvertisingObserver.java | 6 ++ .../analytics/ExternalLibrariesMediator.java | 24 ++++++- 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 android/src/com/mapswithme/maps/analytics/AdvertisingObserver.java diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java index 3ec4f8e9c7..41f4a1a2ea 100644 --- a/android/src/com/mapswithme/maps/SplashActivity.java +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -14,9 +14,11 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; import com.mapswithme.maps.ads.Banner; +import com.mapswithme.maps.analytics.AdvertisingObserver; import com.mapswithme.maps.analytics.ExternalLibrariesMediator; import com.mapswithme.maps.base.BaseActivity; import com.mapswithme.maps.base.BaseActivityDelegate; +import com.mapswithme.maps.base.Detachable; import com.mapswithme.maps.downloader.UpdaterDialogFragment; import com.mapswithme.maps.editor.ViralFragment; import com.mapswithme.maps.location.LocationHelper; @@ -54,6 +56,7 @@ public class SplashActivity extends AppCompatActivity private boolean mPermissionsGranted; private boolean mNeedStoragePermission; private boolean mCanceled; + private boolean mWaitForAdvertisingInfo; @NonNull private final Runnable mWelcomeScreenDelayedTask = new Runnable() @@ -88,13 +91,16 @@ public class SplashActivity extends AppCompatActivity return; } - ExternalLibrariesMediator mediator = ((MwmApplication) getApplicationContext()).getMediator(); + ExternalLibrariesMediator mediator = MwmApplication.from(getApplicationContext()).getMediator(); if (!mediator.isAdvertisingInfoObtained()) { - UiThread.runLater(mInitCoreDelayedTask, DELAY); + LOGGER.i(TAG, "Advertising info not obtained yet, wait..."); + mWaitForAdvertisingInfo = true; return; } + mWaitForAdvertisingInfo = false; + if (!mediator.isLimitAdTrackingEnabled()) { LOGGER.i(TAG, "Limit ad tracking disabled, sensitive tracking initialized"); @@ -134,6 +140,9 @@ public class SplashActivity extends AppCompatActivity @NonNull private final BaseActivityDelegate mBaseDelegate = new BaseActivityDelegate(this); + @NonNull + private final AdvertisingInfoObserver mAdvertisingObserver = new AdvertisingInfoObserver(); + public static void start(@NonNull Context context, @Nullable Class activityToStart, @Nullable Intent initialIntent) @@ -205,6 +214,10 @@ public class SplashActivity extends AppCompatActivity { super.onStart(); mBaseDelegate.onStart(); + mAdvertisingObserver.attach(this); + ExternalLibrariesMediator mediator = MwmApplication.from(this).getMediator(); + LOGGER.d(TAG, "Add advertising observer"); + mediator.addAdvertisingObserver(mAdvertisingObserver); } @Override @@ -261,6 +274,11 @@ public class SplashActivity extends AppCompatActivity if (storagePermissionsDialog != null) storagePermissionsDialog.dismiss(); + runInitCoreTask(); + } + + private void runInitCoreTask() + { UiThread.runLater(mInitCoreDelayedTask, DELAY); } @@ -281,6 +299,10 @@ public class SplashActivity extends AppCompatActivity { super.onStop(); mBaseDelegate.onStop(); + mAdvertisingObserver.detach(); + ExternalLibrariesMediator mediator = MwmApplication.from(this).getMediator(); + LOGGER.d(TAG, "Remove advertising observer"); + mediator.removeAdvertisingObserver(mAdvertisingObserver); } @Override @@ -434,4 +456,44 @@ public class SplashActivity extends AppCompatActivity throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); } + + boolean isWaitForAdvertisingInfo() + { + return mWaitForAdvertisingInfo; + } + + private static class AdvertisingInfoObserver implements AdvertisingObserver, + Detachable + { + @Nullable + private SplashActivity mActivity; + + @Override + public void onAdvertisingInfoObtained() + { + LOGGER.i(TAG, "Advertising info obtained"); + if (mActivity == null) + return; + + if (!mActivity.isWaitForAdvertisingInfo()) + { + LOGGER.i(TAG, "Advertising info not waited"); + return; + } + + mActivity.runInitCoreTask(); + } + + @Override + public void attach(@NonNull SplashActivity object) + { + mActivity = object; + } + + @Override + public void detach() + { + mActivity = null; + } + } } diff --git a/android/src/com/mapswithme/maps/analytics/AdvertisingObserver.java b/android/src/com/mapswithme/maps/analytics/AdvertisingObserver.java new file mode 100644 index 0000000000..d04621b394 --- /dev/null +++ b/android/src/com/mapswithme/maps/analytics/AdvertisingObserver.java @@ -0,0 +1,6 @@ +package com.mapswithme.maps.analytics; + +public interface AdvertisingObserver +{ + void onAdvertisingInfoObtained(); +} diff --git a/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java b/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java index e8714d6eb3..4e58ad1375 100644 --- a/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java +++ b/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java @@ -33,6 +33,8 @@ import com.my.target.common.MyTargetPrivacy; import io.fabric.sdk.android.Fabric; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class ExternalLibrariesMediator @@ -51,6 +53,8 @@ public class ExternalLibrariesMediator private AdvertisingInfo mAdvertisingInfo; @Nullable private String mFirstLaunchDeepLink; + @NonNull + private List mAdvertisingObservers = new ArrayList<>(); public ExternalLibrariesMediator(@NonNull Application application) { @@ -160,11 +164,18 @@ public class ExternalLibrariesMediator } @UiThread - void setAdvertisingInfo(@NonNull AdvertisingInfo info) + private void setAdvertisingInfo(@NonNull AdvertisingInfo info) { mAdvertisingInfo = info; } + @UiThread + private void notifyObservers() + { + for (AdvertisingObserver observer : mAdvertisingObservers) + observer.onAdvertisingInfoObtained(); + } + @UiThread public boolean isAdvertisingInfoObtained() { @@ -210,6 +221,16 @@ public class ExternalLibrariesMediator return firstLaunchDeepLink; } + public void addAdvertisingObserver(@NonNull AdvertisingObserver observer) + { + mAdvertisingObservers.add(observer); + } + + public void removeAdvertisingObserver(@NonNull AdvertisingObserver observer) + { + mAdvertisingObservers.remove(observer); + } + private class FirstLaunchDeeplinkListener implements AppsFlyerConversionListener { @Override @@ -288,6 +309,7 @@ public class ExternalLibrariesMediator { super.onPostExecute(info); mMediator.setAdvertisingInfo(info); + mMediator.notifyObservers(); } }