diff options
author | Александр Зацепин <az@mapswithme.com> | 2019-05-15 17:58:24 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2019-05-17 18:45:59 +0300 |
commit | 6f607400b3cde96383d6980f57fe187966f61785 (patch) | |
tree | 3363dfbd6a0c768423686e9785b6388109d6445e /android | |
parent | c729084d80646d391bb0a3a7b707590d479bb619 (diff) |
[android] Refactored obtaining system advertising info to use observers instead of waiting based on loop in ui thread
Diffstat (limited to 'android')
3 files changed, 93 insertions, 3 deletions
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<? extends Activity> 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<SplashActivity> + { + @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<AdvertisingObserver> mAdvertisingObservers = new ArrayList<>(); public ExternalLibrariesMediator(@NonNull Application application) { @@ -160,12 +164,19 @@ 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() { return mAdvertisingInfo != null; @@ -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(); } } |