From 09dbb58e48f8c63f523d61082139a6258c1cdaaf 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: Fri, 12 Apr 2019 17:39:10 +0300 Subject: [PATCH] [android] Moved welcome/policy screen at the start of onboarding [android] Removed static field about first start and put it in application --- .../src/com/mapswithme/maps/MapFragment.java | 2 +- .../com/mapswithme/maps/MwmApplication.java | 24 +++++- .../com/mapswithme/maps/SplashActivity.java | 83 ++++++++++++------- .../maps/news/WelcomeDialogFragment.java | 51 +++++++----- 4 files changed, 105 insertions(+), 55 deletions(-) diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 230b9b8614..16e72b9f86 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -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)) { diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 6fd4c9df2b..d8066f9b1f 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -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 diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java index bb94e0a317..3ec4f8e9c7 100644 --- a/android/src/com/mapswithme/maps/SplashActivity.java +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -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") diff --git a/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java b/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java index aabbd55734..34eaae7e58 100644 --- a/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java +++ b/android/src/com/mapswithme/maps/news/WelcomeDialogFragment.java @@ -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(); + } }