Skip to content

Commit d931c9b

Browse files
Piotr Zawadzkizawadz88
authored andcommitted
- moved Fragment display info from Step to StepViewModel which is used in StepAdapter
- added an option to use CharSequence for Step titles and button titles
1 parent b2664f5 commit d931c9b

22 files changed

+262
-104
lines changed

README.md

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Quoting the [documentation](https://www.google.com/design/spec/components/steppe
1111
1212
## Download (from JCenter)
1313
```groovy
14-
compile 'com.stepstone.stepper:material-stepper:1.1.1'
14+
compile 'com.stepstone.stepper:material-stepper:2.0.0'
1515
```
1616

1717
## Supported steppers
@@ -62,13 +62,6 @@ public class StepFragmentSample extends Fragment implements Step {
6262
return v;
6363
}
6464

65-
@Override
66-
@StringRes
67-
public int getName() {
68-
//return string resource ID for the tab title used when StepperLayout is in tabs mode
69-
return R.string.tab_title;
70-
}
71-
7265
@Override
7366
public VerificationError verifyStep() {
7467
//return null if the user can go to the next step, create a new VerificationError instance otherwise
@@ -88,15 +81,15 @@ public class StepFragmentSample extends Fragment implements Step {
8881
}
8982
```
9083

91-
### Extend AbstractStepAdapter
92-
AbstractStepAdapter extends [FragmentPagerAdapter](http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)
84+
### Extend AbstractFragmentStepAdapter
85+
AbstractFragmentStepAdapter extends [FragmentPagerAdapter](http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)
9386
but instead of overriding the method `getItem(int)` you must override the `createStep(int)` method.
9487

9588
```java
96-
public static class MyStepperAdapter extends AbstractStepAdapter {
89+
public static class MyStepperAdapter extends AbstractFragmentStepAdapter {
9790

98-
public MyStepperAdapter(FragmentManager fm) {
99-
super(fm);
91+
public MyStepperAdapter(FragmentManager fm, Context context) {
92+
super(fm, context);
10093
}
10194

10295
@Override
@@ -128,7 +121,7 @@ public class StepperActivity extends AppCompatActivity {
128121
super.onCreate(savedInstanceState);
129122
setContentView(R.layout.main);
130123
mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout);
131-
mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager()));
124+
mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager(), this));
132125
}
133126
}
134127
```
@@ -239,6 +232,7 @@ public class DelayedTransitionStepFragmentSample extends Fragment implements Blo
239232
```
240233

241234
### Changing the Next button text per step
235+
<b>TODO update + add tutorial for Back button</b>
242236
Sometimes you might want to have different labels on the Next button on different steps e.g. use the default label on the first few steps,
243237
but display 'Summary' just before the last page.
244238
<p><img src ="./gifs/different-next-buttons.gif" width="360" height="640"/></p>
@@ -293,6 +287,9 @@ This behaviour can be changed by setting ```ms_showBackButtonOnFirstStep``` to `
293287
```
294288
To get a callback when this button was pressed you need set a ```StepperListener``` and write your own custom return logic in the ```onReturn()``` method to e.g. close the Activity.
295289

290+
### Using with Views instead of Fragments
291+
<b>TODO: document</b>
292+
296293
### Advanced usage
297294
For other examples, e.g. persisting state on rotation, displaying errors, changing whether the user can go to the next step, etc. check out the sample app.
298295

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ configure(allprojects) {
2020
/* Android config and dependency versions */
2121
ext {
2222
androidMinSdkVersion = 14
23-
androidTargetSdkVersion = 24
24-
androidCompileSdkVersion = 24
23+
androidTargetSdkVersion = 25
24+
androidCompileSdkVersion = 25
2525
androidBuildToolsVersion = "25.0.2"
26-
androidSupportLibraryVersion = "25.0.0"
26+
androidSupportLibraryVersion = "25.1.0"
2727

2828
/* Sample only */
2929
butterknifeVersion = "7.0.1"

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919

2020
POM_GROUP_ID=com.stepstone.stepper
2121
POM_ARTIFACT_ID=material-stepper
22-
POM_VERSION=1.1.1
22+
POM_VERSION=2.0.0

material-stepper/src/main/java/com/stepstone/stepper/Step.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,12 @@
1717
package com.stepstone.stepper;
1818

1919
import android.support.annotation.NonNull;
20-
import android.support.annotation.StringRes;
2120

2221
/**
2322
* A base step interface which all {@link StepperLayout} steps must implement.
2423
*/
2524
public interface Step {
2625

27-
/**
28-
* Returns a String resource ID for the displayable name of the step.
29-
* @return a String resource ID for the displayable name of the step
30-
*/
31-
@StringRes int getName();
32-
3326
/**
3427
* Checks if the stepper can go to the next step after this step.<br>
3528
* <b>This does not mean the user clicked on the Next/Complete button.</b><br>

material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,8 @@ private void onUpdate(int newStepPosition, boolean animate) {
538538
AnimationUtil.fadeViewVisibility(mBackNavigationButton, isFirst && !mShowBackButtonOnFirstStep ? View.GONE : View.VISIBLE, animate);
539539

540540
if (!isLast) {
541-
int nextButtonTextForStep = mStepAdapter.getNextButtonText(newStepPosition);
542-
if (nextButtonTextForStep == StepAdapter.DEFAULT_NEXT_BUTTON_TEXT) {
541+
CharSequence nextButtonTextForStep = mStepAdapter.getViewModel(newStepPosition).getNextButtonLabel();
542+
if (nextButtonTextForStep == null) {
543543
mNextNavigationButton.setText(mNextButtonText);
544544
} else {
545545
mNextNavigationButton.setText(nextButtonTextForStep);

material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractFragmentStepAdapter.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616

1717
package com.stepstone.stepper.adapter;
1818

19-
import android.support.annotation.StringRes;
19+
import android.content.Context;
20+
import android.support.annotation.IntRange;
21+
import android.support.annotation.NonNull;
2022
import android.support.v4.app.Fragment;
2123
import android.support.v4.app.FragmentManager;
2224
import android.support.v4.app.FragmentPagerAdapter;
2325
import android.support.v4.view.PagerAdapter;
2426
import android.support.v4.view.ViewPager;
2527

2628
import com.stepstone.stepper.Step;
29+
import com.stepstone.stepper.viewmodel.StepViewModel;
2730

2831
/**
2932
* A base adapter class which returns step fragments to use inside of the {@link com.stepstone.stepper.StepperLayout}.
@@ -32,29 +35,35 @@ public abstract class AbstractFragmentStepAdapter
3235
extends FragmentPagerAdapter
3336
implements StepAdapter {
3437

38+
@NonNull
3539
private final FragmentManager mFragmentManager;
3640

37-
public AbstractFragmentStepAdapter(FragmentManager fm) {
41+
@NonNull
42+
protected final Context context;
43+
44+
public AbstractFragmentStepAdapter(@NonNull FragmentManager fm, @NonNull Context context) {
3845
super(fm);
39-
mFragmentManager = fm;
46+
this.mFragmentManager = fm;
47+
this.context = context;
4048
}
4149

4250
@Override
43-
public final Fragment getItem(int position) {
51+
public final Fragment getItem(@IntRange(from = 0) int position) {
4452
return (Fragment) createStep(position);
4553
}
4654

4755
/** {@inheritDoc} */
4856
@SuppressWarnings("unchecked")
49-
public Step findStep(ViewPager viewPager, int position) {
57+
public Step findStep(ViewPager viewPager, @IntRange(from = 0) int position) {
5058
String fragmentTag = "android:switcher:" + viewPager.getId() + ":" + this.getItemId(position);
5159
return (Step) mFragmentManager.findFragmentByTag(fragmentTag);
5260
}
5361

5462
/** {@inheritDoc} */
55-
@StringRes
56-
public int getNextButtonText(int position) {
57-
return DEFAULT_NEXT_BUTTON_TEXT;
63+
@NonNull
64+
@Override
65+
public StepViewModel getViewModel(@IntRange(from = 0) int position) {
66+
return new StepViewModel.Builder(context).create();
5867
}
5968

6069
/** {@inheritDoc} */

material-stepper/src/main/java/com/stepstone/stepper/adapter/AbstractStepAdapter.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,33 @@
11
package com.stepstone.stepper.adapter;
22

3+
import android.content.Context;
4+
import android.support.annotation.IntRange;
5+
import android.support.annotation.NonNull;
36
import android.support.v4.view.PagerAdapter;
47

8+
import com.stepstone.stepper.viewmodel.StepViewModel;
9+
510
/**
611
* A base adapter class which returns step to use inside of the {@link com.stepstone.stepper.StepperLayout}.
712
* This class is intended to be inherited if you need to use {@link com.stepstone.stepper.StepperLayout} without fragments.
813
* Otherwise, you should use {@link AbstractFragmentStepAdapter}
914
*/
10-
public abstract class AbstractStepAdapter extends PagerAdapter implements StepAdapter {
15+
public abstract class AbstractStepAdapter
16+
extends PagerAdapter
17+
implements StepAdapter {
18+
19+
@NonNull
20+
protected final Context context;
21+
22+
public AbstractStepAdapter(@NonNull Context context) {
23+
this.context = context;
24+
}
1125

1226
/** {@inheritDoc} */
27+
@NonNull
1328
@Override
14-
public int getNextButtonText(int position) {
15-
return DEFAULT_NEXT_BUTTON_TEXT;
29+
public StepViewModel getViewModel(@IntRange(from = 0) int position) {
30+
return new StepViewModel.Builder(context).create();
1631
}
1732

1833
/** {@inheritDoc} */

material-stepper/src/main/java/com/stepstone/stepper/adapter/StepAdapter.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.stepstone.stepper.adapter;
22

3-
import android.support.annotation.StringRes;
3+
import android.support.annotation.IntRange;
4+
import android.support.annotation.NonNull;
45
import android.support.v4.app.FragmentPagerAdapter;
56
import android.support.v4.view.PagerAdapter;
67
import android.support.v4.view.ViewPager;
78

89
import com.stepstone.stepper.Step;
10+
import com.stepstone.stepper.viewmodel.StepViewModel;
911

1012
/**
1113
* Interface to be used as model to {@link com.stepstone.stepper.StepperLayout}.
1214
*/
1315
public interface StepAdapter {
1416

15-
int DEFAULT_NEXT_BUTTON_TEXT = -1;
16-
1717
/**
1818
* Create each step of the {@link com.stepstone.stepper.StepperLayout}.
1919
* @param position The position of the {@link PagerAdapter} to be used inside the {@link ViewPager}.
2020
* @return the step to be used inside the {@link com.stepstone.stepper.StepperLayout}.
2121
*/
22-
Step createStep(int position);
22+
Step createStep(@IntRange(from = 0) int position);
2323

2424
/**
2525
* Finds the given step without creating it.
@@ -28,24 +28,21 @@ public interface StepAdapter {
2828
* @param position step position
2929
* @return step fragment
3030
*/
31-
Step findStep(ViewPager viewPager, int position);
31+
Step findStep(ViewPager viewPager, @IntRange(from = 0) int position);
3232

3333
/**
34-
* Allows to override the text on the Next button per step.
35-
* For a given step position you need to return a String resource ID for the label to be used.
36-
* If you wish to change the text for selected steps only (and leave the default for the rest)
37-
* then return {@link #DEFAULT_NEXT_BUTTON_TEXT} for the default ones.
38-
* By default this method returns {@link #DEFAULT_NEXT_BUTTON_TEXT} for all steps.
39-
* This method is not invoked for the last step.
34+
* Returns the view information to be used to display the step.
4035
* @param position step position
41-
* @return a String resource ID to override the default button text or {@link #DEFAULT_NEXT_BUTTON_TEXT} if the default text should be kept
36+
* @return view information
4237
*/
43-
@StringRes int getNextButtonText(int position);
38+
@NonNull
39+
StepViewModel getViewModel(@IntRange(from = 0) int position);
4440

4541
/**
4642
* Get the step count.
4743
* @return the quantity of steps
4844
*/
45+
@IntRange(from = 0)
4946
int getCount();
5047

5148
/**

material-stepper/src/main/java/com/stepstone/stepper/internal/StepTab.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import android.graphics.Typeface;
2121
import android.graphics.drawable.Drawable;
2222
import android.support.annotation.ColorInt;
23-
import android.support.annotation.StringRes;
2423
import android.support.v4.content.ContextCompat;
2524
import android.util.AttributeSet;
2625
import android.view.LayoutInflater;
@@ -109,14 +108,6 @@ public void setStepTitle(CharSequence title) {
109108
mStepTitle.setText(title);
110109
}
111110

112-
/**
113-
* Sets the name of the step
114-
* @param title resource ID of the step name
115-
*/
116-
public void setStepTitle(@StringRes int title) {
117-
mStepTitle.setText(title);
118-
}
119-
120111
/**
121112
* Sets the position of the step
122113
* @param number step position

material-stepper/src/main/java/com/stepstone/stepper/internal/TabsContainer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import android.content.res.TypedArray;
2121
import android.support.annotation.ColorInt;
2222
import android.support.annotation.NonNull;
23-
import android.support.annotation.StringRes;
23+
import android.support.annotation.Nullable;
2424
import android.support.annotation.UiThread;
2525
import android.support.v4.content.ContextCompat;
2626
import android.util.AttributeSet;
@@ -77,7 +77,7 @@ public void onTabClicked(int position) {
7777

7878
private TabItemListener mListener = TabItemListener.NULL;
7979

80-
private List<Integer> mStepTitles;
80+
private List<CharSequence> mStepTitles;
8181

8282
public TabsContainer(Context context) {
8383
this(context, null);
@@ -132,7 +132,7 @@ public void setListener(@NonNull TabItemListener listener) {
132132
* Sets the steps to display in the {@link TabsContainer}.
133133
* @param stepTitles a list of tab titles
134134
*/
135-
public void setSteps(List<Integer> stepTitles) {
135+
public void setSteps(List<CharSequence> stepTitles) {
136136
this.mStepTitles = stepTitles;
137137

138138
mTabsInnerContainer.removeAllViews();
@@ -159,7 +159,7 @@ public void setCurrentStep(int newStepPosition) {
159159
}
160160
}
161161

162-
private View createStepTab(final int position, @StringRes int title) {
162+
private View createStepTab(final int position, @Nullable CharSequence title) {
163163
StepTab view = (StepTab) LayoutInflater.from(getContext()).inflate(R.layout.ms_step_tab_container, mTabsInnerContainer, false);
164164
view.setStepNumber(String.valueOf(position + 1));
165165
view.toggleDividerVisibility(!isLastPosition(position));

0 commit comments

Comments
 (0)