package org.wordpress.android.ui.plans; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.app.Fragment; import android.app.FragmentManager; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.IdRes; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; import org.wordpress.android.R; import org.wordpress.android.util.AniUtils; import org.wordpress.android.widgets.WPViewPager; import java.util.ArrayList; import java.util.List; /** * post-purchase "on-boarding" for future use after user purchases premium or business plan */ public class PlanPostPurchaseActivity extends AppCompatActivity { static final int PAGE_NUMBER_INTRO = 0; static final int PAGE_NUMBER_CUSTOMIZE = 1; static final int PAGE_NUMBER_VIDEO = 2; static final int PAGE_NUMBER_THEMES = 3; // business only private static final String ARG_IS_BUSINESS_PLAN = "is_business_plan"; private ViewPager mViewPager; private PageAdapter mPageAdapter; private TextView mTxtSkip; private TextView mTxtNext; private ViewGroup mIndicatorContainerView; private int mPrevPageNumber = 0; private boolean mIsBusinessPlan; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.plan_post_purchase_activity); if (savedInstanceState != null) { mIsBusinessPlan = savedInstanceState.getBoolean(ARG_IS_BUSINESS_PLAN, false); } else { mIsBusinessPlan = getIntent().getBooleanExtra(ARG_IS_BUSINESS_PLAN, false); } mTxtSkip = (TextView) findViewById(R.id.text_skip); mTxtNext = (TextView) findViewById(R.id.text_next); mIndicatorContainerView = (ViewGroup) findViewById(R.id.layout_indicator_container); mViewPager = (WPViewPager) findViewById(R.id.viewpager); mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { if (position != mPrevPageNumber) { updateIndicator(position); updateIndicator(mPrevPageNumber); } updateButtons(); mPrevPageNumber = position; } }); mViewPager.setAdapter(getPageAdapter()); mTxtSkip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); mTxtNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { gotoNextPage(); } }); int numPages = getNumPages(); for (int i = 0; i < numPages; i++) { getIndicator(i).setOnClickListener(mIndicatorClickListener); } getIndicator(PAGE_NUMBER_THEMES).setVisibility(numPages > 3 ? View.VISIBLE : View.GONE); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(ARG_IS_BUSINESS_PLAN, mIsBusinessPlan); } /* * last pages is themes, which should only appear when user has purchased business plan */ private int getNumPages() { return mIsBusinessPlan ? 4 : 3; } private PageAdapter getPageAdapter() { if (mPageAdapter == null) { List<Fragment> fragments = new ArrayList<>(); for (int i = 0; i < getNumPages(); i++) { fragments.add(PlanPostPurchaseFragment.newInstance(i)); } FragmentManager fm = getFragmentManager(); mPageAdapter = new PageAdapter(fm, fragments); } return mPageAdapter; } private int getCurrentPage() { return mViewPager.getCurrentItem(); } private boolean isLastPage() { return getCurrentPage() == getNumPages() - 1; } private void gotoNextPage() { if (isLastPage()) { finish(); } else { gotoPage(getCurrentPage() + 1); } } private void gotoPage(int pageNumber) { mViewPager.setCurrentItem(pageNumber, true); } private void updateButtons() { if (isLastPage()) { mTxtNext.setText(R.string.button_done); if (mTxtSkip.getVisibility() == View.VISIBLE) { AniUtils.fadeOut(mTxtSkip, AniUtils.Duration.MEDIUM); } } else { mTxtNext.setText(R.string.button_next); if (mTxtSkip.getVisibility() != View.VISIBLE) { AniUtils.fadeIn(mTxtSkip, AniUtils.Duration.MEDIUM); } } } private ImageView getIndicator(int pageNumber) { @IdRes int resId; switch (pageNumber) { case 0: resId = R.id.image_indicator_1; break; case 1: resId = R.id.image_indicator_2; break; case 2: resId = R.id.image_indicator_3; break; case 3: resId = R.id.image_indicator_4; break; default: throw new IllegalArgumentException("Invalid indicator page number"); } return (ImageView) mIndicatorContainerView.findViewById(resId); } private void updateIndicator(int pageNumber) { boolean isSelected = (pageNumber == getCurrentPage()); final ImageView indicator = getIndicator(pageNumber); final @DrawableRes int backgroundRes = isSelected ? R.drawable.indicator_circle_selected : R.drawable.indicator_circle_unselected; if (isSelected) { // scale it out, change the background, then scale it back in PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 0.25f); PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 0.25f); ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(indicator, scaleX, scaleY); anim.setDuration(150); anim.setInterpolator(new AccelerateInterpolator()); anim.setRepeatCount(1); anim.setRepeatMode(ValueAnimator.REVERSE); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationRepeat(Animator animation) { indicator.setBackgroundResource(backgroundRes); } }); anim.start(); } else { indicator.setBackgroundResource(backgroundRes); } } private final View.OnClickListener mIndicatorClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.image_indicator_1) { gotoPage(0); } else if (id == R.id.image_indicator_2) { gotoPage(1); } else if (id == R.id.image_indicator_3) { gotoPage(2); } else if (id == R.id.image_indicator_4) { gotoPage(3); } } }; private class PageAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragments; PageAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); mFragments = fragments; } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getCount() { return mFragments.size(); } } }