Skip to content

Commit a8d8597

Browse files
committed
+ added new simple way of creation of tutorial
* fixed memory leaks issues * updated default sizes of page indicator's elements. fixed #44 * updated default colors of page indicator * updated versions of dependencies * prepared for new 1.0.6 release - removed unused or unnecessary methods
1 parent a158142 commit a8d8597

19 files changed

+261
-92
lines changed

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:2.2.0'
8+
classpath 'com.android.tools.build:gradle:2.2.2'
99
// NOTE: Do not place your application dependencies here; they belong
1010
// in the individual module build.gradle files
1111
}

gradle.properties

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
VERSION_NAME=1.0.5
2-
VERSION_CODE=15
1+
VERSION_NAME=1.0.6
2+
VERSION_CODE=16
33
GROUP=com.cleveroad
44

55
POM_DESCRIPTION=Sliding tutorial is simple library that help other developers easy create great tutotial

lib/build.gradle

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
apply plugin: 'com.android.library'
22

33
android {
4-
compileSdkVersion 24
5-
buildToolsVersion "24.0.3"
4+
compileSdkVersion 25
5+
buildToolsVersion "25.0.0"
66

77
defaultConfig {
88
minSdkVersion 14
9-
targetSdkVersion 24
9+
targetSdkVersion 25
1010
versionCode 15
1111
versionName "1.0.5"
1212
}
@@ -22,7 +22,7 @@ android {
2222

2323
dependencies {
2424
compile fileTree(dir: 'libs', include: ['*.jar'])
25-
compile 'com.android.support:support-v4:24.2.1'
25+
compile 'com.android.support:support-v4:25.0.0'
2626
}
2727

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

lib/src/main/java/com/cleveroad/slidingtutorial/IndicatorOptions.java

+4-35
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@
2424
package com.cleveroad.slidingtutorial;
2525

2626
import android.content.Context;
27-
import android.graphics.Color;
28-
import android.os.Build;
2927
import android.support.annotation.ColorInt;
3028
import android.support.annotation.ColorRes;
3129
import android.support.annotation.DimenRes;
3230
import android.support.annotation.NonNull;
3331
import android.support.annotation.Nullable;
32+
import android.support.v4.content.ContextCompat;
3433

3534
/**
3635
* Class contains configuration for {@link TutorialPageIndicator}.
@@ -50,28 +49,7 @@ public final class IndicatorOptions {
5049

5150
private Renderer mRenderer;
5251

53-
/**
54-
* Provide default configuration for indicator:
55-
* <ul>
56-
* <li>elementColor : {@link android.graphics.Color#DKGRAY}</li>
57-
* <li>selectedElementColor : {@link android.graphics.Color#WHITE}</li>
58-
* <li>elementSize : {@link com.cleveroad.slidingtutorial.R.dimen#st_indicator_size_default} = 4dp</li>
59-
* <li>setElementSpacing : {@link com.cleveroad.slidingtutorial.R.dimen#st_indicator_spacing_default} = 4dp</li>
60-
* </ul>
61-
*
62-
* @param context {@link Context} instance
63-
* @return default {@link IndicatorOptions} configuration for {@link TutorialPageIndicator}
64-
*/
65-
public static IndicatorOptions provideDefault(@NonNull Context context) {
66-
return new Builder(context)
67-
.setElementColor(Color.DKGRAY)
68-
.setSelectedElementColor(Color.WHITE)
69-
.setElementSizeRes(R.dimen.st_indicator_size_default)
70-
.setElementSpacingRes(R.dimen.st_indicator_spacing_default)
71-
.build();
72-
}
73-
74-
private IndicatorOptions(Builder builder) {
52+
private IndicatorOptions(@NonNull Builder builder) {
7553
mElementColor = builder.mElementColor;
7654
mSelectedElementColor = builder.mSelectedElementColor;
7755
mElementSize = builder.mElementSize;
@@ -135,7 +113,7 @@ private Builder(@NonNull Context context) {
135113
* @see #setSelectedElementColorRes(int)
136114
*/
137115
public Builder setSelectedElementColorRes(@ColorRes int indicatorColorResource) {
138-
return setSelectedElementColor(getColor(mContext, indicatorColorResource));
116+
return setSelectedElementColor(ContextCompat.getColor(mContext, indicatorColorResource));
139117
}
140118

141119
/**
@@ -158,7 +136,7 @@ public Builder setSelectedElementColor(@ColorInt int indicatorElementColor) {
158136
* @see #setSelectedElementColorRes(int)
159137
*/
160138
public Builder setElementColorRes(@ColorRes int indicatorColorResource) {
161-
return setElementColor(getColor(mContext, indicatorColorResource));
139+
return setElementColor(ContextCompat.getColor(mContext, indicatorColorResource));
162140
}
163141

164142
/**
@@ -230,15 +208,6 @@ public Builder setRenderer(@NonNull Renderer renderer) {
230208
return this;
231209
}
232210

233-
@SuppressWarnings("deprecation")
234-
private static int getColor(@NonNull Context context, @ColorRes int colorResource) {
235-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
236-
return context.getColor(colorResource);
237-
} else {
238-
return context.getResources().getColor(colorResource);
239-
}
240-
}
241-
242211
/**
243212
* Build {@link IndicatorOptions} instance with specified configuration.
244213
*

lib/src/main/java/com/cleveroad/slidingtutorial/PageFragment.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
6868
return mPage.onCreateView(inflater, container, savedInstanceState);
6969
}
7070

71-
/**
72-
* Method that apply a custom transformation to the page views
73-
*
74-
* @param pageWidth pageWidth
75-
* @param position Position of page relative to the current front-and-center
76-
* position of the pager. 0 is front and center. 1 is one full
77-
* page position to the right, and -1 is one page position to the left.
78-
*/
79-
final void transformPage(int pageWidth, float position) {
80-
mPage.transformPage(pageWidth, position);
71+
@Override
72+
public void onDestroyView() {
73+
mPage.onDestroyView();
74+
super.onDestroyView();
8175
}
8276

8377
@LayoutRes

lib/src/main/java/com/cleveroad/slidingtutorial/PageImpl.java

+6
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInst
6767
return view;
6868
}
6969

70+
void onDestroyView() {
71+
for (TransformItem transformItem : mTransformItems) {
72+
transformItem.setView(null);
73+
}
74+
}
75+
7076
/**
7177
* Method that apply a custom transformation to the page views
7278
*

lib/src/main/java/com/cleveroad/slidingtutorial/PageSupportFragment.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
6868
return mPage.onCreateView(inflater, container, savedInstanceState);
6969
}
7070

71-
/**
72-
* Method that apply a custom transformation to the page views
73-
*
74-
* @param pageWidth pageWidth
75-
* @param position Position of page relative to the current front-and-center
76-
* position of the pager. 0 is front and center. 1 is one full
77-
* page position to the right, and -1 is one page position to the left.
78-
*/
79-
final void transformPage(int pageWidth, float position) {
80-
mPage.transformPage(pageWidth, position);
71+
@Override
72+
public void onDestroyView() {
73+
mPage.onDestroyView();
74+
super.onDestroyView();
8175
}
8276

8377
@LayoutRes

lib/src/main/java/com/cleveroad/slidingtutorial/TutorialFragment.java

+29
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package com.cleveroad.slidingtutorial;
2525

26+
import android.annotation.SuppressLint;
2627
import android.app.Fragment;
2728
import android.app.FragmentManager;
2829
import android.content.Context;
@@ -118,6 +119,10 @@ public static TutorialOptions.Builder<Fragment> newTutorialOptionsBuilder(@NonNu
118119
return TutorialOptions.newTutorialOptionsBuilder(context, Fragment.class);
119120
}
120121

122+
public static TutorialFragment newInstance(@NonNull TutorialOptions tutorialOptions) {
123+
return new TutorialFragmentImpl(tutorialOptions);
124+
}
125+
121126
@Override
122127
public void onCreate(Bundle savedInstanceState) {
123128
super.onCreate(savedInstanceState);
@@ -282,4 +287,28 @@ public int getCount() {
282287
return mTutorialAdapterImpl.getCount();
283288
}
284289
}
290+
291+
public static final class TutorialFragmentImpl extends TutorialFragment {
292+
293+
private TutorialOptions mTutorialOptions;
294+
295+
public TutorialFragmentImpl() {
296+
}
297+
298+
@SuppressLint("ValidFragment")
299+
private TutorialFragmentImpl(@NonNull TutorialOptions tutorialOptions) {
300+
mTutorialOptions = tutorialOptions;
301+
}
302+
303+
@Override
304+
public void onCreate(Bundle savedInstanceState) {
305+
super.onCreate(savedInstanceState);
306+
setRetainInstance(true);
307+
}
308+
309+
@Override
310+
protected TutorialOptions provideTutorialOptions() {
311+
return mTutorialOptions;
312+
}
313+
}
285314
}

lib/src/main/java/com/cleveroad/slidingtutorial/TutorialImpl.java

+19-6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import android.support.annotation.IdRes;
3232
import android.support.annotation.LayoutRes;
3333
import android.support.annotation.NonNull;
34+
import android.support.annotation.Nullable;
3435
import android.support.v4.view.PagerAdapter;
3536
import android.support.v4.view.ViewPager;
3637
import android.view.LayoutInflater;
@@ -46,8 +47,11 @@ final class TutorialImpl<TFragment> {
4647
static final int EMPTY_FRAGMENT_POSITION = -1;
4748

4849
private ViewPager mViewPager;
50+
@Nullable
4951
private View mButtonSkip;
52+
@Nullable
5053
private View mSeparator;
54+
@Nullable
5155
private TutorialPageIndicator mPageIndicator;
5256
private final ArgbEvaluator argbEvaluator = new ArgbEvaluator();
5357
private PagerAdapter mTutorialAdapter;
@@ -60,8 +64,10 @@ final class TutorialImpl<TFragment> {
6064
@Override
6165
public void onChanged() {
6266
super.onChanged();
63-
mPageIndicator.setPagesCount(mTutorialOptions.getPagesCount());
64-
mPageIndicator.postInvalidate();
67+
if (mPageIndicator != null) {
68+
mPageIndicator.setPagesCount(mTutorialOptions.getPagesCount());
69+
mPageIndicator.postInvalidate();
70+
}
6571
}
6672
};
6773

@@ -89,8 +95,12 @@ void onViewCreated(View view, Bundle savedInstanceState) {
8995
mTutorialAdapter = mInternalFragment.getPagerAdapter();
9096
mTutorialAdapter.registerDataSetObserver(mDataSetObservable);
9197
mViewPager.setAdapter(mTutorialAdapter);
92-
mPageIndicator.initWith(mTutorialOptions.getIndicatorOptions(), mTutorialOptions.getPagesCount());
93-
mButtonSkip.setOnClickListener(mTutorialOptions.getOnSkipClickListener());
98+
if (mPageIndicator != null) {
99+
mPageIndicator.initWith(mTutorialOptions.getIndicatorOptions(), mTutorialOptions.getPagesCount());
100+
}
101+
if (mButtonSkip != null) {
102+
mButtonSkip.setOnClickListener(mTutorialOptions.getOnSkipClickListener());
103+
}
94104

95105
if (mTutorialOptions.isUseInfiniteScroll()) {
96106
int pos = Integer.MAX_VALUE / 2;
@@ -117,6 +127,7 @@ void onDestroyView() {
117127
*
118128
* @return line separator view
119129
*/
130+
@SuppressWarnings("NullableProblems")
120131
View getSeparator() {
121132
return mSeparator;
122133
}
@@ -376,8 +387,10 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
376387
}
377388

378389
// ViewPageIndicator callback forward
379-
mPageIndicator.onPageScrolled(position % mTutorialOptions.getPagesCount(),
380-
positionOffset, mTutorialOptions.isUseInfiniteScroll());
390+
if (mPageIndicator != null) {
391+
mPageIndicator.onPageScrolled(position % mTutorialOptions.getPagesCount(),
392+
positionOffset, mTutorialOptions.isUseInfiniteScroll());
393+
}
381394
}
382395

383396
/**

lib/src/main/java/com/cleveroad/slidingtutorial/TutorialOptions.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public final static class Builder<TFragment> {
132132
private ViewPager.PageTransformer mPageTransformer;
133133

134134
private Builder(@NonNull Context context, Class<TFragment> aClass) {
135-
mContext = ValidationUtil.checkNotNull(context);
135+
mContext = ValidationUtil.checkNotNull(context).getApplicationContext();
136136
mClass = aClass;
137137
}
138138

@@ -216,7 +216,7 @@ public Builder<TFragment> setPagesColors(@NonNull int[] pagesColors) {
216216
* @param onSkipClickListener instance {@link android.view.View.OnClickListener}
217217
* @return current {@link Builder}
218218
*/
219-
public Builder<TFragment> onSkipClickListener(@NonNull View.OnClickListener onSkipClickListener) {
219+
public Builder<TFragment> setOnSkipClickListener(@NonNull View.OnClickListener onSkipClickListener) {
220220
mOnSkipClickListener = onSkipClickListener;
221221
return this;
222222
}
@@ -299,7 +299,7 @@ public Builder<TFragment> setPageTransformer(ViewPager.PageTransformer pageTrans
299299
*/
300300
public TutorialOptions build() {
301301
if (mIndicatorOptions == null) {
302-
mIndicatorOptions = IndicatorOptions.provideDefault(mContext);
302+
mIndicatorOptions = IndicatorOptions.newBuilder(mContext).build();
303303
}
304304
return TutorialOptions.create(this);
305305
}

lib/src/main/java/com/cleveroad/slidingtutorial/TutorialPageIndicator.java

+15-10
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,11 @@ public final class TutorialPageIndicator extends View implements TutorialImpl.In
4444
private static final float ANGLE_360 = 360f;
4545

4646
static final int NO_VALUE = -1;
47-
static final int DEFAULT_VALUE = 0;
4847
static final int NO_COLOR = 1;
4948
@ColorInt
50-
static final int DEFAULT_COLOR = Color.RED;
49+
static final int DEFAULT_ELEMENT_COLOR = Color.LTGRAY;
50+
@ColorInt
51+
static final int DEFAULT_SELECTED_ELEMENT_COLOR = Color.WHITE;
5152

5253
private final RectF mClipBounds = new RectF();
5354
private final RectF mElementBounds = new RectF();
@@ -62,20 +63,28 @@ public final class TutorialPageIndicator extends View implements TutorialImpl.In
6263
private boolean mIsInfiniteScroll;
6364

6465
public TutorialPageIndicator(Context context) {
65-
super(context);
66+
this(context, null);
6667
}
6768

6869
public TutorialPageIndicator(Context context, AttributeSet attrs) {
69-
super(context, attrs);
70+
this(context, attrs, 0);
7071
}
7172

7273
public TutorialPageIndicator(Context context, AttributeSet attrs, int defStyleAttr) {
7374
super(context, attrs, defStyleAttr);
75+
initDefaultSizes(context);
76+
7477
}
7578

7679
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
7780
public TutorialPageIndicator(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
7881
super(context, attrs, defStyleAttr, defStyleRes);
82+
initDefaultSizes(context);
83+
}
84+
85+
private void initDefaultSizes(@NonNull Context context) {
86+
mIndicatorElementSize = context.getResources().getDimension(R.dimen.st_indicator_size_default);
87+
mIndicatorElementSpacing = context.getResources().getDimension(R.dimen.st_indicator_spacing_default);
7988
}
8089

8190
void initWith(@NonNull IndicatorOptions indicatorOptions, int pagesCount) {
@@ -84,7 +93,7 @@ void initWith(@NonNull IndicatorOptions indicatorOptions, int pagesCount) {
8493
if (indicatorOptions.getElementColor() != NO_COLOR) {
8594
elementColor = indicatorOptions.getElementColor();
8695
} else {
87-
elementColor = TutorialPageIndicator.DEFAULT_COLOR;
96+
elementColor = TutorialPageIndicator.DEFAULT_ELEMENT_COLOR;
8897
}
8998
mIndicatorPaint.setColor(elementColor);
9099

@@ -93,20 +102,16 @@ void initWith(@NonNull IndicatorOptions indicatorOptions, int pagesCount) {
93102
if (indicatorOptions.getSelectedElementColor() != NO_COLOR) {
94103
selectedElementColor = indicatorOptions.getSelectedElementColor();
95104
} else {
96-
selectedElementColor = TutorialPageIndicator.DEFAULT_COLOR;
105+
selectedElementColor = TutorialPageIndicator.DEFAULT_SELECTED_ELEMENT_COLOR;
97106
}
98107
mIndicatorSelectedPaint.setColor(selectedElementColor);
99108

100109
if (indicatorOptions.getElementSize() != NO_VALUE) {
101110
mIndicatorElementSize = indicatorOptions.getElementSize();
102-
} else {
103-
mIndicatorElementSize = DEFAULT_VALUE;
104111
}
105112

106113
if (indicatorOptions.getElementSpacing() != NO_VALUE) {
107114
mIndicatorElementSpacing = indicatorOptions.getElementSpacing();
108-
} else {
109-
mIndicatorElementSpacing = DEFAULT_VALUE;
110115
}
111116

112117
if (indicatorOptions.getRenderer() != null) {

0 commit comments

Comments
 (0)