Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,14 @@ getBackButtonTranslationWrapper()
- ```getSkipButtonTranslationWrapper()```

## Custom slides
#### Of course you are able to implement completely custom slides. You only need to extend SlideFragment and override following functions:
#### Of course you are able to implement completely custom slides. You only need to extend SlideFragmentBase and override all needed by you functions.
- ```backgroundColor()```
- ```buttonsColor()```
- ```canMoveFurther()``` (only if you want to stop user from being able to move further before he will do some action)
- ```cantMoveFurtherErrorMessage()``` (as above)

- ```neededPermissions()```
- ```possiblePermissions()```

#### If you want to use parallax in a fragment please use one of the below views:
- [```ParallaxFrameLayout```][ParallaxFrame]
- [```ParallaxLinearLayout```][ParallaxLinear]
Expand Down
18 changes: 5 additions & 13 deletions app/src/main/java/agency/tango/materialintro/CustomSlide.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,21 @@
import android.view.ViewGroup;
import android.widget.CheckBox;

import agency.tango.materialintroscreen.SlideFragment;
import agency.tango.materialintroscreen.fragments.SlideFragmentBase;

public class CustomSlide extends SlideFragmentBase {

public class CustomSlide extends SlideFragment {
private CheckBox checkBox;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_custom_slide, container, false);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
return view;
}

@Override
public int backgroundColor() {
return R.color.custom_slide_background;
}

@Override
public int buttonsColor() {
return R.color.custom_slide_buttons;
}

@Override
public boolean canMoveFurther() {
return checkBox.isChecked();
Expand Down
16 changes: 11 additions & 5 deletions app/src/main/java/agency/tango/materialintro/IntroActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,23 @@
import android.widget.Toast;

import agency.tango.materialintroscreen.MaterialIntroActivity;
import agency.tango.materialintroscreen.MessageButtonBehaviour;
import agency.tango.materialintroscreen.SlideFragmentBuilder;
import agency.tango.materialintroscreen.behaviours.MessageButtonBehaviour;
import agency.tango.materialintroscreen.animations.IViewTranslation;
import agency.tango.materialintroscreen.fragments.SlideFragmentBuilder;

public class IntroActivity extends MaterialIntroActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
enableLastSlideAlphaExitTransition(true);
setSkipButtonVisible();

getBackButtonTranslationWrapper()
.setEnterTranslation(new IViewTranslation() {
@Override
public void translate(View view, @FloatRange(from = 0, to = 1.0) float percentage) {
public void translate(View view,
@FloatRange(from = 0, to = 1.0) float percentage) {
view.setAlpha(percentage);
}
});
Expand Down Expand Up @@ -52,8 +55,11 @@ public void onClick(View v) {
addSlide(new SlideFragmentBuilder()
.backgroundColor(R.color.third_slide_background)
.buttonsColor(R.color.third_slide_buttons)
.possiblePermissions(new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.READ_SMS})
.neededPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION})
.possiblePermissions(
new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.READ_SMS})
.neededPermissions(new String[]{Manifest.permission.CAMERA,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION})
.image(R.drawable.img_equipment)
.title("We provide best tools")
.description("ever")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,22 @@
import agency.tango.materialintroscreen.animations.wrappers.PageIndicatorTranslationWrapper;
import agency.tango.materialintroscreen.animations.wrappers.SkipButtonTranslationWrapper;
import agency.tango.materialintroscreen.animations.wrappers.ViewPagerTranslationWrapper;
import agency.tango.materialintroscreen.behaviours.MessageButtonBehaviour;
import agency.tango.materialintroscreen.fragments.SlideFragmentBase;
import agency.tango.materialintroscreen.listeners.IFinishListener;
import agency.tango.materialintroscreen.listeners.IPageScrolledListener;
import agency.tango.materialintroscreen.listeners.IPageSelectedListener;
import agency.tango.materialintroscreen.listeners.MessageButtonBehaviourOnPageSelected;
import agency.tango.materialintroscreen.listeners.ViewBehavioursOnPageChangeListener;
import agency.tango.materialintroscreen.listeners.clickListeners.PermissionNotGrantedClickListener;
import agency.tango.materialintroscreen.listeners.scrollListeners.ParallaxScrollListener;
import agency.tango.materialintroscreen.listeners.click.PermissionNotGrantedClickListener;
import agency.tango.materialintroscreen.listeners.scroll.ParallaxScrollListener;
import agency.tango.materialintroscreen.widgets.InkPageIndicator;
import agency.tango.materialintroscreen.widgets.OverScrollViewPager;
import agency.tango.materialintroscreen.widgets.SwipeableViewPager;

import static android.view.View.GONE;

@SuppressWarnings("unused")
public abstract class MaterialIntroActivity extends AppCompatActivity {

private SwipeableViewPager viewPager;
private InkPageIndicator pageIndicator;
private SlidesAdapter adapter;
Expand Down Expand Up @@ -78,7 +79,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

setContentView(R.layout.mis_activity_material_intro);
Expand All @@ -102,7 +104,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
nextButtonTranslationWrapper = new NextButtonTranslationWrapper(nextButton);
initOnPageChangeListeners();

permissionNotGrantedClickListener = new PermissionNotGrantedClickListener(this, nextButtonTranslationWrapper);
permissionNotGrantedClickListener = new PermissionNotGrantedClickListener(this,
nextButtonTranslationWrapper);
finishScreenClickListener = new FinishScreenClickListener();

setBackButtonVisible();
Expand All @@ -122,8 +125,9 @@ public void run() {
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
SlideFragment fragment = adapter.getItem(viewPager.getCurrentItem());
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
SlideFragmentBase fragment = adapter.getItem(viewPager.getCurrentItem());
boolean hasPermissionToGrant = fragment.hasNeededPermissionsToGrant();
if (!hasPermissionToGrant) {
viewPager.setSwipingRightAllowed(true);
Expand Down Expand Up @@ -173,36 +177,38 @@ public void showPermissionsNotGrantedError() {
}

/**
* Add SlideFragment to IntroScreen
* Add SlideFragmentBase to IntroScreen
*
* @param slideFragment Fragment to add
* @param slideFragmentBase Fragment to add
*/
public void addSlide(SlideFragment slideFragment) {
adapter.addItem(slideFragment);
public void addSlide(SlideFragmentBase slideFragmentBase) {
adapter.addItem(slideFragmentBase);
}

/**
* Add SlideFragment to IntroScreen
*
* @param slideFragment Fragment to add
* @param slideFragmentBase Fragment to add
* @param messageButtonBehaviour Add behaviour for message button
*/
public void addSlide(SlideFragment slideFragment, MessageButtonBehaviour messageButtonBehaviour) {
adapter.addItem(slideFragment);
public void addSlide(SlideFragmentBase slideFragmentBase,
MessageButtonBehaviour messageButtonBehaviour) {
adapter.addItem(slideFragmentBase);
messageButtonBehaviours.put(adapter.getLastItemPosition(), messageButtonBehaviour);
}

/**
* Set skip button instead of back button
*/
public void setSkipButtonVisible() {
backButton.setVisibility(GONE);
backButton.setVisibility(View.GONE);

skipButton.setVisibility(View.VISIBLE);
skipButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int position = viewPager.getCurrentItem(); position < adapter.getCount(); position++) {
for (int position = viewPager.getCurrentItem(); position < adapter.getCount();
position++) {
if (!adapter.getItem(position).canMoveFurther()) {
viewPager.setCurrentItem(position, true);
showError(adapter.getItem(position).cantMoveFurtherErrorMessage());
Expand All @@ -218,7 +224,7 @@ public void onClick(View v) {
* Set back button visible
*/
public void setBackButtonVisible() {
skipButton.setVisibility(GONE);
skipButton.setVisibility(View.GONE);

backButton.setVisibility(View.VISIBLE);
backButton.setOnClickListener(new View.OnClickListener() {
Expand Down Expand Up @@ -303,14 +309,14 @@ public void showMessage(String message) {
/**
* Override in order to perform some action after passing last slide
*/
public void onLastSlidePassed()
{
public void onLastSlidePassed() {
// This method is intentionally empty, because we didn't want to make this method
// abstract as it would force user to implement this, even if he wouldn't like to.
}

private void initOnPageChangeListeners() {
messageButtonBehaviourOnPageSelected = new MessageButtonBehaviourOnPageSelected(messageButton, adapter, messageButtonBehaviours);
messageButtonBehaviourOnPageSelected = new MessageButtonBehaviourOnPageSelected(
messageButton, adapter, messageButtonBehaviours);

backButtonTranslationWrapper = new BackButtonTranslationWrapper(backButton);
pageIndicatorTranslationWrapper = new PageIndicatorTranslationWrapper(pageIndicator);
Expand All @@ -337,7 +343,8 @@ public void pageScrolled(final int position, float offset) {
viewPager.post(new Runnable() {
@Override
public void run() {
if (adapter.getItem(position).hasNeededPermissionsToGrant() || !adapter.getItem(position).canMoveFurther()) {
if (adapter.getItem(position).hasNeededPermissionsToGrant()
|| !adapter.getItem(position).canMoveFurther()) {
viewPager.setCurrentItem(position, true);
pageIndicator.clearJoiningFractions();
}
Expand All @@ -362,7 +369,7 @@ public void pageSelected(int position) {
}

@SuppressWarnings("PointlessBooleanExpression")
private void nextButtonBehaviour(final int position, final SlideFragment fragment) {
private void nextButtonBehaviour(final int position, final SlideFragmentBase fragment) {
boolean hasPermissionToGrant = fragment.hasNeededPermissionsToGrant();
if (hasPermissionToGrant) {
nextButton.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.mis_ic_next));
Expand All @@ -375,10 +382,10 @@ private void nextButtonBehaviour(final int position, final SlideFragment fragmen
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragment.canMoveFurther() == false) {
errorOccurred(fragment);
} else {
if (fragment.canMoveFurther()) {
viewPager.moveToNextPage();
} else {
errorOccurred(fragment);
}
}
});
Expand All @@ -398,27 +405,30 @@ private void moveBack() {
}
}

private void errorOccurred(SlideFragment slideFragment) {
private void errorOccurred(SlideFragmentBase slideFragmentBase) {
nextButtonTranslationWrapper.error();
showError(slideFragment.cantMoveFurtherErrorMessage());
showError(slideFragmentBase.cantMoveFurtherErrorMessage());
}

private void showError(String error) {
Snackbar.make(coordinatorLayout, error, Snackbar.LENGTH_SHORT).setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
navigationView.setTranslationY(0f);
super.onDismissed(snackbar, event);
}
}).show();
Snackbar.make(coordinatorLayout, error, Snackbar.LENGTH_SHORT)
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
navigationView.setTranslationY(0f);
super.onDismissed(snackbar, event);
}
}).show();
}

private int getBackgroundEvaluatedColor(int position, float positionOffset) {
return (int) argbEvaluator.evaluate(positionOffset, getBackgroundColor(position), getBackgroundColor(position + 1));
return (int) argbEvaluator.evaluate(positionOffset, getBackgroundColor(position),
getBackgroundColor(position + 1));
}

private int getButtonsEvaluatedColor(int position, float positionOffset) {
return (int) argbEvaluator.evaluate(positionOffset, getButtonsColor(position), getButtonsColor(position + 1));
return (int) argbEvaluator
.evaluate(positionOffset, getButtonsColor(position), getButtonsColor(position + 1));
}

@ColorInt
Expand All @@ -435,6 +445,7 @@ private int getBackgroundColor(int position) {
}

private class ColorTransitionScrollListener implements IPageScrolledListener {

@Override
public void pageScrolled(int position, float offset) {
if (position < adapter.getCount() - 1) {
Expand Down Expand Up @@ -474,9 +485,10 @@ private void tintButtons(ColorStateList color) {
}

private class FinishScreenClickListener implements View.OnClickListener {

@Override
public void onClick(View v) {
SlideFragment slideFragment = adapter.getItem(adapter.getLastItemPosition());
SlideFragmentBase slideFragment = adapter.getItem(adapter.getLastItemPosition());
if (!slideFragment.canMoveFurther()) {
errorOccurred(slideFragment);
} else {
Expand Down
Loading