[android] Moved welcome/policy screen at the start of onboarding

[android] Removed static field about first start and put it in application
This commit is contained in:
Александр Зацепин 2019-04-12 17:39:10 +03:00 committed by yoksnod
parent ca10737297
commit 09dbb58e48
4 changed files with 105 additions and 55 deletions

View file

@ -198,7 +198,7 @@ public class MapFragment extends BaseMwmFragment
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
final float exactDensityDpi = metrics.densityDpi;
final boolean firstStart = SplashActivity.isFirstStart();
final boolean firstStart = MwmApplication.from(getActivity()).isFirstLaunch();
if (!nativeCreateEngine(surface, (int) exactDensityDpi, firstStart, mLaunchByDeepLink,
BuildConfig.VERSION_CODE))
{

View file

@ -14,6 +14,7 @@ import com.mapswithme.maps.background.AppBackgroundTracker;
import com.mapswithme.maps.background.NotificationChannelFactory;
import com.mapswithme.maps.background.NotificationChannelProvider;
import com.mapswithme.maps.background.Notifier;
import com.mapswithme.maps.base.MediaPlayerWrapper;
import com.mapswithme.maps.bookmarks.data.BookmarkManager;
import com.mapswithme.maps.downloader.CountryItem;
import com.mapswithme.maps.downloader.MapManager;
@ -24,7 +25,6 @@ import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.location.TrackRecorder;
import com.mapswithme.maps.maplayer.subway.SubwayManager;
import com.mapswithme.maps.maplayer.traffic.TrafficManager;
import com.mapswithme.maps.base.MediaPlayerWrapper;
import com.mapswithme.maps.routing.RoutingController;
import com.mapswithme.maps.scheduling.ConnectivityJobScheduler;
import com.mapswithme.maps.scheduling.ConnectivityListener;
@ -43,8 +43,6 @@ import com.mapswithme.util.statistics.Statistics;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MwmApplication extends Application
{
@ -87,6 +85,7 @@ public class MwmApplication extends Application
@SuppressWarnings("NullableProblems")
@NonNull
private GeofenceRegistry mGeofenceRegistry;
private boolean mFirstLaunch;
@NonNull
public SubwayManager getSubwayManager()
@ -100,12 +99,21 @@ public class MwmApplication extends Application
sSelf = this;
}
/**
* Use the {@link #from(Context)} method instead.
*/
@Deprecated
public static MwmApplication get()
{
return sSelf;
}
@NonNull
public static MwmApplication from(@NonNull Context context)
{
return (MwmApplication) context.getApplicationContext();
}
/**
*
* Use {@link #backgroundTracker(Context)} instead.
@ -376,6 +384,16 @@ public class MwmApplication extends Application
return mLogger;
}
public void setFirstLaunch(boolean isFirstLaunch)
{
mFirstLaunch = isFirstLaunch;
}
public boolean isFirstLaunch()
{
return mFirstLaunch;
}
private static class VisibleAppLaunchListener implements AppBackgroundTracker.OnVisibleAppLaunchListener
{
@Override

View file

@ -19,6 +19,7 @@ import com.mapswithme.maps.base.BaseActivity;
import com.mapswithme.maps.base.BaseActivityDelegate;
import com.mapswithme.maps.downloader.UpdaterDialogFragment;
import com.mapswithme.maps.editor.ViralFragment;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.maps.news.BaseNewsFragment;
import com.mapswithme.maps.news.NewsFragment;
import com.mapswithme.maps.news.WelcomeDialogFragment;
@ -36,20 +37,17 @@ import com.mapswithme.util.statistics.PushwooshHelper;
import com.my.tracker.MyTracker;
public class SplashActivity extends AppCompatActivity
implements BaseNewsFragment.NewsDialogListener, BaseActivity
implements BaseNewsFragment.NewsDialogListener, BaseActivity,
WelcomeDialogFragment.PolicyAgreementListener
{
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
private static final String TAG = SplashActivity.class.getSimpleName();
private static final String EXTRA_CORE_INITIALIZED = "extra_core_initialized";
private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start";
public static final String EXTRA_INITIAL_INTENT = "extra_initial_intent";
private static final int REQUEST_PERMISSIONS = 1;
private static final long FIRST_START_DELAY = 1000;
private static final long FIRST_START_DELAY = 300;
private static final long DELAY = 100;
// The first launch of application ever - onboarding screen will be shown.
private static boolean sFirstStart;
private View mIvLogo;
private View mAppName;
@ -57,6 +55,16 @@ public class SplashActivity extends AppCompatActivity
private boolean mNeedStoragePermission;
private boolean mCanceled;
@NonNull
private final Runnable mWelcomeScreenDelayedTask = new Runnable()
{
@Override
public void run()
{
WelcomeDialogFragment.show(SplashActivity.this);
}
};
@NonNull
private final Runnable mPermissionsDelayedTask = new Runnable()
{
@ -138,19 +146,13 @@ public class SplashActivity extends AppCompatActivity
context.startActivity(intent);
}
public static boolean isFirstStart()
{
boolean res = sFirstStart;
sFirstStart = false;
return res;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mBaseDelegate.onCreate();
handleUpdateMapsFragmentCorrectly(savedInstanceState);
UiThread.cancelDelayedTasks(mWelcomeScreenDelayedTask);
UiThread.cancelDelayedTasks(mPermissionsDelayedTask);
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
UiThread.cancelDelayedTasks(mFinalDelayedTask);
@ -211,6 +213,28 @@ public class SplashActivity extends AppCompatActivity
super.onResume();
mBaseDelegate.onResume();
mCanceled = false;
if (Counters.isMigrationNeeded())
{
Config.migrateCountersToSharedPrefs();
Counters.setMigrationExecuted();
}
boolean isFirstLaunch = WelcomeDialogFragment.isFirstLaunch(this);
if (isFirstLaunch)
MwmApplication.from(this).setFirstLaunch(true);
if (isFirstLaunch || WelcomeDialogFragment.recreate(this))
{
UiThread.runLater(mWelcomeScreenDelayedTask, FIRST_START_DELAY);
return;
}
processPermissionGranting();
}
private void processPermissionGranting()
{
mPermissionsGranted = PermissionsUtils.isExternalStorageGranted();
DialogFragment storagePermissionsDialog = StoragePermissionsDialogFragment.find(this);
DialogFragment permissionsDialog = PermissionsDialogFragment.find(this);
@ -226,7 +250,7 @@ public class SplashActivity extends AppCompatActivity
}
permissionsDialog = PermissionsDialogFragment.find(this);
if (permissionsDialog == null)
UiThread.runLater(mPermissionsDelayedTask, FIRST_START_DELAY);
UiThread.runLater(mPermissionsDelayedTask, DELAY);
return;
}
@ -246,6 +270,7 @@ public class SplashActivity extends AppCompatActivity
super.onPause();
mBaseDelegate.onPause();
mCanceled = true;
UiThread.cancelDelayedTasks(mWelcomeScreenDelayedTask);
UiThread.cancelDelayedTasks(mPermissionsDelayedTask);
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
UiThread.cancelDelayedTasks(mFinalDelayedTask);
@ -277,20 +302,6 @@ public class SplashActivity extends AppCompatActivity
return;
}
if (Counters.isMigrationNeeded())
{
Config.migrateCountersToSharedPrefs();
Counters.setMigrationExecuted();
}
sFirstStart = WelcomeDialogFragment.showOn(this);
if (sFirstStart)
{
PushwooshHelper.nativeProcessFirstLaunch();
UiUtils.hide(mIvLogo, mAppName);
return;
}
boolean showNews = NewsFragment.showOn(this, this);
if (!showNews)
{
@ -356,6 +367,12 @@ public class SplashActivity extends AppCompatActivity
processNavigation();
}
@Override
public void onPolicyAgreementApplied()
{
processPermissionGranting();
}
private void initView()
{
UiUtils.setupStatusBar(this);
@ -366,7 +383,15 @@ public class SplashActivity extends AppCompatActivity
private void init()
{
MwmApplication.get().initCore();
MwmApplication app = MwmApplication.from(this);
boolean success = app.initCore();
if (!success || !app.isFirstLaunch())
return;
PushwooshHelper.nativeProcessFirstLaunch();
LocationHelper.INSTANCE.onEnteredIntoFirstRun();
if (!LocationHelper.INSTANCE.isActive())
LocationHelper.INSTANCE.start();
}
@SuppressWarnings("unchecked")

View file

@ -2,6 +2,7 @@ package com.mapswithme.maps.news;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
@ -20,16 +21,21 @@ import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmDialogFragment;
import com.mapswithme.maps.location.LocationHelper;
import com.mapswithme.util.Counters;
import com.mapswithme.util.UiUtils;
public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View.OnClickListener
{
@Nullable
private BaseNewsFragment.NewsDialogListener mListener;
private PolicyAgreementListener mListener;
public static boolean showOn(@NonNull FragmentActivity activity)
public static void show(@NonNull FragmentActivity activity)
{
create(activity);
Counters.setFirstStartDialogSeen();
}
public static boolean isFirstLaunch(@NonNull FragmentActivity activity)
{
if (Counters.getFirstInstallVersion() < BuildConfig.VERSION_CODE)
return false;
@ -38,14 +44,7 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
if (fm.isDestroyed())
return false;
if (Counters.isFirstStartDialogSeen() &&
!recreate(activity))
return false;
create(activity);
Counters.setFirstStartDialogSeen();
return true;
return !Counters.isFirstStartDialogSeen();
}
private static void create(@NonNull FragmentActivity activity)
@ -57,7 +56,7 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
.commitAllowingStateLoss();
}
private static boolean recreate(@NonNull FragmentActivity activity)
public static boolean recreate(@NonNull FragmentActivity activity)
{
FragmentManager fm = activity.getSupportFragmentManager();
Fragment f = fm.findFragmentByTag(WelcomeDialogFragment.class.getName());
@ -79,7 +78,7 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
{
super.onAttach(activity);
if (activity instanceof BaseNewsFragment.NewsDialogListener)
mListener = (BaseNewsFragment.NewsDialogListener) activity;
mListener = (PolicyAgreementListener) activity;
}
@Override
@ -99,10 +98,6 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
LocationHelper.INSTANCE.onEnteredIntoFirstRun();
if (!LocationHelper.INSTANCE.isActive())
LocationHelper.INSTANCE.start();
Dialog res = super.onCreateDialog(savedInstanceState);
res.requestWindowFeature(Window.FEATURE_NO_TITLE);
res.setCancelable(false);
@ -110,13 +105,13 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
View content = View.inflate(getActivity(), R.layout.fragment_welcome, null);
res.setContentView(content);
content.findViewById(R.id.btn__continue).setOnClickListener(this);
ImageView image = (ImageView) content.findViewById(R.id.iv__image);
ImageView image = content.findViewById(R.id.iv__image);
image.setImageResource(R.drawable.img_welcome);
TextView title = (TextView) content.findViewById(R.id.tv__title);
TextView title = content.findViewById(R.id.tv__title);
title.setText(R.string.onboarding_welcome_title);
TextView subtitle = (TextView) content.findViewById(R.id.tv__subtitle1);
TextView subtitle = content.findViewById(R.id.tv__subtitle1);
subtitle.setText(R.string.onboarding_welcome_first_subtitle);
TextView terms = (TextView) content.findViewById(R.id.tv__subtitle2);
TextView terms = content.findViewById(R.id.tv__subtitle2);
UiUtils.show(terms);
Resources rs = content.getResources();
terms.setText(Html.fromHtml(rs.getString(R.string.onboarding_welcome_second_subtitle,
@ -133,7 +128,19 @@ public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View
return;
if (mListener != null)
mListener.onDialogDone();
mListener.onPolicyAgreementApplied();
dismiss();
}
@Override
public void onCancel(DialogInterface dialog)
{
super.onCancel(dialog);
requireActivity().finish();
}
public interface PolicyAgreementListener
{
void onPolicyAgreementApplied();
}
}