Skip to content
This repository was archived by the owner on Aug 22, 2020. It is now read-only.

Commit 1ab2900

Browse files
committed
Support Kotlin
Signed-off-by: Fung Gwo <[email protected]>
1 parent 9128947 commit 1ab2900

27 files changed

+813
-16
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
buildscript {
2+
ext.kotlin_version = '1.2.21'
23
repositories {
34
jcenter()
45
}
56
dependencies {
67
classpath 'com.android.tools.build:gradle:3.0.1'
8+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
79
}
810
}
911

demo-kotlin/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

demo-kotlin/build.gradle

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
apply plugin: 'com.android.application'
2+
apply plugin: 'kotlin-android'
3+
4+
android {
5+
compileSdkVersion rootProject.ext.targetSdkVersion
6+
buildToolsVersion rootProject.ext.buildToolsVersion
7+
8+
defaultConfig {
9+
minSdkVersion rootProject.ext.minSdkVersion
10+
targetSdkVersion rootProject.ext.targetSdkVersion
11+
versionCode rootProject.ext.versionCode
12+
versionName rootProject.ext.versionName
13+
applicationId "moe.feng.common.stepperview.demo"
14+
15+
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
16+
}
17+
buildTypes {
18+
release {
19+
minifyEnabled false
20+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
21+
}
22+
}
23+
sourceSets {
24+
main {
25+
java.srcDirs += 'src/main/kotlin'
26+
}
27+
}
28+
}
29+
30+
dependencies {
31+
implementation fileTree(dir: 'libs', include: ['*.jar'])
32+
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
33+
exclude group: 'com.android.support', module: 'support-annotations'
34+
})
35+
testImplementation 'junit:junit:4.12'
36+
37+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
38+
implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
39+
implementation "com.android.support:design:$supportLibraryVersion"
40+
implementation "com.android.support:customtabs:$supportLibraryVersion"
41+
implementation 'moe.feng:AlipayZeroSdk:1.1'
42+
implementation project(':library')
43+
}

demo-kotlin/proguard-rules.pro

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Add project specific ProGuard rules here.
2+
# You can control the set of applied configuration files using the
3+
# proguardFiles setting in build.gradle.
4+
#
5+
# For more details, see
6+
# http://developer.android.com/guide/developing/tools/proguard.html
7+
8+
# If your project uses WebView with JS, uncomment the following
9+
# and specify the fully qualified class name to the JavaScript interface
10+
# class:
11+
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12+
# public *;
13+
#}
14+
15+
# Uncomment this to preserve the line number information for
16+
# debugging stack traces.
17+
#-keepattributes SourceFile,LineNumberTable
18+
19+
# If you keep the line number information, uncomment this to
20+
# hide the original source file name.
21+
#-renamesourcefileattribute SourceFile
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package moe.feng.common.stepperview.demo;
2+
3+
import android.content.Context;
4+
import android.support.test.InstrumentationRegistry;
5+
import android.support.test.runner.AndroidJUnit4;
6+
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
10+
import static org.junit.Assert.*;
11+
12+
/**
13+
* Instrumented test, which will execute on an Android device.
14+
*
15+
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
16+
*/
17+
@RunWith(AndroidJUnit4.class)
18+
public class ExampleInstrumentedTest {
19+
@Test
20+
public void useAppContext() throws Exception {
21+
// Context of the app under test.
22+
Context appContext = InstrumentationRegistry.getTargetContext();
23+
24+
assertEquals("moe.feng.common.stepperview.demo", appContext.getPackageName());
25+
}
26+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="moe.feng.common.stepperview.demo">
3+
4+
<application
5+
android:allowBackup="true"
6+
android:icon="@mipmap/ic_launcher"
7+
android:label="@string/app_name"
8+
android:roundIcon="@mipmap/ic_launcher_round"
9+
android:supportsRtl="true"
10+
android:theme="@style/AppTheme">
11+
<activity android:name=".MainActivity" android:configChanges="screenSize|orientation">
12+
<intent-filter>
13+
<action android:name="android.intent.action.MAIN"/>
14+
15+
<category android:name="android.intent.category.LAUNCHER"/>
16+
</intent-filter>
17+
</activity>
18+
</application>
19+
</manifest>
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package moe.feng.common.stepperview.demo
2+
3+
import android.app.AlertDialog
4+
import android.net.Uri
5+
import android.os.Bundle
6+
import android.support.customtabs.CustomTabsIntent
7+
import android.support.design.widget.NavigationView
8+
import android.support.v4.app.Fragment
9+
import android.support.v4.widget.DrawerLayout
10+
import android.support.v7.app.AppCompatActivity
11+
import android.view.MenuItem
12+
13+
import moe.feng.alipay.zerosdk.AlipayZeroSdk
14+
import moe.feng.common.stepperview.demo.fragment.VerticalStepperAdapterDemoFragment
15+
import moe.feng.common.stepperview.demo.fragment.VerticalStepperDemoFragment
16+
17+
class MainActivity : AppCompatActivity() {
18+
19+
private lateinit var mDrawerLayout: DrawerLayout
20+
private lateinit var mNavigationView: NavigationView
21+
22+
private val mVerticalStepperDemoFragment = VerticalStepperDemoFragment()
23+
private val mVerticalStepperAdapterDemoFragment = VerticalStepperAdapterDemoFragment()
24+
25+
override fun onCreate(savedInstanceState: Bundle?) {
26+
super.onCreate(savedInstanceState)
27+
setContentView(R.layout.activity_main)
28+
29+
setSupportActionBar(findViewById(R.id.toolbar))
30+
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp)
31+
supportActionBar?.setDisplayHomeAsUpEnabled(true)
32+
33+
mDrawerLayout = findViewById(R.id.drawer_layout)
34+
35+
mNavigationView = findViewById(R.id.navigation_view)
36+
mNavigationView.setNavigationItemSelectedListener(this::onNavigationItemSelected)
37+
38+
if (savedInstanceState == null) {
39+
supportFragmentManager.beginTransaction()
40+
.replace(R.id.container, mVerticalStepperDemoFragment).commit()
41+
}
42+
}
43+
44+
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
45+
android.R.id.home -> {
46+
if (mDrawerLayout.isDrawerOpen(mNavigationView)) {
47+
mDrawerLayout.closeDrawer(mNavigationView)
48+
} else {
49+
mDrawerLayout.openDrawer(mNavigationView)
50+
}
51+
true
52+
}
53+
else -> false
54+
}
55+
56+
private fun onNavigationItemSelected(item: MenuItem): Boolean {
57+
mDrawerLayout.closeDrawer(mNavigationView)
58+
when (item.itemId) {
59+
R.id.item_vertical_stepper -> {
60+
replaceFragment(mVerticalStepperDemoFragment)
61+
return true
62+
}
63+
R.id.item_vertical_stepper_adapter -> {
64+
replaceFragment(mVerticalStepperAdapterDemoFragment)
65+
return true
66+
}
67+
R.id.action_alipay_donate -> {
68+
if (AlipayZeroSdk.hasInstalledAlipayClient(this)) {
69+
AlipayZeroSdk.startAlipayClient(this, "aehvyvf4taua18zo6e")
70+
} else {
71+
AlertDialog.Builder(this)
72+
.setTitle(R.string.donate_dialog_title)
73+
.setMessage(R.string.donate_dialog_message)
74+
.setPositiveButton(android.R.string.ok, null)
75+
.setNeutralButton(R.string.doante_dialog_paypal_button) { _, _ ->
76+
openWebsite("https://paypal.me/fython")
77+
}
78+
.show()
79+
}
80+
return true
81+
}
82+
R.id.action_fork_on_github -> {
83+
openWebsite("https://github.com/fython/MaterialStepperView")
84+
return true
85+
}
86+
else -> return false
87+
}
88+
}
89+
90+
private fun replaceFragment(fragment: Fragment) {
91+
supportFragmentManager.beginTransaction().replace(R.id.container, fragment).commit()
92+
}
93+
94+
private fun openWebsite(url: String) {
95+
val builder = CustomTabsIntent.Builder()
96+
builder.setToolbarColor(resources.getColor(R.color.colorPrimary))
97+
builder.build().launchUrl(this, Uri.parse(url))
98+
}
99+
100+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package moe.feng.common.stepperview.demo.fragment
2+
3+
import android.content.Context
4+
import android.os.Bundle
5+
import android.support.design.widget.Snackbar
6+
import android.support.v4.app.Fragment
7+
import android.text.Html
8+
import android.view.LayoutInflater
9+
import android.view.View
10+
import android.view.ViewGroup
11+
import android.widget.Button
12+
import android.widget.TextView
13+
14+
import moe.feng.common.stepperview.IStepperAdapter
15+
import moe.feng.common.stepperview.VerticalStepperItemView
16+
import moe.feng.common.stepperview.VerticalStepperView
17+
import moe.feng.common.stepperview.demo.R
18+
19+
class VerticalStepperAdapterDemoFragment : Fragment(), IStepperAdapter {
20+
21+
private lateinit var mVerticalStepperView: VerticalStepperView
22+
23+
override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup?, savedInstanceState: Bundle?): View? {
24+
return inflater.inflate(R.layout.fragment_vertical_stepper_adapter, parent, false)
25+
}
26+
27+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
28+
mVerticalStepperView = view.findViewById(R.id.vertical_stepper_view)
29+
mVerticalStepperView.stepperAdapter = this
30+
}
31+
32+
override fun getTitle(index: Int) = "Step $index"
33+
34+
override fun getSummary(index: Int): CharSequence? = when (index) {
35+
0 -> Html.fromHtml("Summarized if needed" + if (mVerticalStepperView.currentStep > index) "; <b>isDone!</b>" else "")
36+
2 -> Html.fromHtml("Last step" + if (mVerticalStepperView.currentStep > index) "; <b>isDone!</b>" else "")
37+
else -> null
38+
}
39+
40+
override fun size() = 3
41+
42+
override fun onCreateCustomView(index: Int, context: Context, parent: VerticalStepperItemView): View {
43+
val inflateView = LayoutInflater.from(context).inflate(R.layout.vertical_stepper_sample_item, parent, false)
44+
val contentView = inflateView.findViewById<TextView>(R.id.item_content)
45+
contentView.setText(
46+
when (index) {
47+
0 -> R.string.content_step_0
48+
1 -> R.string.content_step_1
49+
else -> R.string.content_step_2
50+
}
51+
)
52+
val nextButton = inflateView.findViewById<Button>(R.id.button_next)
53+
nextButton.text = if (index == size() - 1) "Set error text" else getString(android.R.string.ok)
54+
nextButton.setOnClickListener {
55+
if (!mVerticalStepperView.nextStep()) {
56+
mVerticalStepperView.setErrorText(0, if (mVerticalStepperView.getErrorText(0) == null) "Test error" else null)
57+
Snackbar.make(mVerticalStepperView, "Set!", Snackbar.LENGTH_LONG).show()
58+
}
59+
}
60+
val prevButton = inflateView.findViewById<Button>(R.id.button_prev)
61+
prevButton.setText(if (index == 0) R.string.toggle_animation_button else android.R.string.cancel)
62+
inflateView.findViewById<View>(R.id.button_prev).setOnClickListener {
63+
if (index != 0) {
64+
mVerticalStepperView.prevStep()
65+
} else {
66+
mVerticalStepperView.isAnimationEnabled = !mVerticalStepperView.isAnimationEnabled
67+
}
68+
}
69+
return inflateView
70+
}
71+
72+
override fun onShow(index: Int) {
73+
74+
}
75+
76+
override fun onHide(index: Int) {
77+
78+
}
79+
80+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package moe.feng.common.stepperview.demo.fragment
2+
3+
import android.os.Bundle
4+
import android.support.design.widget.Snackbar
5+
import android.support.v4.app.Fragment
6+
import android.view.LayoutInflater
7+
import android.view.View
8+
import android.view.ViewGroup
9+
import android.widget.Button
10+
11+
import moe.feng.common.stepperview.VerticalStepperItemView
12+
import moe.feng.common.stepperview.demo.R
13+
14+
class VerticalStepperDemoFragment : Fragment() {
15+
16+
private val mSteppers = arrayOfNulls<VerticalStepperItemView>(3)
17+
private lateinit var mNextBtn0: Button
18+
private lateinit var mNextBtn1: Button
19+
private lateinit var mPrevBtn1: Button
20+
private lateinit var mNextBtn2: Button
21+
private lateinit var mPrevBtn2: Button
22+
23+
private var mActivatedColorRes = R.color.material_blue_500
24+
private var mDoneIconRes = R.drawable.ic_done_white_16dp
25+
26+
override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup?, savedInstanceState: Bundle?): View? {
27+
return inflater.inflate(R.layout.fragment_vertical_stepper, parent, false)
28+
}
29+
30+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
31+
mSteppers[0] = view.findViewById(R.id.stepper_0)
32+
mSteppers[1] = view.findViewById(R.id.stepper_1)
33+
mSteppers[2] = view.findViewById(R.id.stepper_2)
34+
35+
VerticalStepperItemView.bindSteppers(*mSteppers)
36+
37+
mNextBtn0 = view.findViewById(R.id.button_next_0)
38+
mNextBtn0.setOnClickListener { mSteppers[0]?.nextStep() }
39+
40+
view.findViewById<View>(R.id.button_test_error).setOnClickListener {
41+
if (mSteppers[0]?.errorText != null) {
42+
mSteppers[0]?.errorText = null
43+
} else {
44+
mSteppers[0]?.errorText = "Test error!"
45+
}
46+
}
47+
48+
mPrevBtn1 = view.findViewById(R.id.button_prev_1)
49+
mPrevBtn1.setOnClickListener { mSteppers[1]?.prevStep() }
50+
51+
mNextBtn1 = view.findViewById(R.id.button_next_1)
52+
mNextBtn1.setOnClickListener { mSteppers[1]?.nextStep() }
53+
54+
mPrevBtn2 = view.findViewById(R.id.button_prev_2)
55+
mPrevBtn2.setOnClickListener { mSteppers[2]?.prevStep() }
56+
57+
mNextBtn2 = view.findViewById(R.id.button_next_2)
58+
mNextBtn2.setOnClickListener {
59+
Snackbar.make(view, "Finish!", Snackbar.LENGTH_LONG).show()
60+
}
61+
62+
view.findViewById<View>(R.id.btn_change_point_color).setOnClickListener {
63+
mActivatedColorRes = if (mActivatedColorRes == R.color.material_blue_500) {
64+
R.color.material_deep_purple_500
65+
} else {
66+
R.color.material_blue_500
67+
}
68+
for (stepper in mSteppers) {
69+
stepper?.setActivatedColorResource(mActivatedColorRes)
70+
}
71+
}
72+
view.findViewById<View>(R.id.btn_change_done_icon).setOnClickListener {
73+
mDoneIconRes = if (mDoneIconRes == R.drawable.ic_done_white_16dp) {
74+
R.drawable.ic_save_white_16dp
75+
} else {
76+
R.drawable.ic_done_white_16dp
77+
}
78+
for (stepper in mSteppers) {
79+
stepper?.setDoneIconResource(mDoneIconRes)
80+
}
81+
}
82+
}
83+
84+
}

0 commit comments

Comments
 (0)