[android]: Remove onboarding screens

Signed-off-by: Roman Tsisyk <roman@tsisyk.com>
This commit is contained in:
Roman Tsisyk 2021-03-27 17:33:17 +03:00
parent a68e23e0f7
commit 70443914c9
9 changed files with 19 additions and 754 deletions

View file

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

View file

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

View file

@ -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)
{

View file

@ -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()

View file

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

View file

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

View file

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

View file

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

View file

@ -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()