Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
janheinrichmerker committed Jun 6, 2016
1 parent 2b4de01 commit 4e57ea5
Show file tree
Hide file tree
Showing 9 changed files with 148 additions and 101 deletions.
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@
android:id="@+id/start_splash"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:gravity="center_vertical|start"
android:text="@string/label_start_splash"
android:theme="@style/AppThemeDark"
style="?borderlessButtonStyle"/>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<string name="label_option_get_started_enabled">\"Los geht\'s\"-Button aktivieren</string>
<string name="label_start_intro">Intro starten</string>
<string name="label_or">oder</string>
<string name="label_start_splash">Fake-Splashscreen starten</string>
<string name="label_start_splash">Fake-Splashscreen</string>

<string name="title_material_metaphor">Material ist die Metapher</string>
<string name="title_material_bold">Kräftig, graphisch, bewusst</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@
import android.support.v4.util.Pair;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextSwitcher;

import com.heinrichreimersoftware.materialintro.R;
import com.heinrichreimersoftware.materialintro.slide.ButtonCtaSlide;
Expand Down Expand Up @@ -85,14 +88,16 @@ public class IntroActivity extends AppCompatActivity {
private final ArgbEvaluator evaluator = new ArgbEvaluator();
private LinearLayout frame;
private FadeableViewPager pager;
private Button buttonCta;
private TextSwitcher buttonCta;
private InkPageIndicator pagerIndicator;
private ImageButton buttonNext;
private ImageButton buttonBack;
private SlideAdapter adapter;
private IntroPageChangeListener listener = new IntroPageChangeListener();
private boolean fullscreen = false;
private boolean buttonCtaVisible = false;
private ViewPropertyAnimatorCompat buttonCtaInAnimator = null;
private ViewPropertyAnimatorCompat buttonCtaOutAnimator = null;
@ButtonNextFunction
private int buttonNextFunction = BUTTON_NEXT_FUNCTION_NEXT_FINISH;
@ButtonBackFunction
Expand Down Expand Up @@ -184,12 +189,8 @@ public void onBackPressed() {
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
FragmentManager fragmentManager = getSupportFragmentManager();
for (Fragment fragment : fragmentManager.getFragments()) {
if (fragment != null) {
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
updateButtonCta();
}

private void setSystemUiFlags(int flags, boolean value){
Expand All @@ -214,11 +215,16 @@ private void setFullscreenFlags(boolean fullscreen){
private void findViews(){
frame = (LinearLayout) findViewById(R.id.mi_frame);
pager = (FadeableViewPager) findViewById(R.id.mi_pager);
buttonCta = (Button) findViewById(R.id.mi_button_cta);
pagerIndicator = (InkPageIndicator) findViewById(R.id.mi_pager_indicator);
buttonNext = (ImageButton) findViewById(R.id.mi_button_next);
buttonBack = (ImageButton) findViewById(R.id.mi_button_skip);

buttonCta = (TextSwitcher) findViewById(R.id.mi_button_cta);
if (buttonCta != null) {
buttonCta.setInAnimation(this, R.anim.fade_in);
buttonCta.setOutAnimation(this, R.anim.fade_out);
}

FragmentManager fragmentManager = getSupportFragmentManager();
adapter = new SlideAdapter(fragmentManager);

Expand Down Expand Up @@ -436,7 +442,8 @@ private void updateBackground() {
@ColorInt
int backgroundButtonCta = buttonCtaTintMode == BUTTON_CTA_TINT_MODE_TEXT ?
ContextCompat.getColor(this, android.R.color.white) : backgroundDarker;
ViewCompat.setBackgroundTintList(buttonCta, ColorStateList.valueOf(backgroundButtonCta));
ViewCompat.setBackgroundTintList(buttonCta.getChildAt(0), ColorStateList.valueOf(backgroundButtonCta));
ViewCompat.setBackgroundTintList(buttonCta.getChildAt(1), ColorStateList.valueOf(backgroundButtonCta));

int iconColor;
if (ColorUtils.calculateLuminance(backgroundDark) > 0.4) {
Expand All @@ -453,7 +460,8 @@ private void updateBackground() {
@ColorInt
int textColorButtonCta = buttonCtaTintMode == BUTTON_CTA_TINT_MODE_TEXT ?
backgroundDarker : iconColor;
buttonCta.setTextColor(textColorButtonCta);
((Button) buttonCta.getChildAt(0)).setTextColor(textColorButtonCta);
((Button) buttonCta.getChildAt(1)).setTextColor(textColorButtonCta);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(backgroundDark);
Expand Down Expand Up @@ -491,12 +499,10 @@ private void updateViewPositions() {

if (position + positionOffset < 1) {
//Between first and second item
float offset = position + positionOffset;

if (buttonBackFunction == BUTTON_BACK_FUNCTION_SKIP) {
buttonBack.setTranslationY(0);
} else {
buttonBack.setTranslationY((1 - offset) * 2 * buttonNext.getHeight());
buttonBack.setTranslationY((1 - positionOffset) * 2 * buttonNext.getHeight());
}
buttonCta.setTranslationY(0);
pagerIndicator.setTranslationY(0);
Expand All @@ -512,108 +518,128 @@ private void updateViewPositions() {
updateButtonNextDrawable();
} else if (position + positionOffset >= adapter.getCount() - 2 && position + positionOffset < adapter.getCount() - 1) {
//Between second last and last item
float offset = position + positionOffset - adapter.getCount() + 2;

if (buttonBackFunction == BUTTON_BACK_FUNCTION_SKIP) {
boolean rtl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && getResources().getConfiguration().getLayoutDirection() ==
View.LAYOUT_DIRECTION_RTL;
buttonBack.setTranslationX(offset * (rtl ? 1 : -1) * pager.getWidth());
buttonBack.setTranslationX(positionOffset * (rtl ? 1 : -1) * pager.getWidth());
} else {
buttonBack.setTranslationX(0);
}

if (buttonNextFunction == BUTTON_NEXT_FUNCTION_NEXT_FINISH) {
buttonNext.setTranslationY(0);
} else {
buttonNext.setTranslationY(offset * 2 * buttonNext.getHeight());
buttonNext.setTranslationY(positionOffset * 2 * buttonNext.getHeight());
}
buttonCta.setTranslationY(0);
pagerIndicator.setTranslationY(0);
updateButtonNextDrawable();
} else if (position + positionOffset >= adapter.getCount() - 1) {
//Fade
float offset = position + positionOffset - adapter.getCount() + 1;
float yOffset = getResources().getDimensionPixelSize(R.dimen.mi_y_offset);

float alpha = 1 - (positionOffset * 0.5f);
Log.i("alpha: ", "" + alpha);
frame.setAlpha(alpha);

if (buttonBackFunction == BUTTON_BACK_FUNCTION_SKIP) {
boolean rtl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && getResources().getConfiguration().getLayoutDirection() ==
View.LAYOUT_DIRECTION_RTL;
buttonBack.setTranslationX((rtl ? 1 : -1) * pager.getWidth());
} else {
buttonBack.setTranslationY(offset * yOffset);
buttonBack.setTranslationY(positionOffset * yOffset);
}

if (buttonNextFunction == BUTTON_NEXT_FUNCTION_NEXT_FINISH) {
buttonNext.setTranslationY(offset * yOffset);
buttonNext.setTranslationY(positionOffset * yOffset);
} else {
buttonNext.setTranslationY(-yOffset);
}
buttonCta.setTranslationY(offset * yOffset);
pagerIndicator.setTranslationY(offset * yOffset);
buttonCta.setTranslationY(positionOffset * yOffset);
pagerIndicator.setTranslationY(positionOffset * yOffset);
updateButtonNextDrawable();
}

updateButtonCta();
}

private void updateParallax() {
Fragment fragment = getSlide(position).getFragment();
Fragment fragmentNext = position < getCount() - 1 ?
getSlide(position + 1).getFragment() : null;
if (fragment instanceof Parallaxable) {
((Parallaxable) fragment).setOffset(positionOffset);
}
if (fragmentNext instanceof Parallaxable) {
((Parallaxable) fragmentNext).setOffset(-1 + positionOffset);
}
}

private void updateButtonCta() {
//Button CTA transition
if (position + positionOffset < adapter.getCount()) {
//Before fade
float offset = position + positionOffset - adapter.getCount() + 2;
Pair<String, ? extends View.OnClickListener> button = getButtonCta(position);
Log.i("button cta", "button for position " + position + ": " + (button == null ? null : button.first));
Pair<String, ? extends View.OnClickListener> buttonNext = getButtonCta(position + 1);
Log.i("button cta", "button for position " + (position + 1) + ": " + (buttonNext == null ? null : buttonNext.first));

if (button == null) {
if (buttonNext == null) {
//Hide button
buttonCta.setVisibility(View.GONE);
} else {
}
else {
buttonCta.setVisibility(View.VISIBLE);
//Fade in
if (!buttonCta.getText().equals(buttonNext.first))
if (!((Button) buttonCta.getCurrentView()).getText().equals(buttonNext.first))
buttonCta.setText(buttonNext.first);
buttonCta.setOnClickListener(buttonNext.second);
buttonCta.setAlpha(offset);
buttonCta.getChildAt(0).setOnClickListener(buttonNext.second);
buttonCta.getChildAt(1).setOnClickListener(buttonNext.second);
Log.i("button cta", "alpha1: " + (positionOffset));
buttonCta.setAlpha(positionOffset);
}
} else {
}
else {
if (buttonNext == null) {
buttonCta.setVisibility(View.VISIBLE);
//Fade out
if (!buttonCta.getText().equals(button.first))
if (!((Button) buttonCta.getCurrentView()).getText().equals(button.first))
buttonCta.setText(button.first);
buttonCta.setOnClickListener(button.second);
buttonCta.setAlpha(1 - offset);
} else {
buttonCta.getChildAt(0).setOnClickListener(button.second);
buttonCta.getChildAt(1).setOnClickListener(button.second);
Log.i("button cta", "alpha2: " + (1 - positionOffset));
buttonCta.setAlpha(1 - positionOffset);
}
else {
buttonCta.setVisibility(View.VISIBLE);
//Fade text
if (offset >= 0.5f) {
if (!buttonCta.getText().equals(buttonNext.first))
if (positionOffset >= 0.5f) {
if (!((Button) buttonCta.getCurrentView()).getText().equals(buttonNext.first))
buttonCta.setText(buttonNext.first);
buttonCta.setOnClickListener(buttonNext.second);
} else {
if (!buttonCta.getText().equals(button.first))
buttonCta.getChildAt(0).setOnClickListener(buttonNext.second);
buttonCta.getChildAt(1).setOnClickListener(buttonNext.second);
}
else {
if (!((Button) buttonCta.getCurrentView()).getText().equals(button.first))
buttonCta.setText(button.first);
buttonCta.setOnClickListener(button.second);
buttonCta.getChildAt(0).setOnClickListener(button.second);
buttonCta.getChildAt(1).setOnClickListener(button.second);
}
}
}
}
}

private void updateParallax() {
Fragment fragment = getSlide(position).getFragment();
Fragment fragmentNext = position < getCount() - 1 ?
getSlide(position + 1).getFragment() : null;
if (fragment instanceof Parallaxable) {
((Parallaxable) fragment).setOffset(positionOffset);
}
if (fragmentNext instanceof Parallaxable) {
((Parallaxable) fragmentNext).setOffset(-1 + positionOffset);
}
}

private void updateButtonNextDrawable() {
float offset = 0;
if (buttonNextFunction == BUTTON_NEXT_FUNCTION_NEXT_FINISH &&
position + positionOffset >= adapter.getCount() - 1) {
offset = 1;
}
else if (buttonNextFunction == BUTTON_NEXT_FUNCTION_NEXT_FINISH &&
position + positionOffset >= adapter.getCount() - 2) {
offset = Math.min(position + positionOffset - adapter.getCount() + 2, 1);
offset = positionOffset;
}

if (offset <= 0) {
Expand Down Expand Up @@ -874,8 +900,8 @@ public void lockSwipeIfNeeded() {
private class IntroPageChangeListener extends FadeableViewPager.SimpleOnOverscrollPageChangeListener {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
IntroActivity.this.position = position;
IntroActivity.this.positionOffset = positionOffset;
IntroActivity.this.position = (int) Math.floor(position + positionOffset);
IntroActivity.this.positionOffset = (((position + positionOffset) % 1) + 1) % 1;

//Lock while scrolling a slide near its edges to lock (uncommon) multiple page swipes
if (Math.abs(positionOffset) < 0.1f) {
Expand All @@ -885,7 +911,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
updateBackground();
updateViewPositions();
if (position != getCount())
updateParallax();
updateParallax();
updateFullscreen();

finishIfNeeded();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ private SimpleSlide(Builder builder) {
canGoBackward = builder.canGoBackward;
permissions = builder.permissions;
permissionsRequestCode = builder.permissionsRequestCode;
updatePermissions();
}

@Override
Expand Down Expand Up @@ -88,11 +89,13 @@ public boolean canGoBackward() {

@Override
public View.OnClickListener getButtonCtaClickListener() {
updatePermissions();
return buttonClickListener;
}

@Override
public String getButtonCtaLabel() {
updatePermissions();
return buttonLabel;
}

Expand All @@ -101,14 +104,10 @@ public int getButtonCtaLabelRes() {
return 0;
}

private void updatePermissions() {
updatePermissions(permissions);
}

private synchronized void updatePermissions(@Nullable String[] newPermissions) {
if (newPermissions != null) {
private synchronized void updatePermissions() {
if (permissions != null) {
final List<String> permissionsNotGranted = new ArrayList<>();
for (String permission : newPermissions) {
for (String permission : permissions) {
if (fragment.getContext() == null ||
ContextCompat.checkSelfPermission(fragment.getContext(), permission) !=
PackageManager.PERMISSION_GRANTED) {
Expand All @@ -119,18 +118,26 @@ private synchronized void updatePermissions(@Nullable String[] newPermissions) {
if (permissionsNotGranted.size() > 0) {
permissions = permissionsNotGranted.toArray(
new String[permissionsNotGranted.size()]);
if (fragment.getContext() != null)
if (fragment.getActivity() == null) {
if (permissions.length == 0) {
permissions = null;
buttonLabel = null;
buttonClickListener = null;
}
}
else {
buttonLabel = fragment.getContext().getResources().getQuantityText(
R.plurals.mi_label_grant_permission, permissionsNotGranted.size())
.toString();
buttonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragment.getActivity() != null)
ActivityCompat.requestPermissions(fragment.getActivity(), permissions,
permissionsRequestCode);
}
};
buttonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (fragment.getActivity() != null)
ActivityCompat.requestPermissions(fragment.getActivity(), permissions,
permissionsRequestCode);
}
};
}
} else {
permissions = null;
buttonLabel = null;
Expand Down Expand Up @@ -303,6 +310,7 @@ public static SimpleSlideFragment newInstance(CharSequence title, @StringRes int
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
updateNavigation();
}

@Override
Expand Down
Loading

0 comments on commit 4e57ea5

Please sign in to comment.