Skip to content

Commit 3237bf2

Browse files
committed
refactor: Refactor library;
Renamed PresentationPagerFragment to TutorialFragment. Made PageFragment not abstract with default implementation for PageFragment#getLayoutResId() and PageFragment#getTransformItems(). Removed capability to create new instance of TransformItem via `new`. Added fabric static method TransformItem#create(PageOptions) and TransformItem#create(int,TransformItem[]). Created OnTutorialPageChangeListener to listen change page events. Use TutorialFragment#addOnTutorialPageChangeListener() and TutorialFragment#addOnTutorialPageChangeListener() to add/remove listener. Created TutorialOptions to configure TutorialFragment. Created TutorialPageOptionsProvider and PageOptions to provide and configure PageFragment instances. Created TutorialPageProvider to provide PageFragment instances. Removed CirclePageIndicator. Created TutorialPageIndicator view. Created IndicatorOptions to configure TutorialPageIndicator view. Created Renderer interface that responds for drawing single indicator item. There are 2 default implementation: Renderer.Factory#newCircleRenderer() and Renderer.Factory#newSquareRenderer(). Updated version. Updated README.
1 parent e88d0ee commit 3237bf2

35 files changed

+1200
-1150
lines changed

README.md

Lines changed: 171 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ All you need to do is:
2626

2727

2828

29-
##Using
29+
## Using
3030

31-
First, add gradle dependency with command:<br>
31+
First, add gradle dependency with command:
3232
```groovy
3333
dependencies {
34-
compile 'com.cleveroad:slidingtutorial:0.9.5'
34+
compile 'com.cleveroad:slidingtutorial:1.0.0'
3535
}
3636
```
3737

38-
After you have to create each fragment that must extend from PageFragment. Also you have to create your xml file with images.
38+
After you have to create each fragment that must extend from **PageFragment**. Also you have to create your xml file with images.
3939

4040
```java
4141
public class FirstCustomPageFragment extends PageFragment {
@@ -63,92 +63,187 @@ public class FirstCustomPageFragment extends PageFragment {
6363
}
6464
```
6565

66-
Then you should provide these fragments in main slidingtutroial fragment
66+
And specify **TutorialPageProvider** in main **TutorialFragment** fragment.
6767

6868
```java
69-
public class CustomPresentationPagerFragment extends PresentationPagerFragment {
70-
71-
@Override
72-
public int getLayoutResId() {
73-
// layout id of fragment
74-
return R.layout.fragment_presentation;
75-
}
76-
77-
@Override
78-
public int getViewPagerResId() {
79-
// id of view pager
80-
return R.id.viewPager;
81-
}
82-
83-
@Override
84-
public int getIndicatorResId() {
85-
// id of circular indicator
86-
return R.id.indicator;
87-
}
69+
private final TutorialPageProvider mTutorialPageProvider = new TutorialPageProvider() {
70+
@NonNull
71+
@Override
72+
public PageFragment providePage(int position) {
73+
position %= ACTUAL_PAGES_COUNT;
74+
switch (position) {
75+
case 0:
76+
return new FirstCustomPageFragment();
77+
case 1:
78+
return new SecondCustomPageFragment();
79+
case 2:
80+
return new ThirdCustomPageFragment();
81+
}
82+
}
83+
};
84+
```
8885

89-
@Override
90-
public int getButtonSkipResId() {
91-
// id of skip button
92-
return R.id.tvSkip;
93-
}
86+
Or you can provide **TutorialPageOptionsProvider** instance in main TutorialFragment fragment that responds for creating **PageFragment** instances with provided **PageOptions** configuration.
9487

88+
```java
89+
private final TutorialPageOptionsProvider mTutorialPageOptionsProvider = new TutorialPageOptionsProvider() {
90+
@NonNull
9591
@Override
96-
protected int getPagesCount() {
97-
// total number of pages
98-
return 3;
92+
public PageOptions provide(int position) {
93+
@LayoutRes int pageLayoutResId;
94+
TransformItem[] tutorialItems;
95+
position %= ACTUAL_PAGES_COUNT;
96+
switch (position) {
97+
case 0: {
98+
pageLayoutResId = R.layout.fragment_page_first;
99+
tutorialItems = new TransformItem[]{
100+
TransformItem.create(R.id.ivFirstImage, Direction.LEFT_TO_RIGHT, 0.2f),
101+
TransformItem.create(R.id.ivSecondImage, Direction.RIGHT_TO_LEFT, 0.06f),
102+
TransformItem.create(R.id.ivThirdImage, Direction.LEFT_TO_RIGHT, 0.08f),
103+
TransformItem.create(R.id.ivFourthImage, Direction.RIGHT_TO_LEFT, 0.1f),
104+
TransformItem.create(R.id.ivFifthImage, Direction.RIGHT_TO_LEFT, 0.03f),
105+
TransformItem.create(R.id.ivSixthImage, Direction.RIGHT_TO_LEFT, 0.09f),
106+
TransformItem.create(R.id.ivSeventhImage, Direction.RIGHT_TO_LEFT, 0.14f),
107+
TransformItem.create(R.id.ivEighthImage, Direction.RIGHT_TO_LEFT, 0.07f)
108+
};
109+
break;
110+
}
111+
case 1: {
112+
pageLayoutResId = R.layout.fragment_page_second;
113+
tutorialItems = new TransformItem[]{
114+
TransformItem.create(R.id.ivFirstImage, Direction.RIGHT_TO_LEFT, 0.2f),
115+
TransformItem.create(R.id.ivSecondImage, Direction.LEFT_TO_RIGHT, 0.06f),
116+
TransformItem.create(R.id.ivThirdImage, Direction.RIGHT_TO_LEFT, 0.08f),
117+
TransformItem.create(R.id.ivFourthImage, Direction.LEFT_TO_RIGHT, 0.1f),
118+
TransformItem.create(R.id.ivFifthImage, Direction.LEFT_TO_RIGHT, 0.03f),
119+
TransformItem.create(R.id.ivSixthImage, Direction.LEFT_TO_RIGHT, 0.09f),
120+
TransformItem.create(R.id.ivSeventhImage, Direction.LEFT_TO_RIGHT, 0.14f),
121+
TransformItem.create(R.id.ivEighthImage, Direction.LEFT_TO_RIGHT, 0.07f)
122+
};
123+
break;
124+
}
125+
case 2: {
126+
pageLayoutResId = R.layout.fragment_page_third;
127+
tutorialItems = new TransformItem[]{
128+
TransformItem.create(R.id.ivFirstImage, Direction.RIGHT_TO_LEFT, 0.2f),
129+
TransformItem.create(R.id.ivSecondImage, Direction.LEFT_TO_RIGHT, 0.06f),
130+
TransformItem.create(R.id.ivThirdImage, Direction.RIGHT_TO_LEFT, 0.08f),
131+
TransformItem.create(R.id.ivFourthImage, Direction.LEFT_TO_RIGHT, 0.1f),
132+
TransformItem.create(R.id.ivFifthImage, Direction.LEFT_TO_RIGHT, 0.03f),
133+
TransformItem.create(R.id.ivSixthImage, Direction.LEFT_TO_RIGHT, 0.09f),
134+
TransformItem.create(R.id.ivSeventhImage, Direction.LEFT_TO_RIGHT, 0.14f)
135+
};
136+
break;
137+
}
138+
default: {
139+
throw new IllegalStateException("Invalid position");
140+
}
141+
}
142+
143+
return PageOptions.create(pageLayoutResId, position, tutorialItems);
99144
}
145+
};
146+
```
100147

101-
@Override
102-
protected PageFragment getPage(int position) {
103-
// get page for position
104-
if (position == 0)
105-
return new FirstCustomPageFragment();
106-
if (position == 1)
107-
return new SecondCustomPageFragment();
108-
if (position == 2)
109-
return new ThirdCustomPageFragment();
110-
throw new IllegalArgumentException("Unknown position: " + position);
111-
}
148+
All the stuff then use while creating **TutorialOptions** instance using **TutorialOptions**.**Builder** inside **TutorialFragment**#*provideTutorialOptions* method implementation. For example with using **TutorialPageProvider**:
149+
```java
150+
@Override
151+
protected TutorialOptions provideTutorialOptions() {
152+
return TutorialOptions.newBuilder(getContext())
153+
.isAutoRemoveTutorialFragment(true)
154+
.setPagesColors(pagesColors)
155+
.setPagesCount(TOTAL_PAGES)
156+
.setTutorialPageProvider(mTutorialPageProvider)
157+
.onSkipClickListener(mOnSkipClickListener)
158+
.build();
159+
}
160+
```
112161

113-
@ColorInt
114-
@Override
115-
protected int getPageColor(int position) {
116-
// get color of page
117-
if (position == 0)
118-
return ContextCompat.getColor(getContext(), android.R.color.holo_orange_dark);
119-
if (position == 1)
120-
return ContextCompat.getColor(getContext(), android.R.color.holo_green_dark);
121-
if (position == 2)
122-
return ContextCompat.getColor(getContext(), android.R.color.holo_blue_dark);
123-
return Color.TRANSPARENT;
124-
}
162+
Example with specifying **TutorialPageOptionsProvider**:
163+
```java
164+
@Override
165+
protected TutorialOptions provideTutorialOptions() {
166+
return TutorialOptions.newBuilder(getContext())
167+
.isAutoRemoveTutorialFragment(true)
168+
.setPagesColors(pagesColors)
169+
.setPagesCount(TOTAL_PAGES)
170+
.onSkipClickListener(mOnSkipClickListener)
171+
.build();
172+
}
173+
```
125174

126-
@Override
127-
protected boolean isInfiniteScrollEnabled() {
128-
// enable/disable infinite scroll behavior
129-
return true;
130-
}
131-
132-
@Override
133-
protected boolean onSkipButtonClicked() {
134-
// your own behavior goes here
135-
// ...
136-
// return true to consume click event, false otherwise
137-
return true;
138-
}
175+
Also you can configure **TutorialPageIndicator** view via **IndicatorOptions**. For example (inside **TutorialFragment**#*provideTutorialOptions* method implementation):
176+
```java
177+
@Override
178+
protected TutorialOptions provideTutorialOptions() {
179+
return TutorialOptions.newBuilder(getContext())
180+
.isAutoRemoveTutorialFragment(true)
181+
.setPagesColors(pagesColors)
182+
.setPagesCount(TOTAL_PAGES)
183+
.setTutorialPageProvider(mTutorialPageOptionsProvider)
184+
.setIndicatorOptions(IndicatorOptions.newBuilder(getContext())
185+
.setElementSizeRes(R.dimen.indicator_size)
186+
.setElementSpacing(2f)
187+
.setElementColorRes(android.R.color.darker_gray)
188+
.setSelectedElementColor(Color.LTGRAY)
189+
.setRenderer(RhombusRenderer.create())
190+
.build())
191+
.onSkipClickListener(mOnSkipClickListener)
192+
.build();
139193
}
140194
```
141195

142196
## Changelog
143197

144-
| Version | Changes |
145-
| --- | --- |
146-
| v.0.9.5 | Added getters for views. Possible fix for manifest merging issues |
147-
| v.0.9.4 | Renamed all attributes; all resources marked as private |
148-
| v.0.9.3 | Fixed issue with wrong page showed at startup if pages count not equals 3 |
149-
| v.0.9.2 | Added onSkipButtonClicked method and SimplePagerFragment |
150-
| v.0.9.1 | Added infinite scroll behavior |
151-
| v.0.9 | First public release |
198+
Version | Changes
199+
--- | ---
200+
v.1.0.0 | Library fully refactored. See full [1.0.0 Changelog](#100_Changelog_233)
201+
v.0.9.5 | Added getters for views. Possible fix for manifest merging issues
202+
v.0.9.4 | Renamed all attributes; all resources marked as private |
203+
v.0.9.3 | Fixed issue with wrong page showed at startup if pages count not equals 3
204+
v.0.9.2 | Added onSkipButtonClicked method and SimplePagerFragment
205+
v.0.9.1 | Added infinite scroll behavior
206+
v.0.9 | First public release
207+
208+
## 1.0.0 Changelog
209+
* Renamed **PresentationPagerFragment** to **TutorialFragment**.
210+
* Maked **PageFragment** not abstract with default implementaion for **PageFragment*#*getLayoutResId()* and **PageFragment**#*getTransformItems()*.
211+
* Removed capability to create new instance of **TransformItem** via `new`. Added fabric static method **TransformItem**#*create(PageOptions)* and **TransformItem**#*create(int,TransformItem[])*.
212+
* Created **OnTutorialPageChangeListener** to listen change page events.
213+
* Use **TutorialFragment**#*addOnTutorialPageChangeListener()* and **TutorialFragment**#*addOnTutorialPageChangeListener()* to add/remove listener.
214+
* Created **TutorialOptions** to configure **TutorialFragment**.
215+
* Created **TutorialPageOptionsProvider** and **PageOptions** to provide and configure **PageFragment** instances.
216+
* Created **TutorialPageProvider** to provide **PageFragment** instances.
217+
* Removed **CirclePageIndicator**.
218+
* Created **TutorialPageIndicator** view.
219+
* Created **IndicatorOptions** to configure **TutorialPageIndicator** view.
220+
* Created **Renderer** interface that responds for drawing single indicator item. There are 2 default implementaion: **Renderer**.**Factory**#*newCircleRenderer()* and **Renderer**.**Factory**#*newSquareRenderer()*.
221+
222+
223+
## Migrations from v.0.9.5 to v.1.0.0
224+
1. You must change creation TransformItem from `new TransformItem(R.id.ivFirstImage, true, 20)` to `TransformItem.create(R.id.ivFirstImage, Direction.LEFT_TO_RIGHT, 0.2f)`, where 2-nd parameter now is **Direction** of view translation and 3-rd parameter is *shiftCoefficient*.
225+
2. Your fragment with tutorial must extend **TutorialFragment** instead of **PresentationPagerFragment**.
226+
3. In your **TutorialFragment** successor fragment must implement #*provideTutorialOptions()* method that returns TutorialOptions instance.
227+
4. In **TutorialOptions**.**Builder**#setTutorialPageProvider(**TutorialPageProvider**)* you must specify **TutorialPageProvider** instance. For example:
228+
```java
229+
private final TutorialPageProvider mTutorialPageProvider = new TutorialPageProvider() {
230+
@NonNull
231+
@Override
232+
public PageFragment providePage(int position) {
233+
position %= ACTUAL_PAGES_COUNT;
234+
switch (position) {
235+
case 0:
236+
return new FirstCustomPageFragment();
237+
case 1:
238+
return new SecondCustomPageFragment();
239+
case 2:
240+
return new ThirdCustomPageFragment();
241+
default:
242+
throw new IllegalArgumentException("Unknown position: " + position);
243+
}
244+
}
245+
};
246+
```
152247

153248
## Migrations from v.0.9.3 to v.0.9.4
154249
* All resources marked as private. Make sure you're not using any resource (strings, dimens, etc) from this library.

lib/build.gradle

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
apply plugin: 'com.android.library'
22

33
android {
4-
compileSdkVersion 23
4+
compileSdkVersion 24
55
buildToolsVersion "23.0.3"
66

77
defaultConfig {
88
minSdkVersion 14
9-
targetSdkVersion 23
9+
targetSdkVersion 24
1010
versionCode 7
11-
versionName "0.9.5"
11+
versionName "1.0.0"
1212
}
1313
buildTypes {
1414
release {
@@ -22,8 +22,7 @@ android {
2222

2323
dependencies {
2424
compile fileTree(dir: 'libs', include: ['*.jar'])
25-
testCompile 'junit:junit:4.12'
26-
compile 'com.android.support:appcompat-v7:23.4.0'
25+
compile 'com.android.support:appcompat-v7:24.2.0'
2726
}
2827

2928
apply from: './gradle-mvn-push.gradle'

lib/src/androidTest/java/com/cleveroad/slidingtutorial/ApplicationTest.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)