forked from organicmaps/organicmaps
[android]: Remove onboarding screens
Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
parent
a68e23e0f7
commit
70443914c9
9 changed files with 19 additions and 754 deletions
|
@ -63,26 +63,4 @@
|
|||
android:background="?nav_background"
|
||||
android:contentDescription="@string/core_my_position"
|
||||
android:tint="@null"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/subs_screen_btn_container"
|
||||
android:layout_alignBottom="@id/nav_zoom_out"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/dog_btn_bg"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:src="?attr/bgDogBtn"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/onboarding_btn"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center"/>
|
||||
</FrameLayout>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -63,27 +63,4 @@
|
|||
android:layout_marginTop="@dimen/nav_zoom_top"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/subs_screen_btn_container"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignBottom="@id/nav_zoom_in"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/dog_btn_bg"
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
style="@style/MwmWidget.MapButton.Traffic"
|
||||
android:src="?attr/bgDogBtn"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/onboarding_btn"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center" />
|
||||
</FrameLayout>
|
||||
</RelativeLayout>
|
||||
|
|
|
@ -82,15 +82,8 @@ import com.mapswithme.maps.maplayer.subway.SubwayManager;
|
|||
import com.mapswithme.maps.maplayer.traffic.OnTrafficLayerToggleListener;
|
||||
import com.mapswithme.maps.maplayer.traffic.TrafficManager;
|
||||
import com.mapswithme.maps.maplayer.traffic.widget.TrafficButton;
|
||||
import com.mapswithme.maps.news.OnboardingStep;
|
||||
import com.mapswithme.maps.onboarding.IntroductionDialogFragment;
|
||||
import com.mapswithme.maps.onboarding.IntroductionScreenFactory;
|
||||
import com.mapswithme.maps.onboarding.OnboardingTip;
|
||||
import com.mapswithme.maps.onboarding.WelcomeDialogFragment;
|
||||
import com.mapswithme.maps.promo.Promo;
|
||||
import com.mapswithme.maps.promo.PromoAfterBooking;
|
||||
import com.mapswithme.maps.promo.PromoBookingDialogFragment;
|
||||
import com.mapswithme.maps.purchase.BookmarksAllSubscriptionActivity;
|
||||
import com.mapswithme.maps.purchase.FailedPurchaseChecker;
|
||||
import com.mapswithme.maps.purchase.PurchaseCallback;
|
||||
import com.mapswithme.maps.purchase.PurchaseController;
|
||||
|
@ -183,7 +176,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
AlertDialogCallback, RoutingModeListener,
|
||||
AppBackgroundTracker.OnTransitionListener,
|
||||
MaterialTapTargetPrompt.PromptStateChangeListener,
|
||||
WelcomeDialogFragment.OnboardingStepPassedListener,
|
||||
OnIsolinesLayerToggleListener,
|
||||
OnGuidesLayerToggleListener,
|
||||
GuidesGalleryListener,
|
||||
|
@ -293,8 +285,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
private MenuController mMainMenuController;
|
||||
@Nullable
|
||||
private Tutorial mTutorial;
|
||||
@Nullable
|
||||
private OnboardingTip mOnboardingTip;
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@NonNull
|
||||
private Toolbar mPlacePageToolbar;
|
||||
|
@ -518,7 +508,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
if (savedInstanceState != null)
|
||||
{
|
||||
mLocationErrorDialogAnnoying = savedInstanceState.getBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING);
|
||||
mOnboardingTip = savedInstanceState.getParcelable(EXTRA_ONBOARDING_TIP);
|
||||
}
|
||||
mIsTabletLayout = getResources().getBoolean(R.bool.tabletLayout);
|
||||
|
||||
|
@ -784,32 +773,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
mNavMyPosition = new MyPositionButton(myPosition, mOnMyPositionClickListener);
|
||||
|
||||
initToggleMapLayerController(frame);
|
||||
View openSubsScreenBtnContainer = frame.findViewById(R.id.subs_screen_btn_container);
|
||||
final OnboardingTip tip = OnboardingTip.get();
|
||||
boolean hasOnBoardingView = false; /* mOnboardingTip == null && tip != null
|
||||
&& MwmApplication.from(this).isFirstLaunch(); */
|
||||
|
||||
mNavAnimationController = new NavigationButtonsAnimationController(
|
||||
zoomIn, zoomOut, myPosition, getWindow().getDecorView().getRootView(), this,
|
||||
hasOnBoardingView ? openSubsScreenBtnContainer : null);
|
||||
|
||||
UiUtils.showIf(hasOnBoardingView, openSubsScreenBtnContainer);
|
||||
if (hasOnBoardingView)
|
||||
{
|
||||
openSubsScreenBtnContainer.findViewById(R.id.onboarding_btn)
|
||||
.setOnClickListener(v -> onBoardingBtnClicked(tip));
|
||||
}
|
||||
}
|
||||
|
||||
private void onBoardingBtnClicked(@NonNull OnboardingTip tip)
|
||||
{
|
||||
if (mNavAnimationController == null)
|
||||
return;
|
||||
|
||||
mNavAnimationController.hideOnBoardingTipBtn();
|
||||
mOnboardingTip = tip;
|
||||
OnboardingStep step = com.mapswithme.maps.onboarding.Utils.getOnboardingStepByTip(mOnboardingTip);
|
||||
WelcomeDialogFragment.showOnboardinStep(this, step);
|
||||
zoomIn, zoomOut, myPosition, getWindow().getDecorView().getRootView(), this);
|
||||
}
|
||||
|
||||
private void initToggleMapLayerController(@NonNull View frame)
|
||||
|
@ -970,7 +936,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
// orientation changing, etc. Otherwise, the saved route might be restored at undesirable moment.
|
||||
RoutingController.get().deleteSavedRoute();
|
||||
|
||||
outState.putParcelable(EXTRA_ONBOARDING_TIP, mOnboardingTip);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
|
@ -2599,40 +2564,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
|||
}
|
||||
}
|
||||
|
||||
public void onOnboardingStepPassed(@NonNull OnboardingStep step)
|
||||
{
|
||||
if (mOnboardingTip == null)
|
||||
throw new AssertionError("Onboarding tip must be non-null at this point!");
|
||||
|
||||
switch (step)
|
||||
{
|
||||
case DISCOVER_GUIDES:
|
||||
case CHECK_OUT_SIGHTS:
|
||||
BookmarksCatalogActivity.startForResult(this,
|
||||
BookmarkCategoriesActivity.REQ_CODE_DOWNLOAD_BOOKMARK_CATEGORY,
|
||||
mOnboardingTip.getUrl());
|
||||
break;
|
||||
case SUBSCRIBE_TO_CATALOG:
|
||||
BookmarksAllSubscriptionActivity.startForResult(this);
|
||||
break;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Onboarding step '" + step + "' not supported " +
|
||||
"for sponsored button");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastOnboardingStepPassed()
|
||||
{
|
||||
// Do nothing by default.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOnboardingStepCancelled()
|
||||
{
|
||||
// Do nothing by default.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGalleryGuideSelected(@NonNull String url)
|
||||
{
|
||||
|
|
|
@ -4,8 +4,6 @@ import android.content.res.Resources;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import android.view.View;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
|
||||
import com.mapswithme.maps.location.LocationHelper;
|
||||
import com.mapswithme.maps.location.LocationState;
|
||||
|
@ -21,8 +19,6 @@ class NavigationButtonsAnimationController
|
|||
private final View mZoomOut;
|
||||
@NonNull
|
||||
private final View mMyPosition;
|
||||
@Nullable
|
||||
private View mObBoardingTipBtnContainer;
|
||||
|
||||
@Nullable
|
||||
private final OnTranslationChangedListener mTranslationListener;
|
||||
|
@ -38,12 +34,10 @@ class NavigationButtonsAnimationController
|
|||
|
||||
NavigationButtonsAnimationController(@NonNull View zoomIn, @NonNull View zoomOut,
|
||||
@NonNull View myPosition, @NonNull final View contentView,
|
||||
@Nullable OnTranslationChangedListener translationListener,
|
||||
@Nullable View onBoardingTipBtnContainer)
|
||||
@Nullable OnTranslationChangedListener translationListener)
|
||||
{
|
||||
mZoomOut = zoomOut;
|
||||
mZoomIn = zoomIn;
|
||||
mObBoardingTipBtnContainer = onBoardingTipBtnContainer;
|
||||
checkZoomButtonsVisibility();
|
||||
mMyPosition = myPosition;
|
||||
Resources res = mZoomIn.getResources();
|
||||
|
@ -53,12 +47,6 @@ class NavigationButtonsAnimationController
|
|||
calculateLimitTranslations();
|
||||
contentView.addOnLayoutChangeListener(new ContentViewLayoutChangeListener(contentView));
|
||||
mTranslationListener = translationListener;
|
||||
if (onBoardingTipBtnContainer != null)
|
||||
{
|
||||
Animation animation = AnimationUtils.loadAnimation(onBoardingTipBtnContainer.getContext(),
|
||||
R.anim.dog_btn_rotation);
|
||||
onBoardingTipBtnContainer.findViewById(R.id.onboarding_btn).setAnimation(animation);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkZoomButtonsVisibility()
|
||||
|
@ -113,15 +101,12 @@ class NavigationButtonsAnimationController
|
|||
mMyPosition.setTranslationY(translation);
|
||||
mZoomOut.setTranslationY(translation);
|
||||
mZoomIn.setTranslationY(translation);
|
||||
if (mObBoardingTipBtnContainer != null)
|
||||
mObBoardingTipBtnContainer.setTranslationY(translation);
|
||||
|
||||
|
||||
if (mZoomIn.getVisibility() == View.VISIBLE
|
||||
&& !isViewInsideLimits(mZoomIn))
|
||||
{
|
||||
UiUtils.invisible(mZoomIn, mZoomOut);
|
||||
if (mObBoardingTipBtnContainer != null)
|
||||
UiUtils.invisible(mObBoardingTipBtnContainer);
|
||||
|
||||
if (mTranslationListener != null)
|
||||
mTranslationListener.onFadeOutZoomButtons();
|
||||
|
@ -130,8 +115,6 @@ class NavigationButtonsAnimationController
|
|||
&& isViewInsideLimits(mZoomIn))
|
||||
{
|
||||
UiUtils.show(mZoomIn, mZoomOut);
|
||||
if (mObBoardingTipBtnContainer != null)
|
||||
UiUtils.show(mObBoardingTipBtnContainer);
|
||||
if (mTranslationListener != null)
|
||||
mTranslationListener.onFadeInZoomButtons();
|
||||
}
|
||||
|
@ -168,19 +151,6 @@ class NavigationButtonsAnimationController
|
|||
return;
|
||||
|
||||
UiUtils.hide(mZoomIn, mZoomOut);
|
||||
if (mObBoardingTipBtnContainer == null)
|
||||
return;
|
||||
|
||||
UiUtils.hide(mObBoardingTipBtnContainer);
|
||||
}
|
||||
|
||||
void hideOnBoardingTipBtn()
|
||||
{
|
||||
if (mObBoardingTipBtnContainer == null)
|
||||
return;
|
||||
|
||||
mObBoardingTipBtnContainer.setVisibility(View.GONE);
|
||||
mObBoardingTipBtnContainer = null;
|
||||
}
|
||||
|
||||
void appearZoomButtons()
|
||||
|
@ -189,11 +159,6 @@ class NavigationButtonsAnimationController
|
|||
return;
|
||||
|
||||
UiUtils.show(mZoomIn, mZoomOut);
|
||||
|
||||
if (mObBoardingTipBtnContainer == null)
|
||||
return;
|
||||
|
||||
UiUtils.show(mObBoardingTipBtnContainer);
|
||||
}
|
||||
|
||||
private static boolean showZoomButtons()
|
||||
|
|
|
@ -12,15 +12,14 @@ import androidx.annotation.Nullable;
|
|||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
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.OnboardingStep;
|
||||
import com.mapswithme.maps.onboarding.BaseNewsFragment;
|
||||
import com.mapswithme.maps.onboarding.WelcomeDialogFragment;
|
||||
import com.mapswithme.maps.permissions.PermissionsDialogFragment;
|
||||
import com.mapswithme.maps.permissions.StoragePermissionsDialogFragment;
|
||||
import com.mapswithme.util.Config;
|
||||
|
@ -33,11 +32,8 @@ import com.mapswithme.util.log.Logger;
|
|||
import com.mapswithme.util.log.LoggerFactory;
|
||||
|
||||
public class SplashActivity extends AppCompatActivity
|
||||
implements BaseNewsFragment.NewsDialogListener, BaseActivity,
|
||||
WelcomeDialogFragment.PolicyAgreementListener,
|
||||
WelcomeDialogFragment.OnboardingStepPassedListener
|
||||
implements BaseNewsFragment.NewsDialogListener, BaseActivity
|
||||
{
|
||||
private static final String EXTRA_CURRENT_ONBOARDING_STEP = "extra_current_onboarding_step";
|
||||
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
|
||||
private static final String TAG = SplashActivity.class.getSimpleName();
|
||||
private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start";
|
||||
|
@ -53,33 +49,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
private boolean mNeedStoragePermission;
|
||||
private boolean mCanceled;
|
||||
|
||||
@NonNull
|
||||
private final Runnable mUserAgreementDelayedTask = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
WelcomeDialogFragment.show(SplashActivity.this);
|
||||
}
|
||||
};
|
||||
|
||||
@NonNull
|
||||
private final Runnable mOnboardingStepsTask = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if (mCurrentOnboardingStep != null)
|
||||
{
|
||||
WelcomeDialogFragment.showOnboardinStepsStartWith(SplashActivity.this,
|
||||
mCurrentOnboardingStep);
|
||||
return;
|
||||
}
|
||||
|
||||
WelcomeDialogFragment.showOnboardinSteps(SplashActivity.this);
|
||||
}
|
||||
};
|
||||
|
||||
@NonNull
|
||||
private final Runnable mPermissionsDelayedTask = new Runnable()
|
||||
{
|
||||
|
@ -127,9 +96,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
@NonNull
|
||||
private final BaseActivityDelegate mBaseDelegate = new BaseActivityDelegate(this);
|
||||
|
||||
@Nullable
|
||||
private OnboardingStep mCurrentOnboardingStep;
|
||||
|
||||
public static void start(@NonNull Context context,
|
||||
@Nullable Class<? extends Activity> activityToStart,
|
||||
@Nullable Intent initialIntent)
|
||||
|
@ -147,10 +113,7 @@ public class SplashActivity extends AppCompatActivity
|
|||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
mBaseDelegate.onCreate();
|
||||
handleOnboardingStep(savedInstanceState);
|
||||
handleUpdateMapsFragmentCorrectly(savedInstanceState);
|
||||
UiThread.cancelDelayedTasks(mUserAgreementDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mOnboardingStepsTask);
|
||||
UiThread.cancelDelayedTasks(mPermissionsDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mFinalDelayedTask);
|
||||
|
@ -158,18 +121,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
initView();
|
||||
}
|
||||
|
||||
private void handleOnboardingStep(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
if (savedInstanceState == null)
|
||||
return;
|
||||
|
||||
if (!savedInstanceState.containsKey(EXTRA_CURRENT_ONBOARDING_STEP))
|
||||
return;
|
||||
|
||||
int step = savedInstanceState.getInt(EXTRA_CURRENT_ONBOARDING_STEP);
|
||||
mCurrentOnboardingStep = OnboardingStep.values()[step];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent)
|
||||
{
|
||||
|
@ -231,35 +182,10 @@ public class SplashActivity extends AppCompatActivity
|
|||
Counters.setMigrationExecuted(context);
|
||||
}
|
||||
|
||||
final boolean isFirstLaunch = WelcomeDialogFragment.isFirstLaunch(this);
|
||||
final boolean isFirstLaunch = isFirstLaunch();
|
||||
if (isFirstLaunch)
|
||||
MwmApplication.from(this).setFirstLaunch(true);
|
||||
|
||||
boolean isWelcomeFragmentOnScreen = false;
|
||||
DialogFragment welcomeFragment = WelcomeDialogFragment.find(this);
|
||||
if (welcomeFragment != null)
|
||||
{
|
||||
isWelcomeFragmentOnScreen = true;
|
||||
welcomeFragment.dismissAllowingStateLoss();
|
||||
}
|
||||
|
||||
if (isFirstLaunch || isWelcomeFragmentOnScreen)
|
||||
{
|
||||
if (WelcomeDialogFragment.isAgreementDeclined(this))
|
||||
{
|
||||
UiThread.runLater(mUserAgreementDelayedTask, FIRST_START_DELAY);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (processPermissionGranting())
|
||||
{
|
||||
UiThread.runLater(mOnboardingStepsTask, DELAY);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (processPermissionGranting())
|
||||
runInitCoreTask();
|
||||
}
|
||||
|
@ -306,8 +232,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
super.onPause();
|
||||
mBaseDelegate.onPause();
|
||||
mCanceled = true;
|
||||
UiThread.cancelDelayedTasks(mUserAgreementDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mOnboardingStepsTask);
|
||||
UiThread.cancelDelayedTasks(mPermissionsDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mInitCoreDelayedTask);
|
||||
UiThread.cancelDelayedTasks(mFinalDelayedTask);
|
||||
|
@ -320,14 +244,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
mBaseDelegate.onStop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState)
|
||||
{
|
||||
super.onSaveInstanceState(outState);
|
||||
if (mCurrentOnboardingStep != null)
|
||||
outState.putInt(EXTRA_CURRENT_ONBOARDING_STEP, mCurrentOnboardingStep.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy()
|
||||
{
|
||||
|
@ -412,41 +328,6 @@ public class SplashActivity extends AppCompatActivity
|
|||
processNavigation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPolicyAgreementApplied()
|
||||
{
|
||||
boolean permissionsGranted = processPermissionGranting();
|
||||
if (!permissionsGranted)
|
||||
return;
|
||||
|
||||
boolean isFirstLaunch = WelcomeDialogFragment.isFirstLaunch(this);
|
||||
if (isFirstLaunch)
|
||||
{
|
||||
UiThread.runLater(mOnboardingStepsTask, DELAY);
|
||||
return;
|
||||
}
|
||||
|
||||
runInitCoreTask();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastOnboardingStepPassed()
|
||||
{
|
||||
runInitCoreTask();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOnboardingStepCancelled()
|
||||
{
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOnboardingStepPassed(@NonNull OnboardingStep step)
|
||||
{
|
||||
mCurrentOnboardingStep = step;
|
||||
}
|
||||
|
||||
private void initView()
|
||||
{
|
||||
UiUtils.setupStatusBar(this);
|
||||
|
@ -508,4 +389,16 @@ public class SplashActivity extends AppCompatActivity
|
|||
|
||||
throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme);
|
||||
}
|
||||
|
||||
boolean isFirstLaunch()
|
||||
{
|
||||
if (Counters.getFirstInstallVersion(getApplicationContext()) < BuildConfig.VERSION_CODE)
|
||||
return false;
|
||||
|
||||
FragmentManager fm = getSupportFragmentManager();
|
||||
if (fm.isDestroyed())
|
||||
return false;
|
||||
|
||||
return !Counters.isFirstStartDialogSeen(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,91 +0,0 @@
|
|||
package com.mapswithme.maps.onboarding;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
public class OnboardingTip implements Parcelable
|
||||
{
|
||||
// The order is important, must corresponds to
|
||||
// OnboardingTip::Type enum at map/onboarding.hpp.
|
||||
public static final int DISCOVER_CATALOG= 0;
|
||||
public static final int DOWNLOAD_SAMPLES = 1;
|
||||
public static final int BUY_SUBSCRIPTION = 2;
|
||||
|
||||
protected OnboardingTip(Parcel in)
|
||||
{
|
||||
mType = in.readInt();
|
||||
mUrl = in.readString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags)
|
||||
{
|
||||
dest.writeInt(mType);
|
||||
dest.writeString(mUrl);
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef({ DISCOVER_CATALOG, DOWNLOAD_SAMPLES, BUY_SUBSCRIPTION})
|
||||
@interface ScreenType {}
|
||||
|
||||
@ScreenType
|
||||
private final int mType;
|
||||
@NonNull
|
||||
private final String mUrl;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
OnboardingTip(@ScreenType int type, @NonNull String url)
|
||||
{
|
||||
mType = type;
|
||||
mUrl = url;
|
||||
}
|
||||
|
||||
@ScreenType
|
||||
public int getType()
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getUrl()
|
||||
{
|
||||
return mUrl;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static OnboardingTip get()
|
||||
{
|
||||
return nativeGetTip();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static native OnboardingTip nativeGetTip();
|
||||
|
||||
public static final Creator<OnboardingTip> CREATOR = new Creator<OnboardingTip>()
|
||||
{
|
||||
@Override
|
||||
public OnboardingTip createFromParcel(Parcel in)
|
||||
{
|
||||
return new OnboardingTip(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OnboardingTip[] newArray(int size)
|
||||
{
|
||||
return new OnboardingTip[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package com.mapswithme.maps.onboarding;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import com.mapswithme.maps.news.OnboardingStep;
|
||||
|
||||
public class Utils
|
||||
{
|
||||
@NonNull
|
||||
public static OnboardingStep getOnboardingStepByTip(@NonNull OnboardingTip tip)
|
||||
{
|
||||
switch (tip.getType())
|
||||
{
|
||||
case OnboardingTip.BUY_SUBSCRIPTION:
|
||||
return OnboardingStep.SUBSCRIBE_TO_CATALOG;
|
||||
case OnboardingTip.DISCOVER_CATALOG:
|
||||
return OnboardingStep.DISCOVER_GUIDES;
|
||||
case OnboardingTip.DOWNLOAD_SAMPLES:
|
||||
return OnboardingStep.CHECK_OUT_SIGHTS;
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unsupported onboarding tip: " + tip);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,361 +0,0 @@
|
|||
package com.mapswithme.maps.onboarding;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
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.news.OnboardingStep;
|
||||
import com.mapswithme.util.Counters;
|
||||
import com.mapswithme.util.SharedPropertiesUtils;
|
||||
import com.mapswithme.util.ThemeUtils;
|
||||
import com.mapswithme.util.UiUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
public class WelcomeDialogFragment extends BaseMwmDialogFragment implements View.OnClickListener
|
||||
{
|
||||
private static final String ARG_SPECIFIC_STEP = "arg_specific_step";
|
||||
private static final String ARG_HAS_MANY_STEPS = "arg_has_many_steps";
|
||||
|
||||
@NonNull
|
||||
private final Stack<OnboardingStep> mOnboardingSteps = new Stack<>();
|
||||
|
||||
@Nullable
|
||||
private PolicyAgreementListener mPolicyAgreementListener;
|
||||
|
||||
@Nullable
|
||||
private OnboardingStepPassedListener mOnboardingStepPassedListener;
|
||||
|
||||
@Nullable
|
||||
private OnboardingStep mOnboardinStep;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private View mContentView;
|
||||
|
||||
// @SuppressWarnings("NullableProblems")
|
||||
// @NonNull
|
||||
// private ImageView mImage;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mTitle;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mSubtitle;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private TextView mAcceptBtn;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private CheckBox mTermOfUseCheckbox;
|
||||
|
||||
@SuppressWarnings("NullableProblems")
|
||||
@NonNull
|
||||
private CheckBox mPrivacyPolicyCheckbox;
|
||||
|
||||
public static void show(@NonNull FragmentActivity activity)
|
||||
{
|
||||
create(activity, null);
|
||||
}
|
||||
|
||||
public static void showOnboardinSteps(@NonNull FragmentActivity activity)
|
||||
{
|
||||
Bundle args = new Bundle();
|
||||
args.putBoolean(ARG_HAS_MANY_STEPS, true);
|
||||
create(activity, args);
|
||||
}
|
||||
|
||||
public static void showOnboardinStepsStartWith(@NonNull FragmentActivity activity,
|
||||
@NonNull OnboardingStep startStep)
|
||||
{
|
||||
Bundle args = new Bundle();
|
||||
args.putBoolean(ARG_HAS_MANY_STEPS, true);
|
||||
args.putInt(ARG_SPECIFIC_STEP, startStep.ordinal());
|
||||
create(activity, args);
|
||||
}
|
||||
|
||||
public static void showOnboardinStep(@NonNull FragmentActivity activity,
|
||||
@NonNull OnboardingStep step)
|
||||
{
|
||||
Bundle args = new Bundle();
|
||||
args.putInt(ARG_SPECIFIC_STEP, step.ordinal());
|
||||
create(activity, args);
|
||||
}
|
||||
|
||||
public static boolean isFirstLaunch(@NonNull FragmentActivity activity)
|
||||
{
|
||||
if (Counters.getFirstInstallVersion(activity.getApplicationContext()) < BuildConfig.VERSION_CODE)
|
||||
return false;
|
||||
|
||||
FragmentManager fm = activity.getSupportFragmentManager();
|
||||
if (fm.isDestroyed())
|
||||
return false;
|
||||
|
||||
return !Counters.isFirstStartDialogSeen(activity);
|
||||
}
|
||||
|
||||
private static void create(@NonNull FragmentActivity activity, @Nullable Bundle args)
|
||||
{
|
||||
final WelcomeDialogFragment fragment = new WelcomeDialogFragment();
|
||||
fragment.setArguments(args);
|
||||
activity.getSupportFragmentManager()
|
||||
.beginTransaction()
|
||||
.add(fragment, WelcomeDialogFragment.class.getName())
|
||||
.commitAllowingStateLoss();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static DialogFragment find(@NonNull FragmentActivity activity)
|
||||
{
|
||||
final FragmentManager fm = activity.getSupportFragmentManager();
|
||||
if (fm.isDestroyed())
|
||||
return null;
|
||||
|
||||
Fragment f = fm.findFragmentByTag(WelcomeDialogFragment.class.getName());
|
||||
return (DialogFragment) f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity)
|
||||
{
|
||||
super.onAttach(activity);
|
||||
if (activity instanceof BaseNewsFragment.NewsDialogListener)
|
||||
mPolicyAgreementListener = (PolicyAgreementListener) activity;
|
||||
if (activity instanceof OnboardingStepPassedListener)
|
||||
mOnboardingStepPassedListener = (OnboardingStepPassedListener) activity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDetach()
|
||||
{
|
||||
mPolicyAgreementListener = null;
|
||||
super.onDetach();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getCustomTheme()
|
||||
{
|
||||
return ThemeUtils.isNightTheme(requireContext()) ? R.style.MwmTheme_DialogFragment_NoFullscreen_Night
|
||||
: R.style.MwmTheme_DialogFragment_NoFullscreen;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState)
|
||||
{
|
||||
Dialog res = super.onCreateDialog(savedInstanceState);
|
||||
res.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
res.setCancelable(false);
|
||||
|
||||
hanldeOnboardingSteps();
|
||||
|
||||
mContentView = View.inflate(getActivity(), R.layout.fragment_welcome, null);
|
||||
res.setContentView(mContentView);
|
||||
mAcceptBtn = mContentView.findViewById(R.id.accept_btn);
|
||||
mAcceptBtn.setOnClickListener(this);
|
||||
// mImage = mContentView.findViewById(R.id.iv__image);
|
||||
// mImage.setImageResource(R.drawable.img_welcome);
|
||||
mTitle = mContentView.findViewById(R.id.tv__title);
|
||||
List<String> headers = Arrays.asList(getString(R.string.new_onboarding_step1_header),
|
||||
getString(R.string.new_onboarding_step1_header_2));
|
||||
String titleText = TextUtils.join(UiUtils.NEW_STRING_DELIMITER, headers);
|
||||
mTitle.setText(titleText);
|
||||
mSubtitle = mContentView.findViewById(R.id.tv__subtitle1);
|
||||
mSubtitle.setText(R.string.sign_message_gdpr);
|
||||
|
||||
initUserAgreementViews();
|
||||
bindWelcomeScreenType();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
private void hanldeOnboardingSteps()
|
||||
{
|
||||
Bundle args = getArguments();
|
||||
if (args != null)
|
||||
{
|
||||
boolean hasManySteps = args.containsKey(ARG_HAS_MANY_STEPS);
|
||||
if (hasManySteps)
|
||||
{
|
||||
mOnboardingSteps.push(OnboardingStep.SHARE_EMOTIONS);
|
||||
mOnboardingSteps.push(OnboardingStep.EXPERIENCE);
|
||||
mOnboardingSteps.push(OnboardingStep.DREAM_AND_PLAN);
|
||||
}
|
||||
|
||||
boolean hasSpecificStep = args.containsKey(ARG_SPECIFIC_STEP);
|
||||
if (hasSpecificStep)
|
||||
mOnboardinStep =
|
||||
OnboardingStep.values()[args.getInt(ARG_SPECIFIC_STEP)];
|
||||
|
||||
if (hasManySteps && hasSpecificStep)
|
||||
{
|
||||
OnboardingStep step = null;
|
||||
while (!mOnboardinStep.equals(step))
|
||||
{
|
||||
step = mOnboardingSteps.pop();
|
||||
}
|
||||
mOnboardinStep = step;
|
||||
return;
|
||||
}
|
||||
|
||||
if (hasManySteps)
|
||||
mOnboardinStep = mOnboardingSteps.pop();
|
||||
}
|
||||
}
|
||||
|
||||
private void initUserAgreementViews()
|
||||
{
|
||||
mTermOfUseCheckbox = mContentView.findViewById(R.id.term_of_use_welcome_checkbox);
|
||||
mTermOfUseCheckbox.setChecked(
|
||||
SharedPropertiesUtils.isTermOfUseAgreementConfirmed(requireContext()));
|
||||
|
||||
mPrivacyPolicyCheckbox = mContentView.findViewById(R.id.privacy_policy_welcome_checkbox);
|
||||
mPrivacyPolicyCheckbox.setChecked(
|
||||
SharedPropertiesUtils.isPrivacyPolicyAgreementConfirmed(requireContext()));
|
||||
|
||||
mTermOfUseCheckbox.setOnCheckedChangeListener(
|
||||
(buttonView, isChecked) -> onTermsOfUseViewChanged(isChecked));
|
||||
mPrivacyPolicyCheckbox.setOnCheckedChangeListener(
|
||||
(buttonView, isChecked) -> onPrivacyPolicyViewChanged(isChecked));
|
||||
|
||||
UiUtils.linkifyView(mContentView, R.id.privacy_policy_welcome,
|
||||
R.string.sign_agree_pp_gdpr, Framework.nativeGetPrivacyPolicyLink());
|
||||
|
||||
UiUtils.linkifyView(mContentView, R.id.term_of_use_welcome,
|
||||
R.string.sign_agree_tof_gdpr, Framework.nativeGetTermsOfUseLink());
|
||||
}
|
||||
|
||||
private void onPrivacyPolicyViewChanged(boolean isChecked)
|
||||
{
|
||||
SharedPropertiesUtils.putPrivacyPolicyAgreement(requireContext(), isChecked);
|
||||
onCheckedValueChanged(isChecked, mTermOfUseCheckbox.isChecked());
|
||||
}
|
||||
|
||||
private void onTermsOfUseViewChanged(boolean isChecked)
|
||||
{
|
||||
SharedPropertiesUtils.putTermOfUseAgreement(requireContext(), isChecked);
|
||||
onCheckedValueChanged(isChecked, mPrivacyPolicyCheckbox.isChecked());
|
||||
}
|
||||
|
||||
private void onCheckedValueChanged(boolean isChecked,
|
||||
boolean isAnotherConditionChecked)
|
||||
|
||||
{
|
||||
boolean isAgreementGranted = isChecked && isAnotherConditionChecked;
|
||||
if (!isAgreementGranted)
|
||||
return;
|
||||
|
||||
if (mPolicyAgreementListener != null)
|
||||
mPolicyAgreementListener.onPolicyAgreementApplied();
|
||||
dismissAllowingStateLoss();
|
||||
}
|
||||
|
||||
private void bindWelcomeScreenType()
|
||||
{
|
||||
boolean hasBindingType = mOnboardinStep != null;
|
||||
UiUtils.showIf(hasBindingType, mContentView, R.id.button_container);
|
||||
|
||||
boolean hasDeclineBtn = hasBindingType
|
||||
&& mOnboardinStep.hasDeclinedButton();
|
||||
TextView declineBtn = mContentView.findViewById(R.id.decline_btn);
|
||||
UiUtils.showIf(hasDeclineBtn, declineBtn);
|
||||
|
||||
View userAgreementBlock = mContentView.findViewById(R.id.user_agreement_block);
|
||||
UiUtils.hideIf(hasBindingType, userAgreementBlock);
|
||||
|
||||
if (hasDeclineBtn)
|
||||
declineBtn.setText(mOnboardinStep.getDeclinedButtonResId());
|
||||
|
||||
if (!hasBindingType)
|
||||
return;
|
||||
|
||||
mTitle.setText(mOnboardinStep.getTitle());
|
||||
// mImage.setImageResource(mOnboardinStep.getImage());
|
||||
mAcceptBtn.setText(mOnboardinStep.getAcceptButtonResId());
|
||||
declineBtn.setOnClickListener(v -> onDeclineBtnClicked());
|
||||
mSubtitle.setText(mOnboardinStep.getSubtitle());
|
||||
}
|
||||
|
||||
private void onDeclineBtnClicked()
|
||||
{
|
||||
Counters.setFirstStartDialogSeen(requireContext());
|
||||
dismissAllowingStateLoss();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if (v.getId() != R.id.accept_btn)
|
||||
return;
|
||||
|
||||
if (!mOnboardingSteps.isEmpty())
|
||||
{
|
||||
mOnboardinStep = mOnboardingSteps.pop();
|
||||
if (mOnboardingStepPassedListener != null)
|
||||
mOnboardingStepPassedListener.onOnboardingStepPassed(mOnboardinStep);
|
||||
bindWelcomeScreenType();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mOnboardinStep != null && mOnboardingStepPassedListener != null)
|
||||
mOnboardingStepPassedListener.onOnboardingStepPassed(mOnboardinStep);
|
||||
|
||||
Counters.setFirstStartDialogSeen(requireContext());
|
||||
dismissAllowingStateLoss();
|
||||
|
||||
if (mOnboardingStepPassedListener != null)
|
||||
mOnboardingStepPassedListener.onLastOnboardingStepPassed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel(DialogInterface dialog)
|
||||
{
|
||||
super.onCancel(dialog);
|
||||
if (!isAgreementDeclined(requireContext()))
|
||||
Counters.setFirstStartDialogSeen(requireContext());
|
||||
if (mOnboardingStepPassedListener != null)
|
||||
mOnboardingStepPassedListener.onOnboardingStepCancelled();
|
||||
}
|
||||
|
||||
public static boolean isAgreementDeclined(@NonNull Context context)
|
||||
{
|
||||
return !SharedPropertiesUtils.isTermOfUseAgreementConfirmed(context)
|
||||
|| !SharedPropertiesUtils.isPrivacyPolicyAgreementConfirmed(context);
|
||||
|
||||
}
|
||||
|
||||
public interface PolicyAgreementListener
|
||||
{
|
||||
void onPolicyAgreementApplied();
|
||||
}
|
||||
|
||||
public interface OnboardingStepPassedListener
|
||||
{
|
||||
void onOnboardingStepPassed(@NonNull OnboardingStep step);
|
||||
void onLastOnboardingStepPassed();
|
||||
void onOnboardingStepCancelled();
|
||||
}
|
||||
}
|
|
@ -81,8 +81,6 @@ public class NavigationController implements Application.ActivityLifecycleCallba
|
|||
private final SearchWheel mSearchWheel;
|
||||
@NonNull
|
||||
private final View mSpeedViewContainer;
|
||||
@NonNull
|
||||
private final View mOnboardingBtn;
|
||||
|
||||
private boolean mShowTimeLeft = true;
|
||||
|
||||
|
@ -155,7 +153,6 @@ public class NavigationController implements Application.ActivityLifecycleCallba
|
|||
|
||||
mSearchButtonFrame = activity.findViewById(R.id.search_button_frame);
|
||||
mSearchWheel = new SearchWheel(mSearchButtonFrame);
|
||||
mOnboardingBtn = activity.findViewById(R.id.onboarding_btn);
|
||||
|
||||
ImageView bookmarkButton = mSearchButtonFrame.findViewById(R.id.btn_bookmarks);
|
||||
bookmarkButton.setImageDrawable(Graphics.tint(bookmarkButton.getContext(),
|
||||
|
@ -383,8 +380,7 @@ public class NavigationController implements Application.ActivityLifecycleCallba
|
|||
|
||||
public void updateSearchButtonsTranslation(float translation)
|
||||
{
|
||||
int offset = UiUtils.isVisible(mOnboardingBtn) ? mOnboardingBtn.getHeight() : 0;
|
||||
mSearchButtonFrame.setTranslationY(translation + offset);
|
||||
mSearchButtonFrame.setTranslationY(translation);
|
||||
}
|
||||
|
||||
public void fadeInSearchButtons()
|
||||
|
|
Loading…
Add table
Reference in a new issue