From 89442f91cea3ad8d3af5617dda70712bd75b5c27 Mon Sep 17 00:00:00 2001 From: leonardo Date: Sun, 18 Dec 2016 04:04:33 -0200 Subject: [PATCH 1/8] Initial commit --- build.gradle | 2 +- .../com/stepstone/stepper/StepperLayout.java | 13 +-- .../adapter/AbstractFragmentStepAdapter.java | 80 +++++++++++++++++++ .../stepper/adapter/AbstractStepAdapter.java | 67 ++-------------- .../stepper/adapter/StepAdapter.java | 19 +++++ .../stepper/type/AbstractStepperType.java | 4 +- .../stepper/type/DotsStepperType.java | 4 +- .../stepper/type/ProgressBarStepperType.java | 4 +- .../stepper/type/TabsStepperType.java | 6 +- sample/src/main/AndroidManifest.xml | 17 ++-- .../sample/AbstractStepperActivity.java | 8 +- .../DelayedTransitionStepperActivity.java | 8 +- .../DifferentNextButtonStepperActivity.java | 8 +- sample/src/main/res/values/strings.xml | 1 + 14 files changed, 142 insertions(+), 99 deletions(-) create mode 100644 material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractFragmentStepAdapter.java create mode 100644 material-stepper/src/main/java/com/stepstone/stepper/adapter/StepAdapter.java diff --git a/build.gradle b/build.gradle index df2f3c5..e5faed8 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' diff --git a/material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java b/material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java index a13783f..c1c19d2 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java @@ -40,7 +40,8 @@ import android.widget.Button; import android.widget.LinearLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter; +import com.stepstone.stepper.adapter.StepAdapter; import com.stepstone.stepper.internal.ColorableProgressBar; import com.stepstone.stepper.internal.DottedProgressBar; import com.stepstone.stepper.internal.RightNavigationButton; @@ -197,7 +198,7 @@ public final void goToPrevStep() { private int mTypeIdentifier = AbstractStepperType.PROGRESS_BAR; - private AbstractStepAdapter mStepAdapter; + private StepAdapter mStepAdapter; private AbstractStepperType mStepperType; @@ -249,9 +250,9 @@ public void setListener(@NonNull StepperListener listener) { * * @param stepAdapter step adapter */ - public void setAdapter(@NonNull AbstractStepAdapter stepAdapter) { + public void setAdapter(@NonNull StepAdapter stepAdapter) { this.mStepAdapter = stepAdapter; - mPager.setAdapter(stepAdapter); + mPager.setAdapter(stepAdapter.getAdapter()); mStepperType.onNewAdapter(stepAdapter); @@ -271,7 +272,7 @@ public void run() { * @param stepAdapter step adapter * @param currentStepPosition the initial step position, must be in the range of the adapter item count */ - public void setAdapter(@NonNull AbstractStepAdapter stepAdapter, @IntRange(from = 0) int currentStepPosition) { + public void setAdapter(@NonNull StepAdapter stepAdapter, @IntRange(from = 0) int currentStepPosition) { this.mCurrentStepPosition = currentStepPosition; setAdapter(stepAdapter); } @@ -538,7 +539,7 @@ private void onUpdate(int newStepPosition) { if (!isLast) { int nextButtonTextForStep = mStepAdapter.getNextButtonText(newStepPosition); - if (nextButtonTextForStep == AbstractStepAdapter.DEFAULT_NEXT_BUTTON_TEXT) { + if (nextButtonTextForStep == AbstractFragmentStepAdapter.DEFAULT_NEXT_BUTTON_TEXT) { mNextNavigationButton.setText(mNextButtonText); } else { mNextNavigationButton.setText(nextButtonTextForStep); diff --git a/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractFragmentStepAdapter.java b/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractFragmentStepAdapter.java new file mode 100644 index 0000000..b8faf92 --- /dev/null +++ b/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractFragmentStepAdapter.java @@ -0,0 +1,80 @@ +/* +Copyright 2016 StepStone Services + +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.stepstone.stepper.adapter; + +import android.support.annotation.StringRes; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; + +import com.stepstone.stepper.Step; + +/** + * A base adapter class which returns step fragments to use inside of the {@link com.stepstone.stepper.StepperLayout}. + */ +public abstract class AbstractFragmentStepAdapter extends FragmentPagerAdapter implements StepAdapter { + + public static final int DEFAULT_NEXT_BUTTON_TEXT = -1; + + private final FragmentManager mFragmentManager; + + public AbstractFragmentStepAdapter(FragmentManager fm) { + super(fm); + mFragmentManager = fm; + } + + @Override + public final T getItem(int position) { + return createStep(position); + } + + public abstract T createStep(int position); + + /** + * Finds the given step without creating it. + * @see FragmentPagerAdapter#makeFragmentName(int, long) + * @param viewPager view pager to use for displaying step fragments + * @param position step position + * @return step fragment + */ + public Step findStep(ViewPager viewPager, int position) { + String fragmentTag = "android:switcher:" + viewPager.getId() + ":" + this.getItemId(position); + return (Step) mFragmentManager.findFragmentByTag(fragmentTag); + } + + /** + * Allows to override the text on the Next button per step. + * For a given step position you need to return a String resource ID for the label to be used. + * If you wish to change the text for selected steps only (and leave the default for the rest) + * then return {@link #DEFAULT_NEXT_BUTTON_TEXT} for the default ones. + * By default this method returns {@link #DEFAULT_NEXT_BUTTON_TEXT} for all steps. + * This method is not invoked for the last step. + * @param position step position + * @return a String resource ID to override the default button text or {@link #DEFAULT_NEXT_BUTTON_TEXT} if the default text should be kept + */ + @StringRes + public int getNextButtonText(int position) { + return DEFAULT_NEXT_BUTTON_TEXT; + } + + @Override + public PagerAdapter getAdapter() { + return this; + } +} diff --git a/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractStepAdapter.java b/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractStepAdapter.java index 3f6540b..258beb2 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractStepAdapter.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractStepAdapter.java @@ -1,75 +1,24 @@ -/* -Copyright 2016 StepStone Services - -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.stepstone.stepper.adapter; -import android.support.annotation.StringRes; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; +import android.support.v4.view.PagerAdapter; import com.stepstone.stepper.Step; /** - * A base adapter class which returns step fragments to use inside of the {@link com.stepstone.stepper.StepperLayout}. + * Created by leonardo on 18/12/16. */ -public abstract class AbstractStepAdapter extends FragmentPagerAdapter { - - public static final int DEFAULT_NEXT_BUTTON_TEXT = -1; - private final FragmentManager mFragmentManager; +public abstract class AbstractStepAdapter extends PagerAdapter implements StepAdapter { - public AbstractStepAdapter(FragmentManager fm) { - super(fm); - mFragmentManager = fm; - } + private static final int DEFAULT_NEXT_BUTTON_TEXT = -1; @Override - public final T getItem(int position) { - return createStep(position); - } - - protected abstract T createStep(int position); - - /** - * Finds the given step without creating it. - * @see FragmentPagerAdapter#makeFragmentName(int, long) - * @param viewPager view pager to use for displaying step fragments - * @param position step position - * @return step fragment - */ - public Step findStep(ViewPager viewPager, int position) { - String fragmentTag = "android:switcher:" + viewPager.getId() + ":" + this.getItemId(position); - return (Step) mFragmentManager.findFragmentByTag(fragmentTag); - } - - /** - * Allows to override the text on the Next button per step. - * For a given step position you need to return a String resource ID for the label to be used. - * If you wish to change the text for selected steps only (and leave the default for the rest) - * then return {@link #DEFAULT_NEXT_BUTTON_TEXT} for the default ones. - * By default this method returns {@link #DEFAULT_NEXT_BUTTON_TEXT} for all steps. - * This method is not invoked for the last step. - * @param position step position - * @return a String resource ID to override the default button text or {@link #DEFAULT_NEXT_BUTTON_TEXT} if the default text should be kept - */ - @StringRes public int getNextButtonText(int position) { return DEFAULT_NEXT_BUTTON_TEXT; } + @Override + public PagerAdapter getAdapter() { + return this; + } } diff --git a/material-stepper/src/main/java/com/stepstone/stepper/adapter/StepAdapter.java b/material-stepper/src/main/java/com/stepstone/stepper/adapter/StepAdapter.java new file mode 100644 index 0000000..4ae2bba --- /dev/null +++ b/material-stepper/src/main/java/com/stepstone/stepper/adapter/StepAdapter.java @@ -0,0 +1,19 @@ +package com.stepstone.stepper.adapter; + +import android.support.annotation.StringRes; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; + +import com.stepstone.stepper.Step; + +/** + * Created by leonardo on 18/12/16. + */ + +public interface StepAdapter { + T createStep(int position); + Step findStep(ViewPager viewPager, int position); + @StringRes int getNextButtonText(int position); + int getCount(); + PagerAdapter getAdapter(); +} diff --git a/material-stepper/src/main/java/com/stepstone/stepper/type/AbstractStepperType.java b/material-stepper/src/main/java/com/stepstone/stepper/type/AbstractStepperType.java index 7736f52..f3264e6 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/type/AbstractStepperType.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/type/AbstractStepperType.java @@ -20,7 +20,7 @@ import android.support.annotation.NonNull; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.StepAdapter; /** * A base stepper type all stepper types must extend. @@ -58,7 +58,7 @@ public AbstractStepperType(StepperLayout stepperLayout) { * Called when {@link StepperLayout}'s adapter gets changed * @param stepAdapter new stepper adapter */ - public abstract void onNewAdapter(@NonNull AbstractStepAdapter stepAdapter); + public abstract void onNewAdapter(@NonNull StepAdapter stepAdapter); @ColorInt protected int getSelectedColor() { diff --git a/material-stepper/src/main/java/com/stepstone/stepper/type/DotsStepperType.java b/material-stepper/src/main/java/com/stepstone/stepper/type/DotsStepperType.java index 33ad2b0..3da3b6b 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/type/DotsStepperType.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/type/DotsStepperType.java @@ -21,7 +21,7 @@ import com.stepstone.stepper.R; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.StepAdapter; import com.stepstone.stepper.internal.DottedProgressBar; /** @@ -51,7 +51,7 @@ public void onStepSelected(int newStepPosition) { * {@inheritDoc} */ @Override - public void onNewAdapter(@NonNull AbstractStepAdapter stepAdapter) { + public void onNewAdapter(@NonNull StepAdapter stepAdapter) { final int stepCount = stepAdapter.getCount(); mDottedProgressBar.setDotCount(stepCount); mDottedProgressBar.setVisibility(stepCount > 1 ? View.VISIBLE : View.GONE); diff --git a/material-stepper/src/main/java/com/stepstone/stepper/type/ProgressBarStepperType.java b/material-stepper/src/main/java/com/stepstone/stepper/type/ProgressBarStepperType.java index b59057f..ccc1ade 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/type/ProgressBarStepperType.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/type/ProgressBarStepperType.java @@ -21,7 +21,7 @@ import com.stepstone.stepper.R; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.StepAdapter; import com.stepstone.stepper.internal.ColorableProgressBar; /** @@ -51,7 +51,7 @@ public void onStepSelected(int newStepPosition) { * {@inheritDoc} */ @Override - public void onNewAdapter(@NonNull AbstractStepAdapter stepAdapter) { + public void onNewAdapter(@NonNull StepAdapter stepAdapter) { final int stepCount = stepAdapter.getCount(); mProgressBar.setMax(stepAdapter.getCount()); mProgressBar.setVisibility(stepCount > 1 ? View.VISIBLE : View.GONE); diff --git a/material-stepper/src/main/java/com/stepstone/stepper/type/TabsStepperType.java b/material-stepper/src/main/java/com/stepstone/stepper/type/TabsStepperType.java index 6145cd8..0b59e13 100644 --- a/material-stepper/src/main/java/com/stepstone/stepper/type/TabsStepperType.java +++ b/material-stepper/src/main/java/com/stepstone/stepper/type/TabsStepperType.java @@ -22,7 +22,7 @@ import com.stepstone.stepper.R; import com.stepstone.stepper.Step; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.StepAdapter; import com.stepstone.stepper.internal.TabsContainer; import java.util.ArrayList; @@ -57,11 +57,11 @@ public void onStepSelected(int newStepPosition) { * {@inheritDoc} */ @Override - public void onNewAdapter(@NonNull AbstractStepAdapter stepAdapter) { + public void onNewAdapter(@NonNull StepAdapter stepAdapter) { List titles = new ArrayList<>(); final int stepCount = stepAdapter.getCount(); for (int i = 0; i < stepCount; i++) { - final Step step = stepAdapter.getItem(i); + final Step step = (Step) stepAdapter.createStep(i); titles.add(step.getName()); } mTabsContainer.setSteps(titles); diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 50df485..c4a197e 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -8,7 +8,6 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - @@ -16,27 +15,21 @@ - - - + - - - - - - - + - + \ No newline at end of file diff --git a/sample/src/main/java/com/stepstone/stepper/sample/AbstractStepperActivity.java b/sample/src/main/java/com/stepstone/stepper/sample/AbstractStepperActivity.java index 876f940..56769be 100644 --- a/sample/src/main/java/com/stepstone/stepper/sample/AbstractStepperActivity.java +++ b/sample/src/main/java/com/stepstone/stepper/sample/AbstractStepperActivity.java @@ -26,7 +26,7 @@ import com.stepstone.stepper.StepperLayout; import com.stepstone.stepper.VerificationError; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter; import com.stepstone.stepper.sample.step.StepFragmentSample; public abstract class AbstractStepperActivity extends AppCompatActivity implements StepperLayout.StepperListener, @@ -44,7 +44,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(getLayoutResId()); mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); int startingStepPosition = savedInstanceState != null ? savedInstanceState.getInt(CURRENT_STEP_POSITION_KEY) : 0; - mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager()), startingStepPosition); + mStepperLayout.setAdapter(new MyStepperAdapterFragment(getSupportFragmentManager()), startingStepPosition); mStepperLayout.setListener(this); } @@ -94,9 +94,9 @@ public void onChangeEndButtonsEnabled(boolean enabled) { mStepperLayout.setCompleteButtonVerificationFailed(!enabled); } - private static class MyStepperAdapter extends AbstractStepAdapter { + private static class MyStepperAdapterFragment extends AbstractFragmentStepAdapter { - MyStepperAdapter(FragmentManager fm) { + MyStepperAdapterFragment(FragmentManager fm) { super(fm); } diff --git a/sample/src/main/java/com/stepstone/stepper/sample/DelayedTransitionStepperActivity.java b/sample/src/main/java/com/stepstone/stepper/sample/DelayedTransitionStepperActivity.java index da57ad0..7cb1658 100644 --- a/sample/src/main/java/com/stepstone/stepper/sample/DelayedTransitionStepperActivity.java +++ b/sample/src/main/java/com/stepstone/stepper/sample/DelayedTransitionStepperActivity.java @@ -22,7 +22,7 @@ import android.support.v7.app.AppCompatActivity; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter; import com.stepstone.stepper.sample.step.DelayedTransitionStepFragmentSample; public class DelayedTransitionStepperActivity extends AppCompatActivity { @@ -39,7 +39,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_default_dots); mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); int startingStepPosition = savedInstanceState != null ? savedInstanceState.getInt(CURRENT_STEP_POSITION_KEY) : 0; - mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager()), startingStepPosition); + mStepperLayout.setAdapter(new MyStepperAdapterFragment(getSupportFragmentManager()), startingStepPosition); } @Override @@ -58,9 +58,9 @@ public void onBackPressed() { } } - private static class MyStepperAdapter extends AbstractStepAdapter { + private static class MyStepperAdapterFragment extends AbstractFragmentStepAdapter { - MyStepperAdapter(FragmentManager fm) { + MyStepperAdapterFragment(FragmentManager fm) { super(fm); } diff --git a/sample/src/main/java/com/stepstone/stepper/sample/DifferentNextButtonStepperActivity.java b/sample/src/main/java/com/stepstone/stepper/sample/DifferentNextButtonStepperActivity.java index 788a450..0ce9ff0 100644 --- a/sample/src/main/java/com/stepstone/stepper/sample/DifferentNextButtonStepperActivity.java +++ b/sample/src/main/java/com/stepstone/stepper/sample/DifferentNextButtonStepperActivity.java @@ -23,7 +23,7 @@ import android.support.v7.app.AppCompatActivity; import com.stepstone.stepper.StepperLayout; -import com.stepstone.stepper.adapter.AbstractStepAdapter; +import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter; import com.stepstone.stepper.sample.step.StepFragmentSample; public class DifferentNextButtonStepperActivity extends AppCompatActivity { @@ -40,7 +40,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_default_dots); mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); int startingStepPosition = savedInstanceState != null ? savedInstanceState.getInt(CURRENT_STEP_POSITION_KEY) : 0; - mStepperLayout.setAdapter(new DifferentNextButtonStepperActivity.MyStepperAdapter(getSupportFragmentManager()), startingStepPosition); + mStepperLayout.setAdapter(new MyStepperAdapterFragment(getSupportFragmentManager()), startingStepPosition); } @@ -60,9 +60,9 @@ public void onBackPressed() { } } - private static class MyStepperAdapter extends AbstractStepAdapter { + private static class MyStepperAdapterFragment extends AbstractFragmentStepAdapter { - MyStepperAdapter(FragmentManager fm) { + MyStepperAdapterFragment(FragmentManager fm) { super(fm); } diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 6c69817..fc34041 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -12,6 +12,7 @@ Delayed transition Different next buttons Show Back button on first step + No Fragment Stepper Tab title Lorem ipsum dolor sit amet, sale viris intellegam usu eu, persius patrioque sea at. Ne salutandi repudiandae mei, cu mollis accusam mediocrem mea. Altera dolorem praesent at vis. Torquatos philosophia ad quo. Omnis adipiscing has ea, mel no hinc iudico percipit. From 891f40ff0898b17db814f9ee1f26edb3e8019527 Mon Sep 17 00:00:00 2001 From: leonardo Date: Sun, 18 Dec 2016 04:07:20 -0200 Subject: [PATCH 2/8] Fixed manifest --- sample/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index c4a197e..4ef36cf 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -29,7 +29,6 @@ - \ No newline at end of file From bfb0c7008647e1d927bb8b4299a364cab8759f83 Mon Sep 17 00:00:00 2001 From: leonardo Date: Sun, 18 Dec 2016 15:46:00 -0200 Subject: [PATCH 3/8] Final example --- sample/build.gradle | 1 + sample/src/main/AndroidManifest.xml | 2 + .../stepper/sample/MainActivity.java | 7 ++ .../stepper/sample/SampleApplication.java | 17 +++ .../stepper/sample/nofrag/NoFragActivity.java | 66 ++++++++++ .../stepper/sample/nofrag/NoFragAdapter.java | 63 ++++++++++ .../stepper/sample/nofrag/NoFragView.java | 115 ++++++++++++++++++ sample/src/main/res/layout/activity_main.xml | 6 + .../src/main/res/layout/activity_no_frag.xml | 8 ++ 9 files changed, 285 insertions(+) create mode 100644 sample/src/main/java/com/stepstone/stepper/sample/SampleApplication.java create mode 100644 sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragActivity.java create mode 100644 sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragAdapter.java create mode 100644 sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragView.java create mode 100644 sample/src/main/res/layout/activity_no_frag.xml diff --git a/sample/build.gradle b/sample/build.gradle index 862a356..32a8001 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -26,4 +26,5 @@ dependencies { compile project(':material-stepper') compile ("com.android.support:appcompat-v7:$androidSupportLibraryVersion") compile ("com.jakewharton:butterknife:$butterknifeVersion") + compile 'com.facebook.stetho:stetho:1.4.2' } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 4ef36cf..2c02d95 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" + android:name=".SampleApplication" android:theme="@style/AppTheme"> @@ -29,6 +30,7 @@ + \ No newline at end of file diff --git a/sample/src/main/java/com/stepstone/stepper/sample/MainActivity.java b/sample/src/main/java/com/stepstone/stepper/sample/MainActivity.java index 2b6e1d5..bc91e12 100644 --- a/sample/src/main/java/com/stepstone/stepper/sample/MainActivity.java +++ b/sample/src/main/java/com/stepstone/stepper/sample/MainActivity.java @@ -21,6 +21,8 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; +import com.stepstone.stepper.sample.nofrag.NoFragActivity; + import butterknife.ButterKnife; import butterknife.OnClick; @@ -93,4 +95,9 @@ public void onShowReturnButton(View view) { startActivity(new Intent(this, ReturnButtonActivity.class)); } + @OnClick(R.id.noFrag) + public void onNoFrag(View view){ + startActivity(new Intent(this, NoFragActivity.class)); + } + } diff --git a/sample/src/main/java/com/stepstone/stepper/sample/SampleApplication.java b/sample/src/main/java/com/stepstone/stepper/sample/SampleApplication.java new file mode 100644 index 0000000..7121482 --- /dev/null +++ b/sample/src/main/java/com/stepstone/stepper/sample/SampleApplication.java @@ -0,0 +1,17 @@ +package com.stepstone.stepper.sample; + +import android.app.Application; + +import com.facebook.stetho.Stetho; + +/** + * Created by leonardo on 18/12/16. + */ + +public class SampleApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + Stetho.initializeWithDefaults(this); + } +} diff --git a/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragActivity.java b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragActivity.java new file mode 100644 index 0000000..25de5ba --- /dev/null +++ b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragActivity.java @@ -0,0 +1,66 @@ +package com.stepstone.stepper.sample.nofrag; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.Toast; + +import com.stepstone.stepper.StepperLayout; +import com.stepstone.stepper.VerificationError; +import com.stepstone.stepper.sample.OnNavigationBarListener; +import com.stepstone.stepper.sample.R; + +public class NoFragActivity extends AppCompatActivity implements StepperLayout.StepperListener, OnNavigationBarListener { + + private static final String CURRENT_STEP_POSITION_KEY = "position"; + + StepperLayout mStepperLayout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_no_frag); + mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout); + int startingStepPosition = savedInstanceState != null ? savedInstanceState.getInt(CURRENT_STEP_POSITION_KEY) : 0; + NoFragAdapter noFragAdapter = new NoFragAdapter(this); + mStepperLayout.setAdapter(noFragAdapter); + mStepperLayout.setListener(this); + } + + @Override + public void onBackPressed() { + final int currentStepPosition = mStepperLayout.getCurrentStepPosition(); + if (currentStepPosition > 0) { + mStepperLayout.setCurrentStepPosition(currentStepPosition - 1); + } else { + finish(); + } + } + + @Override + public void onCompleted(View completeButton) { + Toast.makeText(this, "onCompleted!", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onError(VerificationError verificationError) { + Toast.makeText(this, "onError! -> " + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onStepSelected(int newStepPosition) { + Toast.makeText(this, "onStepSelected! -> " + newStepPosition, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onReturn() { + finish(); + } + + @Override + public void onChangeEndButtonsEnabled(boolean enabled) { + mStepperLayout.setNextButtonVerificationFailed(!enabled); + mStepperLayout.setCompleteButtonVerificationFailed(!enabled); + } + +} diff --git a/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragAdapter.java b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragAdapter.java new file mode 100644 index 0000000..33a871c --- /dev/null +++ b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragAdapter.java @@ -0,0 +1,63 @@ +package com.stepstone.stepper.sample.nofrag; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.view.ViewGroup; + +import com.stepstone.stepper.Step; +import com.stepstone.stepper.adapter.AbstractStepAdapter; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by leonardo on 18/12/16. + */ + +public class NoFragAdapter extends AbstractStepAdapter { + + private List pages = new LinkedList<>(); + private final Context context; + + public NoFragAdapter(Context context) { + this.context = context; + } + + @Override + public Step findStep(ViewPager viewPager, int position) { + return pages.size() > 0 ? pages.get(position) : null; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + NoFragView view = createStep(position); + pages.add(view); + + container.addView(view); + + return view; + } + + @Override + public NoFragView createStep(int position) { + NoFragView view = new NoFragView(context); + + return view; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View) object); + } + + @Override + public int getCount() { + return 3; + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } +} diff --git a/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragView.java b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragView.java new file mode 100644 index 0000000..4d16455 --- /dev/null +++ b/sample/src/main/java/com/stepstone/stepper/sample/nofrag/NoFragView.java @@ -0,0 +1,115 @@ +package com.stepstone.stepper.sample.nofrag; + +import android.annotation.TargetApi; +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.Html; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.widget.Button; +import android.widget.FrameLayout; + +import com.stepstone.stepper.Step; +import com.stepstone.stepper.VerificationError; +import com.stepstone.stepper.sample.OnNavigationBarListener; +import com.stepstone.stepper.sample.R; + +/** + * Created by leonardo on 18/12/16. + */ + +public class NoFragView extends FrameLayout implements Step { + + private static final int TAP_THRESHOLD = 2; + private int i = 0; + @Nullable + private OnNavigationBarListener onNavigationBarListener; + + private Button button; + + public NoFragView(Context context) { + super(context); + init(context); + } + + public NoFragView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public NoFragView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + @TargetApi(21) + public NoFragView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + Context c = getContext(); + if(c instanceof OnNavigationBarListener){ + this.onNavigationBarListener = (OnNavigationBarListener) c; + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + this.onNavigationBarListener = null; + } + + private void init(Context context){ + View v = LayoutInflater.from(context).inflate(R.layout.fragment_step, this, true); + button = (Button) v.findViewById(R.id.button); + + updateNavigationBar(); + + button = (Button) v.findViewById(R.id.button); + button.setText(Html.fromHtml("Taps: " + i + "")); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + button.setText(Html.fromHtml("Taps: " + (++i) + "")); + updateNavigationBar(); + } + }); + } + + private boolean isAboveThreshold() { + return i >= TAP_THRESHOLD; + } + + @Override + public int getName() { + return R.string.app_name; + } + + @Override + public VerificationError verifyStep() { + return isAboveThreshold() ? null : new VerificationError("Click " + (TAP_THRESHOLD - i) + " more times!"); + } + + private void updateNavigationBar() { + if (onNavigationBarListener != null) { + onNavigationBarListener.onChangeEndButtonsEnabled(isAboveThreshold()); + } + } + + @Override + public void onSelected() { + updateNavigationBar(); + } + + @Override + public void onError(@NonNull VerificationError error) { + button.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.shake_error)); + } +} diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index c8b83eb..4f33fb4 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -16,6 +16,12 @@ android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.stepstone.stepper.sample.MainActivity"> +