Java tutorial
/* * 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; } }