com.alexandrepiveteau.library.tutorial.TutorialActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.alexandrepiveteau.library.tutorial.TutorialActivity.java

Source

/*
 * Copyright 2015 Alexandre Piveteau
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alexandrepiveteau.library.tutorial;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.PendingIntent;
import android.graphics.Color;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.RelativeLayout;

import com.alexandrepiveteau.library.tutorial.widgets.DefaultPageIndicatorEngine;
import com.alexandrepiveteau.library.tutorial.widgets.PageIndicator;

import java.util.ArrayList;
import java.util.List;

import pasta.music.R;

public abstract class TutorialActivity extends AppCompatActivity
        implements View.OnClickListener, View.OnLongClickListener, ViewPager.OnPageChangeListener {

    @Deprecated
    public String getDoneText() {
        return null;
    };

    public abstract String getIgnoreText();

    @Deprecated
    public String getNextText() {
        return null;
    };

    @Deprecated
    public String getPreviousText() {
        return null;
    };

    public PageIndicator.Engine getPageIndicatorEngine() {
        return new DefaultPageIndicatorEngine();
    };

    public abstract int getCount();

    public abstract int getBackgroundColor(int position);

    public abstract int getNavigationBarColor(int position);

    public abstract int getStatusBarColor(int position);

    public abstract Fragment getTutorialFragmentFor(int position);

    public abstract boolean isNavigationBarColored();

    public abstract boolean isStatusBarColored();

    public abstract ViewPager.PageTransformer getPageTransformer();

    //Views used
    private Button mButtonLeft;
    private ImageButton mImageButtonLeft;
    private ImageButton mImageButtonRight;
    private PageIndicator mPageIndicator;
    private RelativeLayout mRelativeLayout;
    private ViewPager mViewPager;

    //Objects needed
    private TutorialViewPagerAdapter mAdapter;
    private ColorMixer mColorMixerBackground;
    private ColorMixer mColorMixerNavigationBar;
    private ColorMixer mColorMixerStatusBas;

    private int mPreviousPage; //Needed if we want to animate the custom actions

    private List<Fragment> mFragmentList;

    private void setupFragmentList() {
        List<Fragment> fragments = new ArrayList<Fragment>();
        for (int i = 0; i < getCount(); i++) {
            fragments.add(getTutorialFragmentFor(i));
        }
        mFragmentList = fragments;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tutorial_button_left || v.getId() == R.id.tutorial_button_image_left) {
            boolean hasCustomAction = false;

            if (mFragmentList.get(mViewPager.getCurrentItem()) instanceof CustomAction) {
                if (((CustomAction) mFragmentList.get(mViewPager.getCurrentItem())).isEnabled()) {
                    hasCustomAction = true;
                }
            }
            if (hasCustomAction) {
                PendingIntent intent = ((CustomAction) mFragmentList.get(mViewPager.getCurrentItem()))
                        .getCustomActionPendingIntent();
                try {
                    intent.send();
                } catch (PendingIntent.CanceledException exception) {
                    exception.printStackTrace();
                }
            } else if (mViewPager.getCurrentItem() == 0) {
                finish();
            } else {
                mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1, true);
            }
        } else if (v.getId() == R.id.tutorial_button_image_right) {
            if (mViewPager.getCurrentItem() == getCount() - 1) {
                finish();
            } else {
                mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tutorial);

        mButtonLeft = (Button) findViewById(R.id.tutorial_button_left);
        mImageButtonLeft = (ImageButton) findViewById(R.id.tutorial_button_image_left);
        mImageButtonRight = (ImageButton) findViewById(R.id.tutorial_button_image_right);
        mPageIndicator = (PageIndicator) findViewById(R.id.tutorial_page_indicator);
        mRelativeLayout = (RelativeLayout) findViewById(R.id.relative_layout);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        mButtonLeft.setOnClickListener(this);
        mImageButtonLeft.setOnClickListener(this);
        mImageButtonRight.setOnClickListener(this);
        mImageButtonLeft.setOnLongClickListener(this);
        mImageButtonRight.setOnLongClickListener(this);

        setupFragmentList();

        mAdapter = new TutorialViewPagerAdapter(getSupportFragmentManager());

        mAdapter.setFragments(mFragmentList);

        mRelativeLayout.setBackgroundColor(Color.BLUE);
        mViewPager.setAdapter(mAdapter);
        mViewPager.addOnPageChangeListener(this);
        mViewPager.setPageTransformer(false, getPageTransformer());

        mPageIndicator.setEngine(getPageIndicatorEngine());
        mPageIndicator.setViewPager(mViewPager);

        //We use this to actualize the Strings
        mPreviousPage = 0;
        onPageSelected(0);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        mColorMixerBackground = new ColorMixer();
        mColorMixerNavigationBar = new ColorMixer();
        mColorMixerStatusBas = new ColorMixer();

        mColorMixerBackground.setFirstColor(getBackgroundColor(position));
        try {
            mColorMixerBackground.setSecondColor(getBackgroundColor(position + 1));
        } catch (Exception e) {
            mColorMixerBackground.setSecondColor(getBackgroundColor(position));
        }

        mColorMixerNavigationBar.setFirstColor(getNavigationBarColor(position));
        try {
            mColorMixerNavigationBar.setSecondColor(getNavigationBarColor(position + 1));
        } catch (Exception e) {
            mColorMixerNavigationBar.setFirstColor(getNavigationBarColor(position));
        }

        mColorMixerStatusBas.setFirstColor(getStatusBarColor(position));
        try {
            mColorMixerStatusBas.setSecondColor(getStatusBarColor(position + 1));
        } catch (Exception e) {
            mColorMixerStatusBas.setFirstColor(getStatusBarColor(position));
        }

        setBackgroundColor(mColorMixerBackground.getMixedColor(positionOffset));
        setSystemBarsColors(mColorMixerNavigationBar.getMixedColor(positionOffset),
                mColorMixerStatusBas.getMixedColor(positionOffset));
    }

    @Override
    public void onPageSelected(int position) {

        if (mViewPager.getCurrentItem() == 0) {
            mButtonLeft.setText(getIgnoreText());

            animateViewFadeIn(mButtonLeft);
            animateViewScaleOut(mImageButtonLeft);
        } else if (mViewPager.getCurrentItem() == getCount() - 1) {
            animateViewFadeOut(mButtonLeft);
            animateViewScaleIn(mImageButtonLeft);
        } else {
            animateViewFadeOut(mButtonLeft);
            animateViewScaleIn(mImageButtonLeft);
        }

        if (mViewPager.getCurrentItem() == getCount() - 1 && mViewPager.getCurrentItem() != mPreviousPage) {
            mImageButtonRight.setImageResource(R.drawable.animated_next_to_ok);
            AnimationDrawable animationDrawable = (AnimationDrawable) mImageButtonRight.getDrawable();
            animationDrawable.start();
        } else if (mViewPager.getCurrentItem() != mPreviousPage && mPreviousPage == getCount() - 1) {
            mImageButtonRight.setImageResource(R.drawable.animated_ok_to_next);
            AnimationDrawable animationDrawable = (AnimationDrawable) mImageButtonRight.getDrawable();
            animationDrawable.start();
        }

        handleCustomIcons(position);
    }

    private void animateViewScaleIn(final View view) {
        view.animate().scaleX(1).scaleY(1)
                .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        super.onAnimationStart(animation);
                        view.setVisibility(View.VISIBLE);
                    }
                }).start();
    }

    private void animateViewScaleOut(final View view) {
        view.animate().scaleX(0).scaleY(0)
                .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        view.setVisibility(View.GONE);
                    }
                }).start();
    }

    private void animateViewFadeIn(final View view) {
        view.animate().alpha(1f).setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        super.onAnimationStart(animation);
                        view.setVisibility(View.VISIBLE);
                    }
                }).start();
    }

    private void animateViewFadeOut(final View view) {
        view.animate().alpha(0f).setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        view.setVisibility(View.GONE);
                    }
                }).start();
    }

    /*private void handleCustomIcons2(final int position) {
    boolean hadPreviousCustomAction = false;
    boolean hasCustomAction = false;
        
    if(mFragmentList.get(mPreviousPage) instanceof CustomAction) {
        hadPreviousCustomAction = ((CustomAction)mFragmentList.get(mPreviousPage)).isEnabled();
    }
        
    if(mFragmentList.get(position) instanceof CustomAction) {
        hasCustomAction = ((CustomAction)mFragmentList.get(position)).isEnabled();
    }
        
    if(!hasCustomAction && hadPreviousCustomAction) {
        animateViewFadeOut(mButtonLeft);
        animateViewFadeOut(mImageButtonLeft);
        new Thread() {
            @Override
            public void run() {
                try {
                    sleep(android.R.integer.config_mediumAnimTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Toast.makeText(TutorialActivity.this, "0", Toast.LENGTH_SHORT).show();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mImageButtonLeft.setImageResource(R.drawable.static_previous);
                        Toast.makeText(TutorialActivity.this, "5", Toast.LENGTH_SHORT).show();
                        animateViewFadeIn(mImageButtonLeft);
                    }
                });
            }
        }.start();
    } else if (hasCustomAction && hadPreviousCustomAction && !CustomAction.Utils.areCustomActionsDrawingEqual((CustomAction)mFragmentList.get(mPreviousPage), (CustomAction)mFragmentList.get(position))) {
        animateViewFadeOut(mButtonLeft);
        animateViewFadeOut(mImageButtonLeft);
        new Thread() {
            @Override
            public void run() {
                try {
                    sleep(android.R.integer.config_mediumAnimTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Toast.makeText(TutorialActivity.this, "0", Toast.LENGTH_SHORT).show();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        CustomAction customAction = (CustomAction)mFragmentList.get(position);
                        if(customAction.hasCustomIcon()) {
                            mImageButtonLeft.setImageResource(customAction.getCustomActionIcon());
                            Toast.makeText(TutorialActivity.this, "3", Toast.LENGTH_SHORT).show();
                            animateViewFadeIn(mImageButtonLeft);
                        } else {
                            mButtonLeft.setText(customAction.getCustomActionTitle());
                            Toast.makeText(TutorialActivity.this, "4", Toast.LENGTH_SHORT).show();
                            animateViewFadeIn(mButtonLeft);
                        }
                    }
                });
            }
        }.start();
    } else if (hasCustomAction && !hadPreviousCustomAction) {
        animateViewFadeOut(mButtonLeft);
        animateViewFadeOut(mImageButtonLeft);
        new Thread() {
            @Override
            public void run() {
                try {
                    sleep(android.R.integer.config_mediumAnimTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Toast.makeText(TutorialActivity.this, "0", Toast.LENGTH_SHORT).show();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        CustomAction customAction = (CustomAction) mFragmentList.get(position);
                        if (customAction.hasCustomIcon()) {
                            mImageButtonLeft.setImageResource(customAction.getCustomActionIcon());
                            Toast.makeText(TutorialActivity.this, "x", Toast.LENGTH_SHORT).show();
                            animateViewFadeIn(mImageButtonLeft);
                        } else {
                            mButtonLeft.setText(customAction.getCustomActionTitle());
                            Toast.makeText(TutorialActivity.this, "1", Toast.LENGTH_SHORT).show();
                            animateViewFadeIn(mButtonLeft);
                        }
                    }
                });
            }
        }.start();
    } else if (!CustomAction.Utils.areCustomActionsDrawingEqual((CustomAction)mFragmentList.get(mPreviousPage), (CustomAction)mFragmentList.get(position))) {
        //just ignore
    } else {
            Toast.makeText(TutorialActivity.this, "2", Toast.LENGTH_SHORT).show();
            mImageButtonLeft.setImageResource(R.drawable.static_previous);
            animateViewFadeIn(mImageButtonLeft);
    }
        
    mPreviousPage = position;
    }*/

    private void handleCustomIcons(int position) {
        boolean hadPreviousPageCustomIcon = false;
        boolean hasCustomIcon = false;

        int previousPageIcon;
        final int currentPageIcon;

        if (mFragmentList.get(mPreviousPage) instanceof CustomAction) {
            hadPreviousPageCustomIcon = ((CustomAction) mFragmentList.get(mPreviousPage)).isEnabled();
        }

        if (hadPreviousPageCustomIcon) {
            previousPageIcon = ((CustomAction) mFragmentList.get(mPreviousPage)).getCustomActionIcon();
        } else {
            previousPageIcon = R.drawable.static_previous;
        }

        if (mFragmentList.get(position) instanceof CustomAction) {
            hasCustomIcon = ((CustomAction) mFragmentList.get(position)).isEnabled();
        }

        if (hasCustomIcon) {
            currentPageIcon = ((CustomAction) mFragmentList.get(position)).getCustomActionIcon();
        } else {
            currentPageIcon = R.drawable.static_previous;
        }

        if (currentPageIcon != previousPageIcon) {
            mImageButtonLeft.animate().alpha(0)
                    .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            super.onAnimationEnd(animation);
                            mImageButtonLeft.setImageResource(currentPageIcon);
                            mImageButtonLeft.animate().alpha(1f)
                                    .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                                    .setListener(null)//We clear all listeners
                                    .start();
                        }
                    }).start();
        }

        mPreviousPage = position;
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    private void setBackgroundColor(int backgroundColor) {
        mRelativeLayout.setBackgroundColor(backgroundColor);
    }

    private void setSystemBarsColors(int colorNavigationBar, int colorStatusBar) {
        // Tinted status bar and navigation bars are available only on Lollipop, sadly :(
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (isNavigationBarColored()) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                getWindow().setNavigationBarColor(colorNavigationBar);
            }
            if (isStatusBarColored()) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                getWindow().setStatusBarColor(colorStatusBar);
            }
        }
    }

    @Override
    public boolean onLongClick(View v) {
        if (v.getId() == R.id.tutorial_button_image_left) {
            //Toast.makeText(this, getPreviousText(), Toast.LENGTH_SHORT).show();
        } else if (v.getId() == R.id.tutorial_button_image_right) {
            //Toast.makeText(this, getNextText(), Toast.LENGTH_SHORT).show();
        }
        return false;
    }
}