[android] Refactored obtaining system advertising info to use observers instead of waiting based on loop in ui thread

This commit is contained in:
Александр Зацепин 2019-05-15 17:58:24 +03:00 committed by Daria Volvenkova
parent c729084d80
commit 6f607400b3
3 changed files with 93 additions and 3 deletions

View file

@ -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;
}
}
}

View file

@ -0,0 +1,6 @@
package com.mapswithme.maps.analytics;
public interface AdvertisingObserver
{
void onAdvertisingInfoObtained();
}

View file

@ -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,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();
}
}